Linux网络I/O模型整理

来源:互联网 发布:edi网络传输的数据是 编辑:程序博客网 时间:2024/05/22 16:38

Linux的内核将所有外部设备都看作一个文件来操作,对一个文件的读写操作会调用内核的系统命令,返回一个fd(file descriptor),对于socket则对应为socket描述符,描述符就是一个数字,指向内核中的一个结构体(文件路径、数据区等)。
根据对I/O模型的分类,linux提供了5种I/O模型。包括阻塞I/O模型、非阻塞I/O模型、I/O复用模型、信号驱动I/O模型、异步I/O。下面将一一介绍。

阻塞I/O模型

阻塞I/O模型
进程从调用recvfrom开始到返回的整段时间内都是被阻塞的。

非阻塞I/O模型

非阻塞I/O模型

I/O复用模型

select/poll机制实现,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样select/poll可以侦测多个fd是否处于就绪状态。select/poll是顺序扫描fd是否就绪,支持的fd数量有限。
epoll使用基于事件驱动方式代替顺序扫描,性能更高,当有fd就绪时,立即回调函数rollback。
i/o复用模型

信号驱动I/O模型

信号驱动io模型
首先开启信号驱动I/O功能,通过调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,非阻塞的)。当数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据。

异步I/O模型

异步io模型
告知内核启动某个操作。与信号驱动I/O的主要区别是:信号驱动I/O由内核通知我们何时可以开始一个I/O操作;异步I/O模型由内核通知我们I/O操作何时已经完成。

0 0
原创粉丝点击