同步异步阻塞非阻塞


----------------
1.程序,用户空间,内核,系统空间
应用程序从用户空间取数据,内核把数据放到系统空间,再从系统空间复制到用户空间。
流程是:A应用->B系统调用->C内核->D数据到系统空间->E系统空间复制到用户空间->F 应用从用户空间取。
------------------
2.同步异步、阻塞非阻塞
必须强调:"同步异步"与"阻塞非阻塞"是两码事儿,因此场景共有同步阻塞,同步非阻塞,异步阻塞,异步非阻塞 四个。
--------------------------
3.read(),select(),poll(),epoll(),aio_read()。
同步:只用read(),而read()自己能够置为阻塞模式,则此时为同步阻塞。置为非阻塞模式,则此时为同步非阻塞。
异步:先调read()或aio_read(),再调selelct()或poll()或epoll()
          异步阻塞:首先是调read()且置为非阻塞 ,而后调用select()或poll(),之因此叫异步阻塞,是由于select()或poll()是阻塞的!
          异步非阻塞:首先是调aio_read(),而后调epoll(),epoll()是非阻塞的。 
-----------------------
 4.问一:那到底啥是阻塞非阻塞??问二:到底谁调read()???问三:为啥异步阻塞还要先调个非阻塞的read()????冷静。
阻塞:线程被挂起,啥也干不了了。
非阻塞,线程能干别的,不过干别的事时要不停的回来检查数据到底取好没。
我去银行取钱
阻塞:我去大厅取钱,我只能取钱,我等着钱拿出来前不能抽烟。
非阻塞:我去大厅取钱,我等着钱拿出来前我还打扑克。固然得不停的看着点,钱出来没,我是来取钱的。
             因此,若是钱是数据,那么read()是取钱,当read()置为阻塞时,我只能等着。当read()置为非阻塞时,我打会扑克,打十秒钟问问钱出来没,没出来继续打扑克。注意,银行就是系统空间,银行把钱从系统空间放到我手里,个人手就是用户空间,我就             是程序,我花钱只容许从本身手里拿(即1中的F)。因而1中的流程可理解为,A我->B喊银行给我钱->CD银行钱搞出来->E放我手里-             >F我随便花
             能够发现不管如何,CD这两步的控制及花费的时间,我虽然能够不关心不控制,但我必须在此处等着。而所谓阻塞非阻塞,就是             在我等着这段时间我是否容许打扑克。
答一:到底啥是阻塞非阻塞??答:阻塞:我用read()要钱,若read()置为阻塞模式,那么我在等内核搞数据的CD这两步时,啥都不让我             干,干等。若read()置为非阻塞模式,那么我再等内核搞数据的CD这两步时,我打扑克,隔几秒钟问问内核数据好没好呀,钱还没来吗。
             因此阻塞非阻塞是针对我在必需要等待CD的这段时间,个人行为是否受限制,我是否被挂起,线程是否被挂起。
答二:因此谁调read()???答:我。
答三:但是为啥异步阻塞还要先调个非阻塞的read()????答:额,我知道阻塞非阻塞,那异步是什么东西?
同步:应用程序本身等待数据
异步:应用程序能够处理其余业务,让另外一段程序帮本身等待数据。
我仍是去银行取钱
同步:我去大厅叫号,我脱不开身,万一走了个人号过了,再回来须要从新排队。我不能走!
异步:我去大厅叫号,可是找一哥们帮我排着,我先去外面马路上打几个路灯,号到了哥们给我电话。
同步阻塞:我(程序) 取钱(调用read),read置为阻塞模式,我干等(线程被挂起)。
同步非阻塞:我(程序) 取钱(调用read),read置为非阻塞模式,我打扑克几秒钟问问钱好没(线程未被挂起,处理其余逻辑时,不停的询问                      监控数据是否已到用户空间,若是内核返回EAGAIN/EWOULDBLOCK,那么继续询问,直到ok)。
异步阻塞:我(程序)取钱(调read),注意,我要出去打路灯了,我要我哥们帮我排号,若是read是阻塞模式,那么我被挂起,啥也干不了,连叫哥们都不行。因此read首先是非阻塞模式,即我能够干点啥事,只不过我干的这事再也不是打扑克,而是叫哥们帮我等,而我出去打路灯 。问题是哥们怎么等?我要钱是用read,哥们呢,其实哥们要钱用的是select()或者poll()。所以,异步阻塞为程序先用非阻塞的read,以后把取数据的任务交给select()或poll(),注意!此时read虽然是非阻塞的,可是select()或者poll()但是阻塞的!就是说我这个哥们吧,帮我等就是干等,若是内核没准备好数据时,他是挂起的,他不会说再叫他的哥们再帮排队。
异步非阻塞:到这里就很好解释了,我哥们的select()或poll()虽然是阻塞的,但我告诉你吧,我哥们还有一个epoll(),epoll()但是非阻塞的,我给我哥们留一电话说帮我排,我哥们也跑了留给大堂经理一个杯子,到时候摔杯为号。
              最后,异步阻塞,我是先设置本身的read为非阻塞,从而能够干点啥事,才能叫哥们帮排队。
               而异步非阻塞,未用read,而是aio_read,而后我就无论了,而且我自由了。只是留一个电话,                                                                  直到最后的最后电话响了通知我,电话号做为回调函数的入口,我收到通知再回来。异步

相关文章
相关标签/搜索