您的位置:首页 > 其它

UNP-第六章 I/O复用 select 和poll函数 学习笔记 - 绪论

2017-05-17 23:00 183 查看

前言

在5.12节中,我们看到TCP客户端同时处理两个输入:标准输入和TCP套接字。我们遇到的问题是:就在客户端阻塞于(标准输入上的)fgets调用期间,服务器进程会被杀死。服务器TCP函数正确的给客户端TCP发送了一个FIN,但是既然客户端进程正阻塞于从标准输入读入的过程。它将看不到这个EOF。直到从套接字读时为止。这样的进程需要一种预先告知内核的能力,使得内核一旦返现进程指定的一个或多个I/O调节就绪(也就是说输入已准备好被读取,或者描述符已能承接更多的输出)。他就通知进程。这个能力成为I/O复用。

I/O复用典型网络应用场景

当客户处理多个描述符(通常是交互式输入和网络套接字)时,必须使用I/O复用。

一个客户同时处理多个套接字是可能的

如果一个TCP服务器既要处理监听套接字,又要处理已连接的套接字,一般就要使用I/O复用。下文会详细叙述这种情况。

如果一个服务器既要处理TCP,又要处理UDP,一般就要使用I/O复用。

如果一个服务器要处理多个服务或者多个协议。一个就要使用I/O复用。

IO复用不仅只限于网络编程,也可以在很多应用程序中使用

I/O模型

在深入理解select和poll函数之前。我们需要了解UNIX下用哪几种I/O模型。以及区别。因为select和poll是其中一种,首先我们来从整体上了解I/O。

UNIX中五中I/O模型,分别为:

1,阻塞式I/O

2,非阻塞式I/O

3,I/O复用(select和poll)

4,信号驱动I/O(SIGIO)

5,异步I/O

在展开讲述这五种之前。首先需要了解,一个输入操作通常包含两个不同的阶段

1,等待数据准备好

2,从内核中向进程复制数据。

1, 阻塞式I/O模型

阻塞式I/O也就是在数据准备好之前,一直被阻塞。比如在上图中,recvfrom系统调用,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误才返回。



2,非阻塞式I/O模型

非阻塞式I/O就是,如果所请求的I/O操作,数据没有准备好,则返回一个错误,否则返回成功知识。

对比阻塞式I/O,非阻塞式I/O在数据没有准备好的情况下,返回错误,而不是被一直阻塞。这时候可以继续轮询I/O,或者进行其他操作,等待一段时间后在进行I/O。灵活性较第一种强。可以由应用程序自己控制。



3,I/O复用模型

用了I/O复用,我们就可以调用select和poll,阻塞在这两个系统调用中的某一个上。而不是阻塞在真正的I/O系统调用上。



我们阻塞于select调用,等待数据包套接字变为可读。当select套接字可读这一条件时,我们调用recvfrom把所读数据复制到应用缓冲区中。

4,信号驱动式I/O模型

我们首先开套接字的信号驱动式I/O功能。并通过Sigaction系统调用安装一个信号处理函数。该系统调用将理解返回。然后当数据准备好的时,内核为该进程产生一个SIGIO信号,我们随后即可在信号处理函数中调用recvform系统调用读取数据包。并通知主循环以准备好待处理,也可以理解通知主循环,让它读取数据报。



5,异步I/O模型

一般来说,异步I/O的工作机制是:告知内核启动某个操作,并让内核在整个操作(包括数据从内核复制到我们自己的缓冲区)完成后通知应用程序,和信号驱动式I/O区别在于:信号驱动I/O是由内核通知何时可以启动一个I/O操作,而异步I/O模型是有内核通知我们I/O操作何时完成。



总结 - 各种I/O模型的比较

一个概念:

1,同步I/O

导致请求进程阻塞,直到I/O操作完成

2,异步I/O

不导致请求进程阻塞

下图为五中I/O模型比较



前四种模型为-阻塞时I/O模型。非阻塞式I/O模型,I/O复用模型。和信号驱动模型,都是同步I/O模型

只有异步I/O模型与POSIX定义的I/O相匹配。

该小节主要总结了五种I/O模型,以及对I/O复用概念以及场景做了一些了解。下边的博客将对select和poll进行深入讲解。希望大家关注。有不足和错误,请大家即使指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: