1 概述
同时监视多个I/O条件,在其中任意一个就绪时通知进程,这样的能力称为I/O复用,由select和poll函数支持,较新的还有Posix中的pselect函数。(Linux中还多出了epoll)
应用场合:
1. 同时处理多个描述符时,必须用。
2. 同时处理多个套接字时,比较少见。
3. 既要处理监听套接字,又要处理已连接套接字。
4. 既要处理TCP,又要处理UDP。
5. 要处理多个服务器或多个协议。
2 I/O模型
Unix可用的5种I/O模型:
1. 阻塞式I/O;
2. 非阻塞I/O;
3. I/O复用;
4. 信号驱动式I/O(SIGIO);
5. 异步I/O(Posix的aio_系列函数)。
一个输入操作一般包括两个阶段:等待数据、从内核和进程复制数据。
2.1 阻塞式I/O模型
直到复制完成或发生错误才返回,如被信号打断。
2.2 非阻塞式I/O模型
无数据时直接返回错误,不会陷入睡眠,有数据时直接复制数据。
2.3 I/O复用模型
阻塞在select或poll上,而不是阻塞在真正的I/O系统调用上。另一种I/O模型是在多线程中使用阻塞I/O,每个线程处理一个文件描述符,这样类似于select,但更自由,不过开销也更大。