今天我们来进行架构探险:从零开始写分布式服务框架,你能学会吗?(12)

非阻塞I/O模型

(3) I/O复用模型: Linux提供select/poll 进程通过将一个或多个fd传递给select或poll系统调用 , 阻塞在select;这样select/poll可以帮我们侦测许多fd 是否就绪 。 但是select/poll是顺序扫描fd是否就绪的 , 而且支持的fd数量有限 。 Linux还提供了-一个epoll系统调用 , epoll 基于事件驱动方式 , 而不是顺序扫描 , 当有fd就绪时 , 立即回调函数rollback , 如图6-3所示 。

I/O复用模型

(4)信号驱动异步I/O 模型:首先开启套接口信号驱动I/O功能 , 并通过系统调用sigaction安装一-个信 号处理函数(此系统调用立即返回 , 进程继续工作 , 它是非阻塞的) 。

当数据报准备好被读时 , 就为该进程生成一个SIGIO信号 。 随即可以在信号处理程序中调用recvfrom来读数据报 , 并通知主循环数据已准备好被处理 。 也可以通知主循环 , 让它来读数据报 , 如图6-4所示 。

(5)异步I/O模型:告知内核启动某个操作 , 并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓冲区)通知我们 。 这种模型与信号驱动模型的主要区别是信号驱动I/O由内核通知我们何时可以启动一个I/O操作;异步I/O模型由内核通知我们I/O操作何时完成 , 如图6-5所示 。

推荐阅读