更新时间: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中的各种知识吧!
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习