5种Linux 网络I/O模型解析 - 极悦
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 5种Linux 网络I/O模型解析

5种Linux 网络I/O模型解析

更新时间:2020-12-21 17:49:05 来源:极悦 浏览1214次

在实际应用中,数据操作通常分为输入和输出,那么以输入为例,在操作系统中,一个数据的输入通常分为两个过程:等待数据准备好和将准备好的数据从内核拷贝到用户空间。我们先来看看5种Linux网络I/O模型分别是什么?

1.阻塞I/O

2.非阻塞I/O

3.I/O多路复用

4.信号驱动I/O

5.异步I/O

下面我们来具体分析这5种Linux网络I/O模型:

1、阻塞IO模型

学习过操作系统的知识后,可以知道:不管是网络IO还是磁盘IO,对于读操作而言,都是等到网络的某个数据分组到达后/数据准备好后,将数据拷贝到内核空间的缓冲区中,再从内核空间拷贝到用户空间的缓冲区。
此处需要一个清新的脑回路,我就是程序,我想要全家桶,于是发起了系统调用,而后厨加工的过程就是在做数据准备和拷贝工作。全家桶最终到手,数据终于从内核空间拷贝到了用户空间。

阻塞IO的执行过程是进程进行系统调用,等待内核将数据准备好并复制到用户态缓冲区后,进程放弃使用CPU并一直阻塞在此,直到数据准备好。


2、非阻塞IO模型

同步阻塞 I/O 的一种效率稍低的变种是非阻塞 I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着 I/O 操作不会立即完成,read操作可能会返回一个错误代码,说明这个命令不能立即满足(EAGAIN 或 EWOULDBLOCK)

 

每次应用程序询问内核是否有数据准备好。如果就绪,就进行拷贝操作;如果未就绪,就不阻塞程序,内核直接返回未就绪的返回值,等待用户程序下一个轮询。

非阻塞IO模型

大致经历两个阶段:

等待数据阶段:未阻塞, 用户进程需要盲等,不停的去轮询内核。

数据复制阶段:阻塞,此时进行数据复制。

在这两个阶段中,用户进程只有在数据复制阶段被阻塞了,而等待数据阶段没有阻塞,但是用户进程需要盲等,不停地轮询内核,看数据是否准备好。

 

3.IO多路复用模型

I/O 复用有时又被称为 事件驱动 I/O, 它的最大优势在于,我们可以将感兴趣的多个I/O事件(更精确的说,应该是 I/O 所对应的文件描述符)注册到 select/poll/epoll/kqueue 之中某一个系统调用上(很多时候,这些系统调用又被称为多路复用器。假设此时我们选择了 select() )。此后,调用进程会阻塞在 select() 系统调用之上(而不是阻塞在真正的 I/O 系统调用(如 read(), write() 等)上)。select() 会负责监视所有已注册的 I/O 事件,一旦有任意一个事件的数据准备好,那么 select() 会立即返回,此时我们的用户进程便能够进行数据的复制操作。

 

总而言之,I/O 复用的优点就在于可以同时等待多个I/O事件;而缺点是会进行两次系统调用(一次 select(), 一次 read() )。

 

4.信号驱动IO模型

在这种模型下,我们首先开启套接字的信号驱动式I/O功能,并通过sigaction系统调用安装一个信号处理函数。改系统调用将立即返回,我们的进程继续工作,也就是说他没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后就可以在信号处理函数中调用read读取数据报,并通知主循环数据已经准备好待处理,也可以立即通知主循环,让它读取数据报。当数据报准备好的时候,内核会向应用程序发送一个信号,进程对信号进行捕捉,并且调用信号处理函数来获取数据报。


5.异步IO模型

 异步 I/O 模型是一种处理与 I/O 重叠进行的模型。读请求会立即返回,说明 read 请求已经成功发起了。在后台完成读操作时,应用程序然后会执行其他处理操作。当 read 的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次 I/O 处理过程。 

异步I/O执行的两个阶段都不会阻塞读写操作,由内核完成。完成后内核将数据放到指定的缓冲区,通知应用程序来取。

 

通过以上的介绍,我想大家5种Linux网络I/O模型有了一定的了解和认识,而且也了解到了5种Linux网络I/O模型每种模型的优缺点,Linux同步 I/O 总会有阻塞的过程,这就是“同步”最本质的特征。而Linux异步 I/O 的最大特点在于用户进程均不阻塞。用户进程告知内核启动某一 I/O 操作, 并让内核全权代为执行(包括等待数据及拷贝数据至用户空间),此后用户进程可以立即执行其它的任何操作。等到所有 I/O 过程执行完成后, 内核会通知用户进程。由此可见,在整个过程中,用户进程均不阻塞。让我们携手本站的Linux教程,更加透彻的学习Linux中的各种知识吧!


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>