看了UNP1中第6章IO模型,对头脑中混沌的同步、异步、阻塞、非阻塞进行整理一下
下面是书中的截图,
它把阻塞IO、非阻塞IO、IO复用、信号驱动IO都归为同步,然后单列一个异步IO
不是很同意书中的观点,搜索了篇博客,比较认同博客里的这个观点“同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制”
那谁的技术博客(谢谢该博主,学了很多东西)
我总结的理解
一.同步、异步的区别在于怎么获取事件是否已经发生,而不关心对事件的处理
二.阻塞、非阻塞的区别在于干某件事的时候,如果时机不成立,是否需要一直等待,还是去做一些其他事情
现举一例,情形如下
我要进行read(fd, buf, LEN)这种操作,在这里其实存在上述所说的时机问题,即fd的缓冲区里是否有数据了,这也是一中所说的事件是否已经发生。假如fd的缓冲区里还没有数据,这时你可以选择是等待还去做其他一些事情,这就是阻塞、非阻塞区别。而你怎么获取fd的缓冲区是否有数据了这个事件问题就是同步、异步问题
备注:假如fd的缓冲区里已经有数据了,这时你进行read操作是没有阻塞、非阻塞问题的,在这种情况下和一般的函数没有区别
分情况讨论如下
1.同步+阻塞:需要自己去获取fd缓冲区是否有数据了,并且在fd缓冲区没有数据之前什么事也不干,一直忙等
这就是默认的调用read时情况
2.同步+非阻塞:需要自己去获取fd缓冲区是否有数据了,在没有缓存区没有数据之前可以干其他事情
对fd进行nonblocking操作,伪代码如下
while(1)
{
len = read(...);
if(len == -1 and errno == EAGAIN)
做其他事情
else if(len == -1)
出错了
else
对输入进行处理
}
3.异步+非阻塞
我理想的异步操作是这样的:我给系统提供一个回调函数,告诉系统说当这个事件发生时,你给我调用这个函数即可。在这里我不需要关心事件在什么时候发生,同时我也告诉了系统当事件发生时要做些什么,当然这是异步操作带来的附属功能。所以异步就没有阻塞,异步就只有非阻塞
实现方法是信号驱动机制,提供一个回调函数即可(在这里我把信号驱动机制归于异步了,这和UNP中所说的是不一样的)
上述言论皆个人见解,读者自编真伪!
for wj!
阅读(1622) | 评论(0) | 转发(0) |