码迷,mamicode.com
首页 > 其他好文 > 详细

Socket编程实践(10) --5种I/O模型

时间:2014-12-06 16:53:38      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:linux   io   多路复用   异步   socket   

阻塞I/O

  bubuko.com,布布扣

说明1:当上层应用Application1调用recv系统调用时,如果对等方没有发送数据(Linux内核缓冲区中没有数据),上层应用Application1将阻塞[默认:被Linux内核阻塞)

说明2:当对等方发送了数据,Linux内核recv端缓冲区数据到达,内核会把数据copy给用户空间。然后上层应用Application1解除阻塞,执行下一步操作。

 

非阻塞I/O

 bubuko.com,布布扣

说明1: 上层应用程序Application2将套接字设置成非阻塞模式。

说明2: 上层应用程序Application2轮询调用recv函数,接受数据。若缓冲区没有数据,上层程序Application2不会阻塞,recv返回值为-1,错误码是EWOULDBLOCK。

说明3:上层应用程序不断轮询有没有数据到来。造成上层应用忙等待。大量消耗CPU。很少直接用。应用范围小,一般和select IO复用配合使用

 

I/O多路复用[重点]

 bubuko.com,布布扣

说明1: 上层应用程序Application3调用select(该机制由Linux内核支持,避免了Application3忙等待),进行轮询文件描述符的状态变化。

说明2:当select管理的文件描述符没有数据(或者状态没有变化时),上层应用程序Application3也会阻塞。

说明3:好处是:select机制可以管理多个文件描述符

说明4:select可以看成一个管理者,用select来管理多个IO。

一旦检测到的一个I/O或者多个IO,有我们感兴事件发生时,select函数将返回,返回值为检测到的事件个数。进而可以利用select相关API函数,操作具体事件。

说明5:select函数可以设置等待时间,避免了上层应用程序Application3长期僵死。

说明6: 和阻塞IO模型相比,selectI/O复用模型相当于提前阻塞了。等到有数据到来时,再调用recv就不会发生阻塞。

 

信号驱动I/O

 bubuko.com,布布扣

说明1: 上层应用程序Application4建立SIGIO信号处理程序。当缓冲区有数据到来,内核会发送信号告诉上层应用程序Application4。

说明2:上层应用程序Application4接收到信号后,调用recv函数,因缓冲区有数据,recv函数一般不会阻塞。

说明3:这种用于模型用的比较少,属于典型的“拉模式(上层应用被动的去Linux内核空间中拉数据)”。即:上层应用Application4,需要调用recv函数把数据拉进来,会有时间延迟,我们无法避免在延迟时,会又有新的信号的产生。

 

异步I/O[重点]

 bubuko.com,布布扣

说明1:上层应用程序Application5调用aio_read函数,同时提交一个应用层的缓冲区buf;调用完毕后,不会阻塞。上层应用程序Application5可以继续其他任务。

说明2:当TCP/IP协议缓冲区有数据时,Linux主动的把内核数据copy到用户空间。然后再给上层应用Application5发送信号;告诉Application5数据到来,需要处理!

说明3:典型的“推模式”

说明4: 效率最高的一种模式,上层应用程序Application5有异步处理的能力(Linux内核的支持下,处理其他任务的同时,也可支持IO通讯)。

 

异步I/O是指什么?

    上层应用程序Application5,在进行其他任务的同时时,也可以接收数据(接受异步通信事件)。而且上层应用程序并不需要调用recv函数

Socket编程实践(10) --5种I/O模型

标签:linux   io   多路复用   异步   socket   

原文地址:http://blog.csdn.net/zjf280441589/article/details/41776331

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!