注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

生命无非记忆

不要在记忆中丢失了自己

 
 
 

日志

 
 

同步/异步IO、阻塞IO/非阻塞IO浅析  

2014-06-28 13:25:13|  分类: 网络编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1       unix下的五个IO模型

注:

         大部分内容均出自《Unix 网络编程:卷一》一书。

 

五种IO模型:

阻塞IO

IO复用(selectpoll)

非阻塞IO

信号驱动IO (SIGIO)

异步IO (aio_xxx函数)

 

总体原则:

同步/异步IO、阻塞IO/非阻塞IO浅析 - zisedeqing - 生命无非记忆

1.1   阻塞IO模型

同步/异步IO、阻塞IO/非阻塞IO浅析 - zisedeqing - 生命无非记忆

应用进程一直阻塞到由内核把数据完全copy到用户空间或者出错时,才返回,这期间用户进程不能做任何事情,直到recvfrom返回。

1.2   非阻塞IO模型

同步/异步IO、阻塞IO/非阻塞IO浅析 - zisedeqing - 生命无非记忆
 

非阻塞调用:

通知内核,当请求的IO操作非得让进程睡眠不能完成时,不要让进程睡眠,而是返回一个错误。

轮询(polling)

         应用程序调用非阻塞描述符,循环调用recvfrom,查询内核状态,这一过程叫做轮询。很耗CPU

 

从上图可以看出,应用程序,一直在不停的调用recvfrom,查询内核数据是否完成,直到最后一次,数据才准备好,则应用程序调用recvfrom,由内核把数据copy到用户空间。

1.3   IO复用模型

同步/异步IO、阻塞IO/非阻塞IO浅析 - zisedeqing - 生命无非记忆
 

1.4   信号驱动IO模型

同步/异步IO、阻塞IO/非阻塞IO浅析 - zisedeqing - 生命无非记忆
 

         信号驱动IO模型的特点是通过sigaction安装信号处理函数,在内核把数据准备好之后,通过SIGIO信号通知用户程序,然后用户程序通过信号处理函数,调用recvfrom把数据从内核空间copy到用户空间。

         该模型是非阻塞的,应用程序不用等待内核把数据准备好,而是直接返回,可以进行进行其他的处理。直到收到SIGIO信号,才有用户进程copy 数据。

1.5   异步IO模型

同步/异步IO、阻塞IO/非阻塞IO浅析 - zisedeqing - 生命无非记忆
 

         异步IO的特点是在IO的两个阶段都不需要阻塞:

                   数据准备阶段:

                            直接返回

                   从内核空间把数据拷贝到用户空间阶段:

                            由内核偷偷的进行,做完之后通知用户进程

         与信号驱动IO模型的区别:

                   信号驱动IO模型:

                            由内核通知应用程序,何时可以启动一个IO操作

                   异步IO模型:

                            由内核通知应用程序,IO操作何时完成

1.6   五种IO模型的比较

同步/异步IO、阻塞IO/非阻塞IO浅析 - zisedeqing - 生命无非记忆

         4IO模型区别在于第一阶段,第二阶段都一样:在数据从内核空间拷贝到用户空间时都阻塞在recvfrom上。异步IO模型在两个阶段都与前4种模型不同

         根据Posix.1的定义:

同步/异步IO、阻塞IO/非阻塞IO浅析 - zisedeqing - 生命无非记忆

 

         同步IO模型:

                   阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动IO模型

         异步IO模型:

                   异步IO模型

2       阻塞/非阻塞

我的理解,阻塞与非阻塞是一个比较的概念,针对的是特定的IO操作,我们可以说一个IO操作是阻塞或非阻塞的,比如:可以说read是阻塞的,或者read是非阻塞的,但是不能说read是同步的,或者read是异步的。

阻塞与非阻塞的区别在于:

         阻塞调用是一直等待内核的处理结果,直到调用由内核空间返回到用户空间,在这一调用时间内,应用程序什么事都不能做,必须死等。

         非阻塞调用是,不用等待内核的处理结果,而是直接返回,然后在某个恰当的时间点(可以有应用程序主动轮询或者由内核通知),接收内核的处理结果。在接收内核的处理结果之前,应用程序可以做任何想做的事。

3       同步/异步

异步/同步是比阻塞/非阻塞具有更的概念,它们指的应该是设计方法,我们可以说某某设计方案是同步的,或者是异步的,而不应该说某某方案是阻塞的或者非阻塞。

异步与同步的区别是:

         异步:

                   异步IO模型内调用的IO操作,必须全是非阻塞的,只要有一个是阻塞的,就不是异步IO模型。

  评论这张
 
阅读(283)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017