标签:tip note 输出 http 情况 网络应用 不同 术语 lse
当TCP客户端同时处理两个输入时:标准输入和TCP套接字,当客户端fgets
(在标准输入上)被阻塞并且服务器进程被终止时,我们遇到了问题。服务器TCP正确地将FIN发送到客户端TCP,但由于客户端进程被禁止从标准输入读取,所以它从没有看到EOF,直到它从套接字读取(可能更晚)。
如果一个或多个I / O条件准备好(即,输入准备好被读取,或者描述符能够获得更多输出),我们希望得到通知。此功能称为 I/O 多路复用,由select
和poll
函数以及前者的较新POSIX变体提供,称为pselect
。
在以下场景中,I / O复用通常用于网络应用程序:
I / O复用不仅限于网络编程。许多重要的应用程序都需要这些技术。
我们首先检查Unix下可用的五种 I/O 模型的基本差异:
select
和poll
)SIGIO
)aio_
函数)输入操作通常有两个不同的阶段:
最流行的I / O模型是阻塞I / O模型(我们在前面的部分中使用了所有示例)。默认情况下,所有套接字都是阻塞的。场景如下图所示:
我们在这个例子中使用UDP而不是TCP,因为对于UDP,数据“准备好”读取的概念很简单:要么已经接收到整个数据报,要么没有接收到。使用TCP它会变得更复杂,因为插座的低水位标记等附加变量会起作用。
我们还将recvfrom
系统调用称为区分我们的应用程序和内核,无论如何recvfrom
实现(BSD getmsg
上的系统调用和调用System V上的系统调用的函数)。通常会有一个从应用程序中运行到内核中运行的切换,之后会在一段时间后返回到应用程序。
在上图中,进程调用recvfrom
和系统调用在数据报到达并复制到应用程序缓冲区之前不会返回,或者发生错误。最常见的错误是系统调用被信号中断。我们说过程从调用recvfrom
到返回的整个时间都被阻止。当recvfrom
成功返回时,我们的应用程序处理的数据包。
当一个套接字设置为非阻塞时,我们告诉内核“当我请求的I / O操作无法在不使进程进入休眠状态时完成时,不要让进程进入休眠状态,而是返回错误”。该图如下:
recvfrom
,没有数据要返回,内核立即返回错误EWOULDBLOCK
。recvfrom
成功返回。然后我们处理数据。当一个应用程序坐在循环中调用recvfrom
这样的非阻塞描述符时,它被称为轮询。应用程序不断轮询内核以查看某些操作是否已准备就绪。这通常是浪费CPU时间,但偶尔会遇到此模型,通常在专用于一个功能的系统上。
通过I / O多路复用,我们在这两个系统调用之一中调用select
或poll
阻塞,而不是在实际的I / O系统调用中阻塞。该图是I / O复用模型的摘要:
我们阻塞调用select
,等待数据报套接字可读。当select
返回套接字可读时,我们然后调用recvfrom
将数据报复制到我们的应用程序缓冲区中。
select
需要两个系统调用(select
和recvfrom
)而不是一个select
函数)另一个密切相关的I / O模型是使用阻塞I / O的多线程。该模型非常类似于上面描述的模型,除了不使用select
阻塞多个文件描述符,程序使用多个线程(每个文件描述符一个),然后每个线程可以自由调用阻塞系统调用recvfrom
。
该信号驱动I / O模型使用的信号,告诉内核与通知我们SIGIO
信号时,描述符已准备就绪。该图如下:
sigaction
系统调用安装信号处理程序。此系统调用的返回是立即的,我们的过程继续进行; 它没有被阻止。SIGIO
将为我们的过程生成信号。我们可以:
这个模型的优点是我们在等待数据报到达时不会被阻塞。主循环可以继续执行,只需等待信号处理程序通知数据已准备好处理或数据报已准备好被读取。
异步I / O由POSIX规范定义,并且已经协调了各种标准中出现的实时函数的各种差异,这些差异汇集在一起??形成当前的POSIX规范。
这些函数通过告诉内核启动操作并在整个操作(包括从内核到缓冲区的数据副本)完成时通知我们来工作。这个模型和信号驱动的I / O模型的主要区别在于,通过信号驱动的I / O,内核告诉我们何时可以启动I / O操作,但是使用异步I / O,内核告诉我们I / O操作完成时。请参见下图,例如:
我们调用aio_read
(POSIX异步I / O函数以aio_
或开头lio_
)并传递以下内核:
read
),lseek
),此系统调用立即返回,并且在等待I / O完成时不会阻止我们的进程。
我们假设在这个例子中,我们要求内核在操作完成时生成一些信号。在将数据复制到我们的应用程序缓冲区之前,不会生成此信号,这与信号驱动的I / O模型不同。
下图是五种不同I / O模型的比较。
前四个模型之间的主要区别在于第一个阶段,因为前四个模型中的第二个阶段是相同的:recvfrom
当数据从内核复制到调用者的缓冲区时,进程被阻塞。但是,异步I / O处理两个阶段,与前四个不同。
POSIX将这两个术语定义如下:
使用这些定义,前四个I/O模型(阻塞,非阻塞,I/O多路复用和信号驱动I/O)都是同步的,因为实际的I/O操作(recvfrom
)会阻止进程。只有异步I/O模型匹配异步I/O定义。
标签:tip note 输出 http 情况 网络应用 不同 术语 lse
原文地址:https://www.cnblogs.com/rinack/p/10925484.html