Linux 多路复用 I/O 技术详解(上)
1. 非阻塞 I/O 的局限性与多路复用 I/O 的引入
在处理 I/O 问题时,非阻塞 I/O 曾是一种解决方案。使用非阻塞 I/O 时,应用程序可以发起 I/O 请求,若操作无法立即完成,会返回一个特殊的错误条件,而不是阻塞进程。然而,这种方法效率较低,原因主要有两点:
- 首先,进程需要以任意顺序不断发起 I/O 操作,等待其中一个打开的文件描述符准备好进行 I/O,这是一种糟糕的程序设计。
- 其次,如果程序能够进入睡眠状态,释放处理器资源用于其他任务,仅在一个或多个文件描述符准备好进行 I/O 时被唤醒,效率会更高。
为了解决这些问题,多路复用 I/O 应运而生。它允许应用程序同时在多个文件描述符上阻塞,并在其中任何一个准备好进行读写而不阻塞时收到通知。多路复用 I/O 的工作流程如下:
1. 多路复用 I/O:告知系统哪些文件描述符准备好进行 I/O 时通知我。
2. 没有准备好的?进入睡眠状态,直到有一个或多个文件描述符准备好。
3. 被唤醒!哪些准备好啦?
4. 处理所有准备好进行 I/O 的文件描述符,且不发生阻塞。
5. 回到步骤 1。
Linux 提供了三种多路复用 I/O 解决方案: select 、 poll 和 epoll 接口。这里我们先介绍前两种。
2. select() 系统调用
select() 系统调用为实现同步多路复用 I/O 提供了一种机制,其函数原型如下: </
超级会员免费看
订阅专栏 解锁全文
1219

被折叠的 条评论
为什么被折叠?



