From 33cfec3a648f142185a168384e23c55331cab0bc Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Sun, 27 May 2018 14:29:16 +0800
Subject: [PATCH] auto commit
---
README.md | 6 +-
notes/Linux.md | 301 +---------------------------------
notes/Socket.md | 343 +++++++++++++++++++++++++++++++++++++++
pics/1492928105791_3.png | Bin 0 -> 47104 bytes
pics/1492928416812_4.png | Bin 0 -> 28672 bytes
pics/1492929000361_5.png | Bin 0 -> 48128 bytes
pics/1492929444818_6.png | Bin 0 -> 44032 bytes
pics/1492929553651_7.png | Bin 0 -> 41984 bytes
pics/1492930243286_8.png | Bin 0 -> 33792 bytes
9 files changed, 351 insertions(+), 299 deletions(-)
create mode 100644 notes/Socket.md
create mode 100644 pics/1492928105791_3.png
create mode 100644 pics/1492928416812_4.png
create mode 100644 pics/1492929000361_5.png
create mode 100644 pics/1492929444818_6.png
create mode 100644 pics/1492929553651_7.png
create mode 100644 pics/1492930243286_8.png
diff --git a/README.md b/README.md
index 80528a71..d6fcab10 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,10 @@
整理自《图解 HTTP》
+> [Socket](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Socket.md)
+
+整理自《Unix 网络编程》
+
## 面向对象 :couple:
@@ -87,7 +91,7 @@ Leetcode 上数据库题目的解题记录。
> [Java 并发](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20并发.md)
-只整理了一些比较基础的概念,之后会继续添加更多内容。
+整理了一些并发的基本概念。
> [Java 容器](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20容器.md)
diff --git a/notes/Linux.md b/notes/Linux.md
index 9e0fdcee..f19f3e11 100644
--- a/notes/Linux.md
+++ b/notes/Linux.md
@@ -64,13 +64,6 @@
* [waitpid()](#waitpid)
* [孤儿进程](#孤儿进程)
* [僵死进程](#僵死进程)
-* [十一、I/O 复用](#十一io-复用)
- * [概念理解](#概念理解)
- * [I/O 模型](#io-模型)
- * [select poll epoll](#select-poll-epoll)
- * [select 和 poll 比较](#select-和-poll-比较)
- * [eopll 工作模式](#eopll-工作模式)
- * [select poll epoll 应用场景](#select-poll-epoll-应用场景)
* [参考资料](#参考资料)
@@ -1208,7 +1201,7 @@ pid_t wait(int *status)
如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 - 1,同时 errno 被置为 ECHILD。
-参数 status 用来保存被收集进程退出时的一些状态,如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,我们就可以设定这个参数为 NULL:
+参数 status 用来保存被收集进程退出时的一些状态,如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,以设定这个参数为 NULL:
```c
pid = wait(NULL);
@@ -1217,12 +1210,12 @@ pid = wait(NULL);
## waitpid()
```c
-pid_t waitpid(pid_t pid,int *status,int options)
+pid_t waitpid(pid_t pid, int *status, int options)
```
作用和 wait() 完全相同,但是多了两个可由用户控制的参数 pid 和 options。
-pid 参数指示一个子进程的 ID,表示只关心这个子进程的退出 SIGCHLD 信号。如果 pid=-1 时,那么贺 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。
+pid 参数指示一个子进程的 ID,表示只关心这个子进程的退出 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。
options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 waitpid() 调用变成非阻塞的,也就是说它会立即返回,父进程可以继续执行其它任务。
@@ -1242,298 +1235,10 @@ options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 w
要消灭系统中大量的僵死进程,只需要将其父进程杀死,此时所有的僵死进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵死进程。
-# 十一、I/O 复用
-
-## 概念理解
-
-I/O Multiplexing 又被称为 Event Driven I/O,它可以让单个进程具有处理多个 I/O 事件的能力。
-
-当某个 I/O 事件条件满足时,进程会收到通知。
-
-如果一个 Web 服务器没有 I/O 复用,那么每一个 Socket 连接都需要创建一个线程去处理。如果同时连接几万个连接,那么就需要创建相同数量的线程。并且相比于多进程和多线程技术,I/O 复用不需要进程线程创建和切换的开销,系统开销更小。
-
-## I/O 模型
-
-- 阻塞(Blocking)
-- 非阻塞(Non-blocking)
-- 同步(Synchronous)
-- 异步(Asynchronous)
-
-阻塞非阻塞是等待 I/O 完成的方式,阻塞要求用户程序停止执行,直到 I/O 完成,而非阻塞在 I/O 完成之前还可以继续执行。
-
-同步异步是获知 I/O 完成的方式,同步需要时刻关心 I/O 是否已经完成,异步无需主动关心,在 I/O 完成时它会收到通知。
-
-
-
-
-### 1. 同步-阻塞
-
-这是最常见的一种模型,用户程序在使用 read() 时会执行系统调用从而陷入内核,之后就被阻塞直到系统调用完成。
-
-应该注意到,在阻塞的过程中,其他程序还可以执行,因此阻塞不意味着整个操作系统都被阻塞。因为其他程序还可以执行,因此不消耗 CPU 时间,这种模型的执行效率会比较高。
-
-
-
-### 2. 同步-非阻塞
-
-非阻塞意味着用户程序在执行系统调用后还可以继续执行,内核并不是马上执行完 I/O,而是以一个错误码来告知用户程序 I/O 还未完成。为了获得 I/O 完成事件,用户程序必须调用多次系统调用去询问内核,甚至是忙等,也就是在一个循环里面一直询问并等待。
-
-由于 CPU 要处理更多的用户程序的询问,因此这种模型的效率是比较低的。
-
-
-
-### 3. 异步
-
-该模式下,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_set 表示描述符集合;
-- readset、writeset 和 exceptset 这三个参数指定让操作系统内核测试读、写和异常条件的描述符;
-- timeout 参数告知内核等待所指定描述符中的任何一个就绪可花多少时间;
-- 成功调用返回结果大于 0;出错返回结果为 -1;超时返回结果为 0。
-
-```c
-fd_set fd_in, fd_out;
-struct timeval tv;
-
-// Reset the sets
-FD_ZERO( &fd_in );
-FD_ZERO( &fd_out );
-
-// Monitor sock1 for input events
-FD_SET( sock1, &fd_in );
-
-// Monitor sock2 for output events
-FD_SET( sock2, &fd_out );
-
-// Find out which socket has the largest numeric value as select requires it
-int largest_sock = sock1 > sock2 ? sock1 : sock2;
-
-// Wait up to 10 seconds
-tv.tv_sec = 10;
-tv.tv_usec = 0;
-
-// Call the select
-int ret = select( largest_sock + 1, &fd_in, &fd_out, NULL, &tv );
-
-// Check if select actually succeed
-if ( ret == -1 )
- // report error and abort
-else if ( ret == 0 )
- // timeout; no event detected
-else
-{
- if ( FD_ISSET( sock1, &fd_in ) )
- // input event on sock1
-
- if ( FD_ISSET( sock2, &fd_out ) )
- // output event on sock2
-}
-```
-
-每次调用 select() 都需要将 fd_set \*readfds, fd_set \*writefds, fd_set \*exceptfds 链表内容全部从用户进程内存中复制到操作系统内核中,内核需要将所有 fd_set 遍历一遍,这个过程非常低效。
-
-返回结果中内核并没有声明哪些 fd_set 已经准备好了,所以如果返回值大于 0 时,程序需要遍历所有的 fd_set 判断哪个 I/O 已经准备好。
-
-在 Linux 中 select 最多支持 1024 个 fd_set 同时轮询,其中 1024 由 Linux 内核的 FD_SETSIZE 决定。如果需要打破该限制可以修改 FD_SETSIZE,然后重新编译内核。
-
-### 2. poll
-
-```c
-int poll (struct pollfd *fds, unsigned int nfds, int timeout);
-```
-
-```c
-struct pollfd {
- int fd; //文件描述符
- short events; //监视的请求事件
- short revents; //已发生的事件
-};
-```
-
-```c
-// The structure for two events
-struct pollfd fds[2];
-
-// Monitor sock1 for input
-fds[0].fd = sock1;
-fds[0].events = POLLIN;
-
-// Monitor sock2 for output
-fds[1].fd = sock2;
-fds[1].events = POLLOUT;
-
-// Wait 10 seconds
-int ret = poll( &fds, 2, 10000 );
-// Check if poll actually succeed
-if ( ret == -1 )
- // report error and abort
-else if ( ret == 0 )
- // timeout; no event detected
-else
-{
- // If we detect the event, zero it out so we can reuse the structure
- if ( pfd[0].revents & POLLIN )
- pfd[0].revents = 0;
- // input event on sock1
-
- if ( pfd[1].revents & POLLOUT )
- pfd[1].revents = 0;
- // output event on sock2
-}
-```
-
-它和 select() 功能基本相同。同样需要每次将 struct pollfd \*fds 复制到内核,返回后同样需要进行轮询每一个 pollfd 是否已经 I/O 准备好。poll() 取消了 1024 个描述符数量上限,但是数量太大以后不能保证执行效率,因为复制大量内存到内核十分低效,所需时间与描述符数量成正比。poll() 在 pollfd 的重复利用上比 select() 的 fd_set 会更好。
-
-如果在多线程下,如果一个线程对某个描述符调用了 poll() 系统调用,但是另一个线程关闭了该描述符,会导致 poll() 调用结果不确定,该问题同样出现在 select() 中。
-
-### 3. epoll
-
-```c
-int epoll_create(int size);
-int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
-int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
-```
-
-```c
-// Create the epoll descriptor. Only one is needed per app, and is used to monitor all sockets.
-// The function argument is ignored (it was not before, but now it is), so put your favorite number here
-int pollingfd = epoll_create( 0xCAFE );
-
-if ( pollingfd < 0 )
- // report error
-
-// Initialize the epoll structure in case more members are added in future
-struct epoll_event ev = { 0 };
-
-// Associate the connection class instance with the event. You can associate anything
-// you want, epoll does not use this information. We store a connection class pointer, pConnection1
-ev.data.ptr = pConnection1;
-
-// Monitor for input, and do not automatically rearm the descriptor after the event
-ev.events = EPOLLIN | EPOLLONESHOT;
-// Add the descriptor into the monitoring list. We can do it even if another thread is
-// waiting in epoll_wait - the descriptor will be properly added
-if ( epoll_ctl( epollfd, EPOLL_CTL_ADD, pConnection1->getSocket(), &ev ) != 0 )
- // report error
-
-// Wait for up to 20 events (assuming we have added maybe 200 sockets before that it may happen)
-struct epoll_event pevents[ 20 ];
-
-// Wait for 10 seconds, and retrieve less than 20 epoll_event and store them into epoll_event array
-int ready = epoll_wait( pollingfd, pevents, 20, 10000 );
-// Check if epoll actually succeed
-if ( ret == -1 )
- // report error and abort
-else if ( ret == 0 )
- // timeout; no event detected
-else
-{
- // Check if any events detected
- for ( int i = 0; i < ret; i++ )
- {
- if ( pevents[i].events & EPOLLIN )
- {
- // Get back our connection pointer
- Connection * c = (Connection*) pevents[i].data.ptr;
- c->handleReadEvent();
- }
- }
-}
-```
-
-epoll 仅仅适用于 Linux OS。
-
-它是 select 和 poll 的增强版,更加灵活而且没有描述符限制。它将用户关心的描述符放到内核的一个事件表中,从而只需要在用户空间和内核空间拷贝一次。
-
-select 和 poll 方式中,进程只有在调用一定的方法后,内核才对所有监视的描述符进行扫描。而 epoll 事先通过 epoll_ctl() 来注册描述符,一旦基于某个描述符就绪时,内核会采用类似 callback 的回调机制,迅速激活这个描述符,当进程调用 epoll_wait() 时便得到通知。
-
-新版本的 epoll_create(int size) 参数 size 不起任何作用,在旧版本的 epoll 中如果描述符的数量大于 size,不保证服务质量。
-
-epoll_ctl() 执行一次系统调用,用于向内核注册新的描述符或者是改变某个文件描述符的状态。已注册的描述符在内核中会被维护在一棵红黑树上,通过回调函数内核会将 I/O 准备好的描述符加入到一个链表中管理。
-
-epoll_wait() 取出在内核中通过链表维护的 I/O 准备好的描述符,将他们从内核复制到程序中,不需要像 select/poll 对注册的所有描述符遍历一遍。
-
-epoll 对多线程编程更有友好,同时多个线程对同一个描述符调用了 epoll_wait 也不会产生像 select/poll 的不确定情况。或者一个线程调用了 epoll_wait 另一个线程关闭了同一个描述符也不会产生不确定情况。
-
-## select 和 poll 比较
-
-### 1. 功能
-
-它们提供了几乎相同的功能,但是在一些细节上有所不同:
-
-- select 会修改 fd_set 参数,而 poll 不会;
-- select 默认只能监听 1024 个描述符,如果要监听更多的话,需要修改 FD_SETSIZE 之后重新编译;
-- poll 提供了更多的事件类型。
-
-### 2. 速度
-
-poll 和 select 在速度上都很慢。
-
-- 它们都采取轮询的方式来找到 I/O 完成的描述符,如果描述符很多,那么速度就会很慢;
-- select 只使用每个描述符的 3 位,而 poll 通常需要使用 64 位,因此 poll 需要复制更多的内核空间。
-
-### 3. 可移植性
-
-几乎所有的系统都支持 select,但是只有比较新的系统支持 poll。
-
-## eopll 工作模式
-
-epoll_event 有两种触发模式:LT(level trigger)和 ET(edge trigger)。
-
-### 1. LT 模式
-
-当 epoll_wait() 检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用 epoll_wait() 时,会再次响应应用程序并通知此事件。是默认的一种模式,并且同时支持 Blocking 和 No-Blocking。
-
-### 2. ET 模式
-
-当 epoll_wait() 检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用 epoll_wait() 时,不会再次响应应用程序并通知此事件。很大程度上减少了 epoll 事件被重复触发的次数,因此效率要比 LT 模式高。只支持 No-Blocking,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。
-
-## select poll epoll 应用场景
-
-很容易产生一种错觉认为只要用 epoll 就可以了,select poll 都是历史遗留问题,并没有什么应用场景,其实并不是这样的。
-
-### 1. select 应用场景
-
-select() poll() epoll_wait() 都有一个 timeout 参数,在 select() 中 timeout 的精确度为 1ns,而 poll() 和 epoll_wait() 中则为 1ms。所以 select 更加适用于实时要求更高的场景,比如核反应堆的控制。
-
-select 历史更加悠久,它的可移植性更好,几乎被所有主流平台所支持。
-
-### 2. poll 应用场景
-
-poll 没有最大描述符数量的限制,如果平台支持应该采用 poll 且对实时性要求并不是十分严格,而不是 select。
-
-需要同时监控小于 1000 个描述符。那么也没有必要使用 epoll,因为这个应用场景下并不能体现 epoll 的优势。
-
-需要监控的描述符状态变化多,而且都是非常短暂的。因为 epoll 中的所有描述符都存储在内核中,造成每次需要对描述符的状态改变都需要通过 epoll_ctl() 进行系统调用,频繁系统调用降低效率。epoll 的描述符存储在内核,不容易调试。
-
-### 3. epoll 应用场景
-
-程序只需要运行在 Linux 平台上,有非常大量的描述符需要同时轮询,而且这些连接最好是长连接。
-
-### 4. 性能对比
-
-> [epoll Scalability Web Page](http://lse.sourceforge.net/epoll/index.html)
-
# 参考资料
- 鸟哥. 鸟 哥 的 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)
-- [Linux IO 模式及 select、poll、epoll 详解](https://segmentfault.com/a/1190000003063859)
-- [poll vs select vs event-based](https://daniel.haxx.se/docs/poll-vs-select.html)
- [Linux 之守护进程、僵死进程与孤儿进程](http://liubigbin.github.io/2016/03/11/Linux-%E4%B9%8B%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E3%80%81%E5%83%B5%E6%AD%BB%E8%BF%9B%E7%A8%8B%E4%B8%8E%E5%AD%A4%E5%84%BF%E8%BF%9B%E7%A8%8B/)
- [Linux process states](https://idea.popcount.org/2012-12-11-linux-process-states/)
- [GUID Partition Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
diff --git a/notes/Socket.md b/notes/Socket.md
new file mode 100644
index 00000000..1243e6f5
--- /dev/null
+++ b/notes/Socket.md
@@ -0,0 +1,343 @@
+
+* [一、I/O 复用](#一io-复用)
+ * [I/O 模型](#io-模型)
+ * [select/poll/epoll](#selectpollepoll)
+ * [select 和 poll 比较](#select-和-poll-比较)
+ * [eopll 工作模式](#eopll-工作模式)
+ * [select poll epoll 应用场景](#select-poll-epoll-应用场景)
+* [参考资料](#参考资料)
+
+
+
+# 一、I/O 复用
+
+## I/O 模型
+
+一个输入操作通常包括两个阶段:
+
+- 等待数据准备好
+- 从内核向进程复制数据
+
+对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。
+
+Unix 下有五种 I/O 模型:
+
+- 阻塞式 I/O
+- 非阻塞式 I/O
+- I/O 复用(select 和 poll)
+- 信号驱动式 I/O(SIGIO)
+- 异步 I/O(AIO)
+
+### 1. 阻塞式 I/O
+
+应用进程被阻塞,直到数据复制到应用进程缓冲区中才返回。
+
+应该注意到,在阻塞的过程中,其它程序还可以执行,因此阻塞不意味着整个操作系统都被阻塞。因为其他程序还可以执行,因此不消耗 CPU 时间,这种模型的执行效率会比较高。
+
+下图中,recvfrom 用于接收 Socket 传来的数据,并复制到应用进程的缓冲区 buf 中。这里把 recvfrom() 当成系统调用。
+
+```c
+ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
+```
+
+
+
+### 2. 非阻塞式 I/O
+
+应用进程执行系统调用之后,内核返回一个错误码。应用进程可以继续执行,但是需要不断的执行系统调用来获知 I/O 是否完成,这种方式成为轮询(polling)。
+
+由于 CPU 要处理更多的系统调用,因此这种模型是比较低效的。
+
+
+
+### 3. I/O 复用
+
+使用 select 或者 poll 等待数据,并且可以等待多个套接字中的任何一个变为可读,这一过程会被阻塞,当某一个套接字可读时返回。之后再使用 recvfrom 把数据从内核复制到进程中。
+
+它可以让单个进程具有处理多个 I/O 事件的能力。又被称为 Event Driven I/O,即事件驱动 I/O。
+
+如果一个 Web 服务器没有 I/O 复用,那么每一个 Socket 连接都需要创建一个线程去处理。如果同时有几万个连接,那么就需要创建相同数量的线程。并且相比于多进程和多线程技术,I/O 复用不需要进程线程创建和切换的开销,系统开销更小。
+
+
+
+### 4. 信号驱动 I/O
+
+应用进程使用 sigaction 系统调用,内核立即返回,应用进程可以继续执行,也就是说等待数据阶段应用进程是非阻塞的。内核在数据到达时向应用进程发送 SIGIO 信号,应用进程收到之后在信号处理程序中调用 recvfrom 将数据从内核复制到应用进程中。
+
+相比于非阻塞式 I/O 的轮询方式,信号驱动 I/O 的 CPU 利用率更高。
+
+
+
+### 5. 异步 I/O
+
+进行 aio_read 系统调用会立即返回,应用进程继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号。
+
+异步 I/O 与信号驱动 I/O 的区别在于,异步 I/O 的信号是通知应用进程 I/O 完成,而信号驱动 I/O 的信号是通知应用进程可以开始 I/O。
+
+
+
+### 6. 同步 I/O 与异步 I/O
+
+- 同步 I/O:应用进程在调用 recvfrom 操作时会阻塞。
+- 异步 I/O:不会阻塞。
+
+阻塞式 I/O、非阻塞式 I/O、I/O 复用和信号驱动 I/O 都是同步 I/O,虽然非阻塞式 I/O 和信号驱动 I/O 在等待数据阶段不会阻塞,但是在之后的将数据从内核复制到应用进程这个操作会阻塞。
+
+### 7. 五大 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_set 表示描述符集合类型,有三个参数:readset、writeset 和 exceptset,分别对应读、写、异常条件的描述符集合。
+
+timeout 参数告知内核等待所指定描述符中的任何一个就绪可花多少时间;
+
+成功调用返回结果大于 0;出错返回结果为 -1;超时返回结果为 0。
+
+每次调用 select 都需要将 fd_set \*readfds, fd_set \*writefds, fd_set \*exceptfds 链表内容全部从应用进程缓冲复制到内核缓冲。
+
+返回结果中内核并没有声明 fd_set 中哪些描述符已经准备好,所以如果返回值大于 0 时,应用进程需要遍历所有的 fd_set。
+
+select 最多支持 1024 个描述符,其中 1024 由内核的 FD_SETSIZE 决定。如果需要打破该限制可以修改 FD_SETSIZE,然后重新编译内核。
+
+```c
+fd_set fd_in, fd_out;
+struct timeval tv;
+
+// Reset the sets
+FD_ZERO( &fd_in );
+FD_ZERO( &fd_out );
+
+// Monitor sock1 for input events
+FD_SET( sock1, &fd_in );
+
+// Monitor sock2 for output events
+FD_SET( sock2, &fd_out );
+
+// Find out which socket has the largest numeric value as select requires it
+int largest_sock = sock1 > sock2 ? sock1 : sock2;
+
+// Wait up to 10 seconds
+tv.tv_sec = 10;
+tv.tv_usec = 0;
+
+// Call the select
+int ret = select( largest_sock + 1, &fd_in, &fd_out, NULL, &tv );
+
+// Check if select actually succeed
+if ( ret == -1 )
+ // report error and abort
+else if ( ret == 0 )
+ // timeout; no event detected
+else
+{
+ if ( FD_ISSET( sock1, &fd_in ) )
+ // input event on sock1
+
+ if ( FD_ISSET( sock2, &fd_out ) )
+ // output event on sock2
+}
+```
+
+### 2. poll
+
+```c
+int poll(struct pollfd *fds, unsigned int nfds, int timeout);
+```
+
+```c
+struct pollfd {
+ int fd; //文件描述符
+ short events; //监视的请求事件
+ short revents; //已发生的事件
+};
+```
+
+它和 select 功能基本相同。同样需要每次将描述符从应用进程复制到内核,poll 调用返回后同样需要进行轮询才能知道哪些描述符已经准备好。
+
+poll 取消了 1024 个描述符数量上限,但是数量太大以后不能保证执行效率,因为复制大量内存到内核十分低效,所需时间与描述符数量成正比。
+
+poll 在描述符的重复利用上比 select 的 fd_set 会更好。
+
+如果在多线程下,如果一个线程对某个描述符调用了 poll 系统调用,但是另一个线程关闭了该描述符,会导致 poll 调用结果不确定,该问题同样出现在 select 中。
+
+```c
+// The structure for two events
+struct pollfd fds[2];
+
+// Monitor sock1 for input
+fds[0].fd = sock1;
+fds[0].events = POLLIN;
+
+// Monitor sock2 for output
+fds[1].fd = sock2;
+fds[1].events = POLLOUT;
+
+// Wait 10 seconds
+int ret = poll( &fds, 2, 10000 );
+// Check if poll actually succeed
+if ( ret == -1 )
+ // report error and abort
+else if ( ret == 0 )
+ // timeout; no event detected
+else
+{
+ // If we detect the event, zero it out so we can reuse the structure
+ if ( pfd[0].revents & POLLIN )
+ pfd[0].revents = 0;
+ // input event on sock1
+
+ if ( pfd[1].revents & POLLOUT )
+ pfd[1].revents = 0;
+ // output event on sock2
+}
+```
+
+### 3. epoll
+
+```c
+int epoll_create(int size);
+int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
+int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
+```
+
+epoll 仅仅适用于 Linux OS。
+
+它是 select 和 poll 的增强版,更加灵活而且没有描述符数量限制。
+
+它将用户关心的描述符放到内核的一个事件表中,从而只需要在用户空间和内核空间拷贝一次。
+
+select 和 poll 方式中,进程只有在调用一定的方法后,内核才对所有监视的描述符进行扫描。而 epoll 事先通过 epoll_ctl() 来注册描述符,一旦基于某个描述符就绪时,内核会采用类似 callback 的回调机制,迅速激活这个描述符,当进程调用 epoll_wait() 时便得到通知。
+
+新版本的 epoll_create(int size) 参数 size 不起任何作用,在旧版本的 epoll 中如果描述符的数量大于 size,不保证服务质量。
+
+epoll_ctl() 执行一次系统调用,用于向内核注册新的描述符或者是改变某个文件描述符的状态。已注册的描述符在内核中会被维护在一棵红黑树上,通过回调函数内核会将 I/O 准备好的描述符加入到一个链表中管理。
+
+epoll_wait() 取出在内核中通过链表维护的 I/O 准备好的描述符,将他们从内核复制到应用进程中,不需要像 select/poll 对注册的所有描述符遍历一遍。
+
+epoll 对多线程编程更有友好,同时多个线程对同一个描述符调用了 epoll_wait() 也不会产生像 select/poll 的不确定情况。或者一个线程调用了 epoll_wait 另一个线程关闭了同一个描述符也不会产生不确定情况。
+
+```c
+// Create the epoll descriptor. Only one is needed per app, and is used to monitor all sockets.
+// The function argument is ignored (it was not before, but now it is), so put your favorite number here
+int pollingfd = epoll_create( 0xCAFE );
+
+if ( pollingfd < 0 )
+ // report error
+
+// Initialize the epoll structure in case more members are added in future
+struct epoll_event ev = { 0 };
+
+// Associate the connection class instance with the event. You can associate anything
+// you want, epoll does not use this information. We store a connection class pointer, pConnection1
+ev.data.ptr = pConnection1;
+
+// Monitor for input, and do not automatically rearm the descriptor after the event
+ev.events = EPOLLIN | EPOLLONESHOT;
+// Add the descriptor into the monitoring list. We can do it even if another thread is
+// waiting in epoll_wait - the descriptor will be properly added
+if ( epoll_ctl( epollfd, EPOLL_CTL_ADD, pConnection1->getSocket(), &ev ) != 0 )
+ // report error
+
+// Wait for up to 20 events (assuming we have added maybe 200 sockets before that it may happen)
+struct epoll_event pevents[ 20 ];
+
+// Wait for 10 seconds, and retrieve less than 20 epoll_event and store them into epoll_event array
+int ready = epoll_wait( pollingfd, pevents, 20, 10000 );
+// Check if epoll actually succeed
+if ( ret == -1 )
+ // report error and abort
+else if ( ret == 0 )
+ // timeout; no event detected
+else
+{
+ // Check if any events detected
+ for ( int i = 0; i < ret; i++ )
+ {
+ if ( pevents[i].events & EPOLLIN )
+ {
+ // Get back our connection pointer
+ Connection * c = (Connection*) pevents[i].data.ptr;
+ c->handleReadEvent();
+ }
+ }
+}
+```
+
+## select 和 poll 比较
+
+### 1. 功能
+
+它们提供了几乎相同的功能,但是在一些细节上有所不同:
+
+- select 会修改 fd_set 参数,而 poll 不会;
+- select 默认只能监听 1024 个描述符,如果要监听更多的话,需要修改 FD_SETSIZE 之后重新编译;
+- poll 提供了更多的事件类型。
+
+### 2. 速度
+
+poll 和 select 在速度上都很慢。
+
+- 它们都采取轮询的方式来找到 I/O 完成的描述符,如果描述符很多,那么速度就会很慢;
+- select 只使用每个描述符的 3 位,而 poll 通常需要使用 64 位,因此 poll 需要复制更多的内核空间。
+
+### 3. 可移植性
+
+几乎所有的系统都支持 select,但是只有比较新的系统支持 poll。
+
+## eopll 工作模式
+
+epoll_event 有两种触发模式:LT(level trigger)和 ET(edge trigger)。
+
+### 1. LT 模式
+
+当 epoll_wait() 检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用 epoll_wait() 时,会再次响应应用程序并通知此事件。是默认的一种模式,并且同时支持 Blocking 和 No-Blocking。
+
+### 2. ET 模式
+
+当 epoll_wait() 检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用 epoll_wait() 时,不会再次响应应用程序并通知此事件。很大程度上减少了 epoll 事件被重复触发的次数,因此效率要比 LT 模式高。只支持 No-Blocking,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。
+
+## select poll epoll 应用场景
+
+很容易产生一种错觉认为只要用 epoll 就可以了,select poll 都是历史遗留问题,并没有什么应用场景,其实并不是这样的。
+
+### 1. select 应用场景
+
+select() poll() epoll_wait() 都有一个 timeout 参数,在 select() 中 timeout 的精确度为 1ns,而 poll() 和 epoll_wait() 中则为 1ms。所以 select 更加适用于实时要求更高的场景,比如核反应堆的控制。
+
+select 历史更加悠久,它的可移植性更好,几乎被所有主流平台所支持。
+
+### 2. poll 应用场景
+
+poll 没有最大描述符数量的限制,如果平台支持应该采用 poll 且对实时性要求并不是十分严格,而不是 select。
+
+需要同时监控小于 1000 个描述符。那么也没有必要使用 epoll,因为这个应用场景下并不能体现 epoll 的优势。
+
+需要监控的描述符状态变化多,而且都是非常短暂的。因为 epoll 中的所有描述符都存储在内核中,造成每次需要对描述符的状态改变都需要通过 epoll_ctl() 进行系统调用,频繁系统调用降低效率。epoll 的描述符存储在内核,不容易调试。
+
+### 3. epoll 应用场景
+
+程序只需要运行在 Linux 平台上,有非常大量的描述符需要同时轮询,而且这些连接最好是长连接。
+
+### 4. 性能对比
+
+> [epoll Scalability Web Page](http://lse.sourceforge.net/epoll/index.html)
+
+# 参考资料
+
+- Stevens W R, Fenner B, Rudoff A M. UNIX network programming[M]. Addison-Wesley Professional, 2004.
+- [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)
+- [Linux IO 模式及 select、poll、epoll 详解](https://segmentfault.com/a/1190000003063859)
+- [poll vs select vs event-based](https://daniel.haxx.se/docs/poll-vs-select.html)
diff --git a/pics/1492928105791_3.png b/pics/1492928105791_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..d18fc1cae99fe250d8473bf5737ef1f0d4e3159f
GIT binary patch
literal 47104
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
literal 0
HcmV?d00001
diff --git a/pics/1492928416812_4.png b/pics/1492928416812_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..a43a731b5e0404d75801afb9e5111bca3d1e0df6
GIT binary patch
literal 28672
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