I/O 多路复用(I/O multiplexing)技术的基本思想是使用 select 函数,要求内核挂起进程,只有在一个或多个 I/O 事件发生后,才将控制返回给应用程序。
select 的几个关键点
select 监控的时文件描述符集合
在 Unix 里,socket,管道,标准输入输出,本质上都能抽象成 fd
select 默认是阻塞等待
如果没有任何 fd 就绪,他就“睡着”,有事件来了才返回。
返回后要自己判断是哪几个 fd 就绪了
select 适合 fd 数量不太大时使用,因为它每次都要扫描集合,效率一般。
多个都 ready 时,一个个处理
相比普通阻塞 read / accept,I/O 多路复用可以同时服务多个 I/O 对象。
对于在父、子进程间共享状态信息,进程有一个非常清晰的模型:共享文件表,但是不共享用户地址空间。进程有独立的地址空间既是优点也是缺点。
优点:这样一来,一个进程不可能不小心覆盖另一个进程的虚拟内存(隔离性)。
缺点:另一方面,独立的地址空间使得进程共享状态信息变得更加困难。为了共享信息,它们必须使用显式的 IPC(进程间通信)机制,他们往往比较慢,因为进程控制和 IPC 的开销很高。
I/O 多路复用可以做并发事件驱动程序的基础。在事件驱动程序中,某些事件会导致流向前推进。一般的思路是将逻辑流模型化(画)为状态机。

例:并发事件驱动 echo 服务器中逻辑流的状态机
服务器使用 I/O 多路复用,借助 select 函数检测输入事件的发生。当每个已连接描述符准备好可读时,服务器就为相应的状态机执行转移,在这里就是从描述符读和写回一个文本行。