unix网络编程-I/O模型

前端之家收集整理的这篇文章主要介绍了unix网络编程-I/O模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这个内容非常重要,今后我们将要讨论的各种并发服务器模型都是基于一种或多种I/O模型之上的,网络服务器的性能差异很大程度上就是因为选择了不同I/O模型

Unix下可用的5种I/O模型

阻塞式I/O模型

最流行的是这种模型。

目前为止的例子都使用该模型。

默认情况下,套接字都是该模型。

使用UDP为例(TCP复杂,还涉及套接字低水平标记等)是因为它简单:数据报要么收到,要么没有。进程调用recvfrom,其系统调用直到数据报达到且被复制到应用进程或者发生错误才返回。进程从调用recvfrom到它返回的整段时间都是被阻塞的。返回后,进程开始处理数据报


非阻塞式I/O模型

设置为非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠时,不睡眠,而是返回错误。前三次调用recvfrom时没数据报,内核立刻返回EWOULDBLOCK错误。第四次数据准备好,被复制到进程缓冲区,recvfrom成功返回,接着处理数据。这里不断查看某操作是否就绪,称为轮询耗费大量cpu时间。一般是专门提供某一种功能的系统才用


@L_301_1@I/O复用(select、poll)

阻塞于select等待套接字可读,当select返回套接字可读时,调用recvfrom把数据读并复制到进程缓冲区。

I/O复用优势在于等待多个描述符就绪。

与此模型密切相关的是:在多线程下用阻塞式I/O(每个线程可自由调用如recvfrom之类的阻塞式I/O系统调用)。


信号驱动I/O模型


我们首先开启套接字的信号驱动式I/O功能,并通过sigaction系统调用安装一个信号处理函数。该系统调用将立即返回,我们的进程继续工作,也就是说它没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让他读取数据报。这种模式的优势:等待数据报到达期间进程不被阻塞。


异步I/O模型


POSIX规范定义的。

告知内核启动某操作,并让内核在整个操作(包括数据从内核复制到进程缓冲区)完成才通知我们

与信号驱动I/O主要区别是:前者是内核通知我们何时启动一个I/O操作,而后者是由内核通知何时I/O操作完成,信号在操作完成才产生。


各种模型比较

前四种模型主要区别在于第一阶段,因为它们的第二个阶段都是一样的:在数据从内核复制到调用者的缓冲区期间,进程阻塞于recvfrom调用,相反,异步I/O模型在这两个阶段都要处理,从而不同于其他模型。注意,前四种都是同步I/O(真正的I/O操作将阻塞进程),只有异步I/O模型是异步I/O的

原文链接:https://www.f2er.com/bash/391050.html

猜你在找的Bash相关文章