基于 I/O多路复用的并发编程

I/O 多路复用(I/O multiplexing)技术的基本思想是使用 select 函数,要求内核挂起进程,只有在一个或多个 I/O 事件发生后,才将控制返回给应用程序。

select 的几个关键点

  1. select 监控的时文件描述符集合

    在 Unix 里,socket,管道,标准输入输出,本质上都能抽象成 fd

  2. select 默认是阻塞等待

    如果没有任何 fd 就绪,他就“睡着”,有事件来了才返回。

  3. 返回后要自己判断是哪几个 fd 就绪了

  4. select 适合 fd 数量不太大时使用,因为它每次都要扫描集合,效率一般。

多个都 ready 时,一个个处理

相比普通阻塞 read / accept,I/O 多路复用可以同时服务多个 I/O 对象。

进程的优劣

对于在父、子进程间共享状态信息,进程有一个非常清晰的模型:共享文件表,但是不共享用户地址空间。进程有独立的地址空间既是优点也是缺点。

优点:这样一来,一个进程不可能不小心覆盖另一个进程的虚拟内存(隔离性)。

缺点:另一方面,独立的地址空间使得进程共享状态信息变得更加困难。为了共享信息,它们必须使用显式的 IPC(进程间通信)机制,他们往往比较慢,因为进程控制和 IPC 的开销很高。

I/O 多路复用技术的优劣

I/O 多路复用可以做并发事件驱动程序的基础。在事件驱动程序中,某些事件会导致流向前推进。一般的思路是将逻辑流模型化(画)为状态机。

例:并发事件驱动 echo 服务器中逻辑流的状态机

例:并发事件驱动 echo 服务器中逻辑流的状态机

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