MyException - 我的异常网
当前位置:我的异常网» C++ » [百度分享]用户态线程库(2)解决方法

[百度分享]用户态线程库(2)解决方法

www.MyException.Cn  网友分享于:2013-02-08  浏览:30次
[百度分享]用户态线程库(2)
异步 
先来看看一个基本的异步程序是如何实现, 这里以aio为例 
C/C++ code
 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,锁和系统调用。 
不同的任务分成多个线程池也是考虑避免某个特殊的任务把线程堵塞住。

------解决方案--------------------
lz辛苦了。。。。
------解决方案--------------------
接分,,,,,,,,,,,,,,,,
------解决方案--------------------
学习了
------解决方案--------------------
学习~
------解决方案--------------------
定了

定了

定了

定了

定了

定了

------解决方案--------------------
是太深奥了还是放暑假去了没人顶啊?

------解决方案--------------------
好东西。不过你上面的代码,看得不太懂,可以传一份到我邮箱里去不?55831464@qq.com
------解决方案--------------------
真是太深奥了 看不懂呢

------解决方案--------------------
学习了。。
------解决方案--------------------
嗯 多谢楼主分享
------解决方案--------------------
要 好 好 努 力 啊 !
------解决方案--------------------
接分!!!!!!
------解决方案--------------------
我是来学习的,
------解决方案--------------------
lz辛苦了。。。。
------解决方案--------------------
辛苦了~
------解决方案--------------------
学习了!谢谢!
------解决方案--------------------

文章评论

漫画:程序员的工作
漫画:程序员的工作
鲜为人知的编程真相
鲜为人知的编程真相
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
代码女神横空出世
代码女神横空出世
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
一个程序员的时间管理
一个程序员的时间管理
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
 程序员的样子
程序员的样子
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
10个调试和排错的小建议
10个调试和排错的小建议
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员必看的十大电影
程序员必看的十大电影
中美印日四国程序员比较
中美印日四国程序员比较
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
我的丈夫是个程序员
我的丈夫是个程序员
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
如何成为一名黑客
如何成为一名黑客
Java程序员必看电影
Java程序员必看电影
我是如何打败拖延症的
我是如何打败拖延症的
旅行,写作,编程
旅行,写作,编程
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员的鄙视链
程序员的鄙视链
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
那些争议最大的编程观点
那些争议最大的编程观点
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员和编码员之间的区别
程序员和编码员之间的区别
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
编程语言是女人
编程语言是女人
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有