linux io多路复用详解,Linux系统中IO多路复用

文章目录

1 什么是IO多路复用

1.1 阻塞IO模型

1.2 非阻塞IO模型

1.3 IO复用模型

1.4 信号驱动IO模型

1.5 异步IO模型

2 IO多路复用,epoll

1 什么是IO多路复用

常见的IO模型中,一般有四种,阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动IO模型,异步IO模型,

我们在去理解IO复用模型之前,首先去理解一下其他的四种IO模型

1.1 阻塞IO模型

阻塞IO模型就是我们在使用BIO去开源socket的时候,通过socket进行accpet,read的时候,都属于阻塞IO模型,他们会直到数据连接到达,以及数据就绪或者发生错误的时候返回。

linux io多路复用详解,Linux系统中IO多路复用_第1张图片

1.2 非阻塞IO模型

recvfrom 从应用层到内核的时候,如果该缓存区没有数据的时候,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞IO模型进行轮询检查这个状态,看内核是不是有数据到来

linux io多路复用详解,Linux系统中IO多路复用_第2张图片

1.3 IO复用模型

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

linux io多路复用详解,Linux系统中IO多路复用_第3张图片

1.4 信号驱动IO模型

首先开启套接口信号驱动IO功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进行继续工作,非阻塞的),当数据准备就绪,就为改进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环处理数据,【不是很明白】

linux io多路复用详解,Linux系统中IO多路复用_第4张图片

1.5 异步IO模型

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

linux io多路复用详解,Linux系统中IO多路复用_第5张图片

2 IO多路复用,epoll

epoll针对于原始的poll和select技术,做的很大的改进:

1,支持一个进程打开的socket描述符(fd)不受限制(仅受限于操作系统的最大文件句柄数)

2,IO效率不会随着FD数目的增加而线性下降

linux io多路复用详解,Linux系统中IO多路复用_第6张图片

3,使用mmap加速内核与用户空间的消息传递

656bf4673f3c1daf66d3214927e44322.png

你可能感兴趣的:(linux,io多路复用详解)