Chinaunix首页 | 论坛 | 博客
  • 博客访问: 186427
  • 博文数量: 13
  • 博客积分: 1660
  • 博客等级: 上尉
  • 技术积分: 688
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-04 16:38
文章分类
文章存档

2014年(2)

2013年(11)

分类: 网络与安全

2013-02-05 14:06:59

这是一次概念的纠结过程,对写代码没有太大意义。

过程是这样的:
首先,我的概念里往往只有同步和异步,没有太多去区别同异步IO和同异步通知两种。
另外还记得apu(2rd)中有一句“select和poll可以实现异步形式的通知”。

接着,听到了epoll是同步IO这个概念,比较意外。坚持了一下后,查到如下概念:
在unp(3rd)里的定义是:
第一是IO操作的概念:
IO操作包括:
1.等待数据准备好。
2.从内核到进程拷贝数据。

第二就是是同步IO和异步IO的区别:
同步IO导致请求进程阻塞,直到IO操作完成。
异步IO不导致请求进程阻塞。

得到的结论:
阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动IO模型都是同步IO。
epoll也是IO复用模型,应该是同步IO。

此时又意外了,再看到一个解释:
更为重要的是, epoll 因为采用 mmap的机制, 使得 内核socket buffer和 用户空间的 buffer共享, 从而省去了 socket data copy, 这也意味着, 当epoll 回调上层的 callback函数来处理 socket 数据时, 数据已经从内核层 "自动" 到了用户空间, 虽然和 用poll 一样, 用户层的代码还必须要调用 read/write, 但这个函数内部实现所触发的深度不同了.

用 poll 时, poll通知用户空间的Appliation时, 数据还在内核空间, 所以Appliation调用 read API 时, 内部会做 copy socket data from kenel space to user space.

而用 epoll 时, epoll 通知用户空间的Appliation时?, 数据已经在用户空间, 所以 Appliation调用 read API 时?, 只是读取用户空间的 buffer, 没有 kernal space和 user space的switch了.

于是想了一下:
明显没有IO操作的拷贝数据到内核空间了,stevens应该在99年就挂了,2.6内核的epoll才采用mmap机制,书籍偏旧了吧。
那么epoll是异步IO了吧。

然后再一看,你妹的,这还是不符合异步IO啊,毕竟epoll在告知OK前,是阻塞了,虽然是拷贝数据结束了。
看来好像应该修正的是IO操作定义的第二步才对,而不是那个区别。

好吧,你就暂时属于同步IO了,专心看代码,不纠结概念了。

阅读(17764) | 评论(5) | 转发(1) |
给主人留下些什么吧!~~

erlanger2015-05-09 09:37:07

我的理解是这样
同步和民步都表示要等待某个事情的结果 —— 在代码层面,同步表示在某一行代码逻辑调用上暂停并等待结果,然后在未来某个时间,可以从此行代码恢复继续往下运行,异步则没有暂停在某行代码上,但同样在未来某个时刻有结果时触发事件通知和回调。
阻塞则是指挂起线程或者进程,让出 CPU 执行权。

那么,以下概念则是:
1、同步阻塞,代码执行到某一行时暂停在这里等待结果,并且执行这行代码的当前线程/进程被挂起,让出 CPU,然后在未来某个时刻,由其它线程触发事件通知和回调,告知结果。
2、同步非阻塞,代码执行到某一行时暂停在这里等待结果,但执行这行代码的当前线程/进程不被挂起,继续执行其它操作,然后在未来某个时刻,由其它线程触发事件通知和回调,告知结果,这种模型典型的代表是协程。
3、异步非阻塞,代码执行即不会暂停在某一行,也不会挂起当前线程/进程,然后在未来某个时刻,由其它线程触发事件通知和回调,告知结果。
4、异步阻塞,这种则极少有

jack10072013-12-19 09:17:12

epoll我不清楚什么原理,unp没介绍,但是看select和poll,它俩应该是同步非阻塞io,unp127页介绍了。
select和poll调用的时候,会阻塞进程的,因为他们要检查哪些io可用,然后在检查完成后,调用read/write也会阻塞进程。
而异步io是直接aio_read,立即返回,并不阻塞进程,然后由内核自行复制数据给aio_read,这里的aio_read是不阻塞进程的,它直接读内核,不管是否准备好。

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操作之后既不需要等待返回结果,又要自己主动去读状态?
内核除了在函数退出时能返回状态,没有其他地方可以查某某次操作的状态吧?


有什么不对的,还望指正。

回复 | 举报

ywh1472013-02-09 09:12:16

同步、异步和阻塞、非阻塞是两回事,你在文中提到“同步IO导致请求进程阻塞,直到IO操作完成”明显是把概念给弄混了,他们之间根本没关系,同步非阻塞的情况如何解释?

我认为同步和异步的主要区别是主动和被动的关系,是我主动的去读还是被动的等待通知,显然poll和epoll都需要用户主动的去检查socket描述符的状态,然后再由用户主动执行read操作,所以都是同步的。

阻塞和非阻塞的主要区别是等待和非等待,如果一个请求无法立即返回那我就先去做别的,不用死等在那,这和同步、异步根本是两回事。