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

rethee 2010-07-26 10:49:36
加精
异步
先来看看一个基本的异步程序是如何实现, 这里以aio为例
 struct aiocb *aiocbp = new aiocb; 
memset(aiocbp, 0, sizeof(aiocb));
aiocbp->;aio_fildes = fd;
aiocbp->;aio_buf = write_buffer;
aiocbp->;aio_nbytes = write_buffer_size;
aiocbp->;aio_sigevent.sigev_notify = SIGEV_THREAD;
aiocbp->;aio_sigevent.notify_function = aio_callback;
aiocbp->;aio_sigevent.notify_attributes = NULL;
aiocbp->;aio_sigevent.sigev_value.sival_ptr = aiocbp10
aio_write(aiocbp);

....

这 里aio调用发起后,程序处理io, io结束之后会调用aio_callback进行返回
aiocbp 本身以及一些变量都需要自己去记录和填写, 而且不能分配在栈上, 必须要注意相应的内存管理, 在callback中需要记的把aiocbp释放掉, 这样就需要注意在aio_write之后不能使用aiocbp
这里只是一个buffer, 如果我们复杂一些,处理一个nshead请求, 那么这里的逻辑就变的很复杂, 需要在callback再度发起一次aio处理
若程序的整个流程都按照异步的情况来处理那么可以看到,我们的业务逻辑是一个支离破碎的过程, 特别是对于一些小的流程处理,我们也必须要做这样的细致拆分
其实这里还有一个问题就是默认系统中的aio是伪异步IO, 只是后台多线程模拟的异步IO处理, 这种处理对于磁盘IO可能问题还不大, 但是对于网络IO在调度和线程切换上不仅不会优于同步情况,而且还带来更大的性能开销。
一般来说异步的基本模型如下


有多个线程池,每个池处理不同的任务, 每个任务间采用事件驱动的方式来进行控制。当发现需要处理单独的任务的时候才激活,放到对应的线程池中去运行
IO, CPU等操作都独立出来, 进行IO的时候,会主动切换到另外处理CPU的任务上, 等那边IO处理完毕会激活另外的事件回调进行处理。整个成为一个流水线式的作业,每个线程等待堵塞的地方都很少,一定程度上减少了上下文开销,可以进一步提高CPU的利用效率. 在ub 事件模型中采用的就是这种方式
这样带来的一些好处
对于每个任务而言, 一般线程数都很少,锁的影响很小
处理IO不会堵塞,任务处理不和线程绑定,可以同时处理大量的请求
但带来的最大问题就编程的复杂性。
虽然一定程序度上这种异步的事件驱动模式更复合基本的状态机模型, 但是对于一些很简单的应用都要拆分成这么多不同阶段的任务,对于人的思维也是很不直观的。
另外一个方面就是由于存在队列的情况, 处理任务会出现 快的很快, 慢的很慢, 这对于实时任务来说是不接受
举个例子:
任务1在 一个有4个线程对应4个CPU的线程池中运行, 来了5个任务, 那么第5个操作必须在前4个操作完成之后再进行. 这样在外部请求看来第5个任务花的时间是2倍的时间. 对于重吞吐的程序来说, 由于少了一些开销可以提高性能, 但是对于实时要求的程序来说,这个时候可能更希望前4个任务每个多花一点时间,使得第5个任务可以快一些完成,将单个请求花的时间平摊掉.
不过上面的模型来处理我们实时要求高的业务,一般情况下也没有什么问题, 主要是我们一般请求处理的速度都是很快, CPU的时间片是百ms级,如果CPU没有占用超过100ms的时间, 其实是不会发生着这种主动切换的。我们切换多的地方主要还是各种IO,锁和系统调用。
不同的任务分成多个线程池也是考虑避免某个特殊的任务把线程堵塞住。
...全文
1664 68 打赏 收藏 转发到动态 举报
写回复
用AI写文章
68 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2010-08-25
  • 打赏
  • 举报
回复
百度VIP是啥东西。
hutc_2008 2010-08-25
  • 打赏
  • 举报
回复
lz辛苦了。。。。
chase_beauty 2010-08-20
  • 打赏
  • 举报
回复
领教了!
CBACB 2010-08-03
  • 打赏
  • 举报
回复
学习学习一下下啦,顶
stinky154 2010-08-03
  • 打赏
  • 举报
回复
加油努力,接分
liuyong19832004 2010-08-02
  • 打赏
  • 举报
回复
进来学习下,呵呵
littlecardan 2010-08-02
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
blpluto 2010-08-02
  • 打赏
  • 举报
回复
打个酱油~~~
footman2046 2010-08-02
  • 打赏
  • 举报
回复
提个问题:最后举例中,为什么任务5要=前4个任务都完成了才会进行呢,为什么不是某个线程空闲时就进行呢?
dckim 2010-08-02
  • 打赏
  • 举报
回复
学习学习~
mehere8 2010-08-01
  • 打赏
  • 举报
回复
看看 学习。。。。。。。。。。。。。。。。
division 2010-08-01
  • 打赏
  • 举报
回复
接分O(∩_∩)O~
xiexienideai12 2010-07-31
  • 打赏
  • 举报
回复
不太明白 看不太懂
wofa1648 2010-07-31
  • 打赏
  • 举报
回复
不错,支持
KennyLonng 2010-07-31
  • 打赏
  • 举报
回复
深奥~~~~~~·
NIKE霸天虎 2010-07-31
  • 打赏
  • 举报
回复
不太明白 看不太懂
ssssbbbb001 2010-07-31
  • 打赏
  • 举报
回复
这也太难了吧 希望自己好好学 也能写出
Callsin 2010-07-30
  • 打赏
  • 举报
回复
真是百度技术?
FOXHENGXING 2010-07-30
  • 打赏
  • 举报
回复
路过看看
qq7747521 2010-07-30
  • 打赏
  • 举报
回复
恩,呵呵定起
加载更多回复(35)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧