浅聊Linux的五种IO模型

时间:2021-05-03 11:49:34   收藏:0   阅读:0

技术图片

在日常 Coding 中,多多少少都会接触到网络 IO,就会想要深入了解一下。看了很多文章,总是云里雾里的感觉,直到读了《UNIX网络编程 卷1:套接字联网API》中的介绍后,才豁然开朗。这里就给大家分享一下,如有不对,欢迎指出。

1. 概念说明

为了便于理解后面的内容,我们先来了解一些概念。

1.1 Socket

Socket 中文翻译为套接字,是计算机网络中进程间进行双向通信的端点的抽象。一个 Socket 代表了网络通信的一端,是由操作系统提供的进程间通信机制。

技术图片

1.2 Socket 缓冲区

每个 Socket 被创建后,都会在内核中分配两个缓冲区:输入缓冲区和输出缓冲区。

技术图片

1.3 用户空间、内核空间、系统调用

操作系统的进程空间可以分为用户空间(User Space)和内核空间(Kernel Space),它们需要不同的执行权限。

技术图片

下面列举了一些 Linux 操作系统中的系统调用接口(部分函数后面章节会用到):

1.4 阻塞与非阻塞

阻塞与非阻塞,用于描述调用者在等待返回结果时的状态。

1.5 同步与异步

而同步与异步,用于描述调用结果的返回机制(或者叫通信机制)。

2. 五种 IO 模型

IO 模型是指:用什么样的通道或者说是通信模式进行数据的传输,这很大程序上决定了程序通信的性能。

Linux 系统为我们提供五种可用的 IO 模型:阻塞式 IO 模型、非阻塞式 IO 模型、IO 多路复用模型、信号驱动 IO 模型和异步 IO 模型。

2.1 阻塞式 IO 模型

阻塞式 IO (Blocking IO):应用进程从发起 IO 系统调用,至内核返回成功标识,这整个期间是处于阻塞状态的。

技术图片

2.2 非阻塞式 IO 模型

非阻塞式IO(Non-Blocking IO):应用进程可以将 Socket 设置为非阻塞,这样应用进程在发起 IO 系统调用后,会立刻返回。应用进程可以轮询的发起 IO 系统调用,直到内核返回成功标识。

技术图片

2.3 IO 多路复用模型

IO 多路复用(IO Multiplexin):可以将多个应用进程的 Socket 注册到一个 Select(多路复用器)上,然后使用一个进程来监听该 Select(该操作会阻塞),Select 会监听所有注册进来的 Socket。只要有一个 Socket 的数据准备好,就会返回该Socket。再由应用进程发起 IO 系统调用,来完成数据读取。

技术图片

2.4 信号驱动 IO 模型

信号驱动 IO(Signal Driven IO):可以为 Socket 开启信号驱动 IO 功能,应用进程需向内核注册一个信号处理程序,该操作并立即返回。当内核中有数据准备好,会发送一个信号给应用进程,应用进程便可以在信号处理程序中发起 IO 系统调用,来完成数据读取了。

技术图片

2.5 异步 IO 模型

异步 IO(Asynchronous IO): 应用进程发起 IO 系统调用后,会立即返回。当内核中数据完全准备后,并且也复制到了用户空间,会产生一个信号来通知应用进程。

技术图片

3. 总结

从上述五种 IO 模型可以看出,应用进程对内核发起 IO 系统调用后,内核会经过两个阶段来完成数据的传输:

技术图片

前四种模型的第二阶段是相同的,都是处于阻塞状态,其主要区别在第一阶段。而异步 IO 模型则不同,应用进程在这两个阶段是完全不阻塞的。

IO 模型 第一阶段 第二阶段
阻塞式IO 阻塞 阻塞
非阻塞式IO 非阻塞 阻塞
IO多路程复用 阻塞(Select) 阻塞
信号驱动式IO 异步 阻塞
异步IO 异步 异步

参考资料

推荐阅读

微信搜索:码农StayUp
主页地址:https://gozhuyinglong.github.io
源码分享:https://github.com/gozhuyinglong/blog-demos

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!