diff --git a/notes/Linux.md b/notes/Linux.md index 3365a392..fdaeb074 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -50,7 +50,10 @@ * [九、进程管理](#九进程管理) * [查看进程](#查看进程) * [查看端口](#查看端口) -* [十、IO 多路复用](#十io-多路复用) +* [十、I/O 多路复用](#十io-多路复用) + * [概念理解](#概念理解) + * [I/O 模型](#io-模型) + * [select() poll() epoll()](#select-poll-epoll) * [参考资料](#参考资料) @@ -1010,10 +1013,88 @@ ps aux | grep threadx netstat -anp | grep 80 ``` -# 十、IO 多路复用 +# 十、I/O 多路复用 +## 概念理解 + +I/O Multiplexing 又被称为 Event Driven I/O,它可以使用单个进程来处理多个 I/O 事件。它的基本原理是,先挂起进程,通过不断轮询监听的 I/O 事件,在一个或多个 I/O 事件发生后才将控制权返回给进程。 + +## I/O 模型 + +- 阻塞(Blocking) +- 非阻塞(Non-blocking) +- 同步(Synchronous) +- 异步(Asynchronous) + +阻塞非阻塞是等待数据的方式,阻塞要求用户程序停止执行,直到 I/O 完成,而非阻塞在 I/O 完成之前还可以继续执行。 + +同步异步是获知 I/O 完成的方式,同步需要时刻关心 I/O 是否已经完成,异步无需主动关心,在 I/O 完成时它会收到通知。 + +

+ +### 1. 同步-阻塞 + +这是最常见的一种模型,用户程序在使用 read() 时会执行系统调用从而陷入内核,之后就被阻塞直到系统调用完成。 + +应该注意到,在阻塞的过程中,其他程序还可以执行,因此阻塞不意味着整个操作系统都被阻塞。因为其他程序还可以执行,因此不消耗 CPU 时间,这种模型的执行效率会比较高。 + +

+ +### 2. 同步-非阻塞 + +非阻塞意味着用户程序在执行系统调用后还可以执行,内核并不是马上执行完 I/O,而是以一个错误码来告知用户程序 I/O 还未完成。为了获得 I/O 完成事件,用户程序必须调用多次系统调用去询问内核,甚至是忙等,也就是在一个循环里面一直询问并等待。 + +由于 CPU 要处理更多的用户程序的询问,因此这种模型的效率是比较低的。 + +

+ +### 3. 异步-阻塞 + +这是 I/O 多路复用使用的一种模式,通过使用 slect(),它可以监听多个 I/O 事件,当这些事件至少有一个发生时,用户程序会收到通知。 + +

+ +### 4. 异步-非阻塞 + +该模式下,I/O 操作会立即返回,之后可以处理其它操作,并且在 I/O 完成时会收到一个通知,此时会中断正在处理的操作,然后完成 I/O 事务。 + +

+ +## select() poll() epoll() + +这三个都是 I/O 多路复用的具体实现,select 出现的最早,之后是 poll,再是 epoll。可以说,新出现的实现是为了修复旧实现的不足。 + +### 1. select() + +```c +int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); +``` + +其中 fd 表示时间描述符,select() 函数包含了三个描述符参数:writefds、readfds、exceptfds,它们都是数组形式,因此可以同时监听多个描述符。 + +select() 采取轮询描述符的方式来找到 I/O 完成的描述符。 + +### 2. poll() + +```c +int poll (struct pollfd *fds, unsigned int nfds, int timeout); +``` + +```c +struct pollfd { + int fd; //文件描述符 + short events; //监视的请求事件 + short revents; //已发生的事件 +}; +``` + +它和 select() 功能基本相同。 + +未完待续。。 # 参考资料 - 鸟哥. 鸟 哥 的 Linux 私 房 菜 基 础 篇 第 三 版[J]. 2009. - [Linux 平台上的软件包管理](https://www.ibm.com/developerworks/cn/linux/l-cn-rpmdpkg/index.html) +- [Boost application performance using asynchronous I/O](https://www.ibm.com/developerworks/linux/library/l-async/) +- [Synchronous and Asynchronous I/O](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365683(v=vs.85).aspx) diff --git a/pics/00eda100-dba1-4ec2-9140-5fe5f3855951.jpg b/pics/00eda100-dba1-4ec2-9140-5fe5f3855951.jpg new file mode 100644 index 00000000..4b063372 Binary files /dev/null and b/pics/00eda100-dba1-4ec2-9140-5fe5f3855951.jpg differ diff --git a/pics/1582217a-ed46-4cac-811e-90d13a65163b.png b/pics/1582217a-ed46-4cac-811e-90d13a65163b.png new file mode 100644 index 00000000..c89551d1 Binary files /dev/null and b/pics/1582217a-ed46-4cac-811e-90d13a65163b.png differ diff --git a/pics/5e9b10f3-9504-4483-9667-d4770adebf9f.png b/pics/5e9b10f3-9504-4483-9667-d4770adebf9f.png new file mode 100644 index 00000000..4ac499de Binary files /dev/null and b/pics/5e9b10f3-9504-4483-9667-d4770adebf9f.png differ diff --git a/pics/b4b29aa9-dd2c-467b-b75f-ca6541cb25b5.jpg b/pics/b4b29aa9-dd2c-467b-b75f-ca6541cb25b5.jpg new file mode 100644 index 00000000..15f6fce8 Binary files /dev/null and b/pics/b4b29aa9-dd2c-467b-b75f-ca6541cb25b5.jpg differ diff --git a/pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg b/pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg new file mode 100644 index 00000000..6ff8388d Binary files /dev/null and b/pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg differ