Unix/Linux 网络 IO 模型简介

明月清风 2017-02-12 170浏览
首页/正文
分享到: / / / /

概述

Linux内核将所有外部设备都看做一个文件来操作。对该文件的读写操作会调用内核提供的系统命令, 返回一个 fd(file descriptor) 文件描述符。而对一个 socket 的读写也有相应的描述符即 socketfd。 描述符即一串数字,指向内核中的一个结构体 Unix、Linux 提供五种 i/o 模型,分别如下:

阻塞i/o模型

最常用的 I/O 模型就是阻塞 I/O 模型。缺省情况下,所有文件操作都是阻塞的。我们以套接字接口为例讲解此模型:在进程空间中调用 recvfrom,其系统调用直到数据包到达被复制到应用进程中的缓冲区中或者发生错误时才返回。在此期间一直会等待,进程在从调用recvfrom开始到它返回的整段时间内都是被阻塞的。 流程如下图:

img

非阻塞 i/o 模型

recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个 EWOULDBLOCK 错误,一般都对非阻塞 I/O 模型进行轮询检查这个状态,看内核是否有数据到来,流程如下图:

img

I/O 复用模型

linux 提供 select/poll,进程通过将一个或多个 fd 传递给 select 或 poll 系统调用,阻塞在 select 操作上,这样 select/poll 可以帮我们侦测多个 fd 是否处在就绪状态。select/poll 顺序扫描 fd 是否就绪,且支持 fd 数量有限,因此它的使用受到一些制约。linux 还提供一个 epoll 系统调用,epoll 使用基于事件驱动方式代替顺序扫描,因此性能更高,当有 fd 就绪时,立即回调函数 rollback。流程如下图:

img

信号驱动 I/O 模型

首先开启套接口信号驱动 I/O 功能,并通过系统调用 sigaction 执行一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据准备就绪时,就为该进程生成一个 sigio 信号,通过信号回调通知应用程序调用 recvfrom 来读取数据,并通知主循环函数处理数据。流程如下图:

img

异步 I/O 模型

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

img

最后修改:2017-02-12 10:54:07 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇