当前位置:  技术问答>linux和unix

[百度分享]用户态线程库 (三)

    来源: 互联网  发布时间:2016-09-13

    本文导语:  可控制的异步调用  在用户态的线程库中,我们可以采用同步思维方式写出等价于异步效果的程序,并且在性能提升方面占有一定的优势.  一方面可以付出一定的内存开销(异步条件上下文完全通过内存池维护空间会小一些)开辟...

可控制的异步调用 
在用户态的线程库中,我们可以采用同步思维方式写出等价于异步效果的程序,并且在性能提升方面占有一定的优势. 
一方面可以付出一定的内存开销(异步条件上下文完全通过内存池维护空间会小一些)开辟出更多的线程(几十W级别规模), 另一方面编程模式不会发生太大的改变 
计算异步化 
这里主要是考虑,类似 GPU或者数据压缩卡这样的计算模式, 将一部分的计算拿出去进行计算, CPU可以继续进行其他工作,从而短时间内处理更多的工作。 
网络IO异步化 
网络IO的一个特点就是在多路复用的情况下占有一定的优势, 可以不用大量的select时间来等待IO可读可写。在协程中如果仅仅是简单的采用我们的同步IO 会给程序带来灾难。 出现前面提到的 快速的程序越快,慢的程序越慢,响应事件时间的差距变大 
 1 do { 2     //非堵塞读数据 3     if (数据没有读完) { 4         yield() 5     } 6     while ( 
7     //数据没读完 8     ) 9     //切换后10     //epoll_wait 等待句柄激活11     //激活的调度12     if (fd 激活) {13         //上下文件切换到 fd对应的地方运行14     }
磁盘IO异步化 
与网络IO有所不同, 磁盘IO有一定的特殊性 
多线程的同时写不能有效的提高写的速度,无论是否使用dio 
多线程读磁盘, 由于受到缓存,电梯调度的一些影响, 往往是可以有一定提高的。 
多线程读写的情况下往往会用 pwrite, pread 来指定写的位置, 除非是不关心顺序问题 
针对这几点,在处理上可以采用下面的方式 
对于真正的IO读取任务,调用较多的真实线程来处理, 而对于写IO, 相同的fd 可以集中处理,甚至是在最后写的时候统一采用writev机制。 
这里包括几个方面 
 1 while (task_q.empyt()) { 2      3     task = task_q.pop() 4     if (task 是写IO) { 5         //量小可以不切换直接当场处理 6         //task 按照fd 取mod 放入 磁盘写处理线程 7         //获取管道,监听成功结果 8     } 9     10     if (task 是读IO) {11         //task 放入 磁盘读处理线程12         //获取管道,监听成功结果13     }14 }
IO写 
1 foreach fd {2     foreach pwrite fd {3         //判断是否有连续的,如果存在可以减少调用4     }5     foreach write fd {6         //一次writev操作7     }8     9 }
IO读也是类似的 

 1 foreach fd { 2     foreach pread fd { 3         //判断是否有连续的,如果存在可以减少调用 4     } 5      6     foreach read fd { 7         //一次readv操作 8     } 9 }
这里只是简单的考虑磁盘IO在协程条件下的处理考虑, 这里IO也是作为一种调度策略存在。 如果是SSD硬盘, 可能更多情况下不需要调度直接处理更合适。 
应用上的考虑 
框架层面上的支持 
在ub这样的编程框架中支持, 通过配置进行切换, 直接在同步模型下进行替换.只不过这里需要通过IO函数替换来实现 
比如: 
ul_sreado_ex2 需要改造成下面的样子: 
1 do {2     //非堵塞读数据3     if (
4 //数据没有读完
5 ) {6      yield()7     }8     while (
9 //数据没读完
10 )

通过对于这些函数的替换基本就可以实现同步IO想异步IO的切换,从而表现出现异步的样子. 
另外一种方式就是直接替换系统调用,让用户无缝升级, 最简单的方式就是直接替换glibc中的对应的函数接口。但这种接管的代价会比较大,而且容易出错。 

|
名人的技术分享都木人顶

|
CSDN可耻的跟百毒这垃圾玩意合作了吗?

|
顶  顶 


结帖率:0.00% ????

|
看看先

    
 
 

您可能感兴趣的文章:

  • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
  • Java多线程yield心得分享
  • JAVA实现多线程的两种方法实例分享
  • java信号量控制线程打印顺序的示例分享
  • C#利用子线程刷新主线程分享教程
  • android使用多线程更新ui示例分享
  • 线程安全的单例模式的几种实现方法分享
  • [百度分享]用户态线程库 (一)
  • .net重启iis线程池和iis站点程序代码分享
  • [百度分享]用户态线程库 (二)
  • C#中跨线程访问控件问题解决方案分享
  • [百度分享]linux线程同步浅析 - 睡眠与唤醒的秘密
  • winform开发使用通用多线程基类分享(以队列形式)
  • c#多线程网络聊天程序代码分享(服务器端和客户端)
  • 杀掉oracle在线用户脚本分享
  • oracle创建删除用户示例分享(oracle删除用户命令及授权)
  • c#通过进程调用cmd判断登录用户权限代码分享
  • java用户名密码验证示例代码分享
  • Java中用户向系统传递参数的三种基本方式实例分享
  • 实现shell终端代码分享(可用户登录 实现系统命令)
  • mysql命令行下用户管理方法分享
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ​docker之轻量虚拟化技术——docker实战分享
  • php利用腾讯ip分享计划获取地理位置示例分享
  • 点对点文件分享客户端 PeerProject
  • 网络文件分享 Giver
  • 谁有免费的英文Office2003(日文也成)分享一下吧! iis7站长之家
  • P2P分享软件 Alliance P2P
  • 文件分享软件 eMule Plus
  • P2P 文件分享软件 ShakesPeer
  • 分享页面内容插件 ContentShare
  • 社交分享按钮生成JS库 Socialite.js
  • P2P分享软件 Phex
  • 前端代码编辑和分享平台 RunJS
  • jQuery 分享按钮插件 Share Button
  • 昨天考过SCJP快乐大家分享
  • P2P文件分享 GNUnet
  • 响应式社交分享按钮 RRSSB
  • 谁有免费的英文Office2003(日文也成)分享一下吧!
  • 谁有qmail的日常维护,日志分析的资料分享下?
  • 代码分享
  • 谁有xml和libxml2的说明文档,分享一下吧
  • Java代码分享工具 Java Gems


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3