分类: 网络与安全
2013-02-05 14:06:59
用 poll 时, poll通知用户空间的Appliation时, 数据还在内核空间, 所以Appliation调用 read API 时, 内部会做 copy socket data from kenel space to user space.
erlanger2015-05-09 09:37:07
我的理解是这样
同步和民步都表示要等待某个事情的结果 —— 在代码层面,同步表示在某一行代码逻辑调用上暂停并等待结果,然后在未来某个时间,可以从此行代码恢复继续往下运行,异步则没有暂停在某行代码上,但同样在未来某个时刻有结果时触发事件通知和回调。
阻塞则是指挂起线程或者进程,让出 CPU 执行权。
那么,以下概念则是:
1、同步阻塞,代码执行到某一行时暂停在这里等待结果,并且执行这行代码的当前线程/进程被挂起,让出 CPU,然后在未来某个时刻,由其它线程触发事件通知和回调,告知结果。
2、同步非阻塞,代码执行到某一行时暂停在这里等待结果,但执行这行代码的当前线程/进程不被挂起,继续执行其它操作,然后在未来某个时刻,由其它线程触发事件通知和回调,告知结果,这种模型典型的代表是协程。
3、异步非阻塞,代码执行即不会暂停在某一行,也不会挂起当前线程/进程,然后在未来某个时刻,由其它线程触发事件通知和回调,告知结果。
4、异步阻塞,这种则极少有
yinjian_20082013-04-08 15:43:51
文章写的不错,我也在纠结epoll的同步异步问题。通过这边文章,至少我是明白了epoll是同步io.关于理论找了一篇http://blog.chinaunix.net/uid-52437-id-2108895.html
bluecase2013-02-20 12:53:41
ywh147:同步、异步和阻塞、非阻塞是两回事,你在文中提到“同步IO导致请求进程阻塞,直到IO操作完成”明显是把概念给弄混了,他们之间根本没关系,同步非阻塞的情况如何解释?
我认为同步和异步的主要区别是主动和被动的关系,是我主动的去读还是被动的等待通知,显然poll和epoll都需要用户主动的去检查socket描述符的状态,然后再由用户主动执行read操作,所以都是同步的。
阻塞和非阻塞的主要区别是等待和非等待,如果一个请求无法立即返回那我就先去做别的,不用死等在那,这和同步、异步根本是两回事。
1.同步、异步和阻塞、非阻塞是两回事
这个确实是两回事啊,文章也没有说有关系。
估计我们是在同步/异步IO 和 同步/异步通信方式这两个概念上混淆了。
2.“同步IO导致请求进程阻塞,直到IO操作完成”明显是把概念给弄混了,他们之间根本没关系,同步非阻塞的情况如何解释?
a.我这里说的请求进程阻塞,也就是说同步和阻塞是发生在发起IO操作的用户进程和 kernel之间的之间的,被内核阻塞了。
b.你说的同步非阻塞里的同步应该是同步通信方式吧? 同步和非阻塞发生在两个用户进程之间。
c.假如按你的理解。那么,应该存在一个进程发起IO操作之后既不需要等待返回结果,又要自己主动去读状态?
内核除了在函数退出时能返回状态,没有其他地方可以查某某次操作的状态吧?
有什么不对的,还望指正。