Linux网络编程之五种IO模型小结
Linux网络编程之五种IO模型小结
一、五个I/O模型
- 阻塞I/O
- 非阻塞I/O
- I/O复用(select、poll、epoll)
- 信号驱动I/O
- 异步I/O
1.1 阻塞I/O模型
- 最流行的I/O模型是阻塞I/O模型,缺省时,所有的套接口都是阻塞的。
1.2非阻塞I/O模型
- 我们把一个套接口设置为非阻塞方式时,即通知内核:当请求的I/O操作非得让进程睡眠不能完成时,不要让进程睡眠,而应返回一个错误
应用程序连续不断地查询内核,看看某操作是 否准备好,这对cpu时间是极大的浪费,一般只在专门提供某种功能的系统中才会用到。
1.3 I/O复用模型
- 有了I/O复用,我们就可以调用select或epoll,在这两个系统调用的某一个上阻塞,而不是真正阻塞于真正的I/O系统调用。
1.4 信号驱动I/O模型
- 我们也可以用信号,让内核在描述字准备好时用信号SIGIO通知我们,我们将此方法称为信号驱动I/O。
1.5 异步I/O模型
- 异步I/O是Posix.1的1993版本中的新内容,我们让内核启动操作,并在整个操作完成后通知我们。
二、I/O复用
如果一个或多个I/O条件满足(例如:输入已准备好被读,或者描述字可以承接更多输出的时候)我们就能够被通知到,这样的能力被称为I/O复用,是由函数select和epoll支持的。
I/O复用网络应用场合:
- 当客户处理多个描述字
- 一个客户同时处理多个套接口
- 如果一个tcp服务器既要处理监听套接口,又要处理连接套接口
- 如果一个服务器既要处理TCP,又要处理UDP
2.1 Epoll
epoll在Linux2.6内核正式提出,是基于事件驱动的I/O方式,相对于select来说,epoll没有描述符个数限制,使用一个文件描述符管理多个描述符,将用户关心的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
epoll 的相关函数及示例代码我将会在下一节中详细介绍。
链接地址:
https://blog.****.net/wangbaba_1/article/details/109380457