ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 系统运维 >> 阅读笔记(五):I/O复用:select和poll函数

阅读笔记(五):I/O复用:select和poll函数(1/6)

来源:网络整理     时间:2016-07-14     关键词:

本篇文章主要介绍了" 阅读笔记(五):I/O复用:select和poll函数",主要涉及到方面的内容,对于系统运维感兴趣的同学可以参考一下: 本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现1. I/O复用技术I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O...

本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现

1. I/O复用技术

I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程。I/O复用适用于以下场合:

(1) 当客户处理多个描述符(一般是交互式输入或网络套接字),必须适用I/O复用

(2) 当一个客户处理多个套接字时,这种情况很少见,但也可能出现

(3) 当一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般就要使用I/O复用

(4) 如果一个服务器既要适用TCP,又要适用UDP,一般就要使用I/O复用

(5) 如果一个服务器要处理多个服务或者多个协议,一般就要使用I/O复用

与多线程和多进程技术相比,I/O复用技术的最大优势就是系统开销小,系统不必创建进程/线程,也不必维护这些进程/进程,从而大大减小了系统的开销。

2. I/O模型

Unix下常见的I/O模型有五种,分别是:阻塞式I/O,非阻塞式I/O,I/O复用,信号驱动式I/O和异步I/O。

Unix下对于一个输入操作,通常包含两个不同的阶段:

(1) 等待数据准备好

(2) 从内核向进程复制数据

例如:对于一次read函数操作来说,数据先会被拷贝到操作系统内核的缓冲区去,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。

再比如对于一次socket流传输来说,首先等待网络上的数据到达,然后复制到内核的某个缓冲区,然后再把内核缓冲区的数据复制到进程缓冲区。

下面就以上述两个阶段来阐述五种I/O模型。

2.1 阻塞式I/O模型

2.1.1 趣解模型

假定一个特定的场景,你的一个好朋友找你借钱,你身上没有充足的现金,于是,你要去银行取钱,银行人多,你只能在那里排队,在这段时间内,你不能离开队伍去干你自己的事情。时间都浪费在排队上面了。这就是典型的阻塞式I/O模型。

2.1.2 网络模型

默认情况下,所有的套接字都时阻塞的,以数据报套接字为例

 阅读笔记(五):I/O复用:select和poll函数

如上图,我们把recvfrom函数视为系统调用,进程调用recvform函数后就阻塞于此,等待数据报的到达,一直到内核把数据报准备好后,就将数据从内核复制到用户进程,随后用户进程再对这些数据进行处理。

这种模型的好处就是,能够及时获得数据,没有延迟,但是就像上面趣解模型中讲到,对用户来说,这段时间一直要处于等到状态,不能去做其他的事情,在性能方面付出了代价。

2.2 非阻塞式I/O模型

2.2.1 趣解模型

还是去取钱的例子,假设你无法忍受一直在那里排队,而是去旁边的商场逛逛,然后隔一段时间回来看看还有在排队没,有的话再继续去逛逛,直到有一次你回来看到没有人排队了为止。这就是非阻塞式I/O模型。

2.2.2 网络模型

进程把一个套接字设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。

 阅读笔记(五):I/O复用:select和poll函数

如上图所示,前三次询问都返回一个错误,即内核没有数据报准备好,到第四次调用recvform函数时,数据被准备好了,它被复制到应用进程缓存区,于是recvform成功返回,应用进程随后处理数据。

这种模型相对于阻塞式来说,

优点在于:应用进程不必阻塞在recvfrom调用中,而是可以去处理其他事情

缺点在于:如趣解模型中所说,你来回跑银行带来了很大的延时,可能在你来回的路上叫到了你的号。在网络模型中即可以表现在任务完成的响应延迟增大了,隔一段时间轮询一次recvform,数据报可能在两次轮询之间的任意时间内准备好,这将会导致整体数据吞吐量的降低。

2.3 I/O复用模型

相关图片

相关文章