Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux五种IO模型

Linux五种IO模型的使用解读

作者:weixin_39757802

文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模型的优缺点,帮助理解IO效率提升的关键机制

最近一直在研究Linux IO模型,Linux IO模型是一个挺复杂的概念,分析Linux IO模型一定要注意方法,否则会在一个个概念中,迷失自我。

1.IO模型简介

Linux IO模型是指Linux操作系统中用于实现输入输出的一种机制。

Linux IO模型主要分为五种:

阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO。

2.五种IO模型

2.1 IO模型分析方法

分析IO模型需要了解2个问题:

问题1:发送IO请求,IO请求可以理解为用户空间和内核空间数据同步,根据发起者不同分为以下两种情况:

问题2:等待数据到来,等待数据到来的方式有以下几种:

(内核空间和用户空间数据同步由谁发起是分析Linux IO模型最核心问题)

2.2 阻塞IO

阻塞IO/阶段1

注意:阻塞IO并不是阻塞CPU,而是进行进程状态切换出让CPU。

阻塞IO/阶段2

2.3 非阻塞IO

阻塞IO/阶段1

非阻塞IO/阶段2

非阻塞IO和阻塞IO阶段2相同。

2.4 IO复用

IO复用简介

IO复用是一种高效的IO处理方式,它可以让一个进程同时监视多个文件描述符,当其中任意一个文件描述符就绪时,就可以进行相应的IO操作。

相比于传统的阻塞IO和非阻塞IO,IO复用可以大大提高IO效率,减少CPU资源的浪费。

在Linux中,常用的IO复用模型有select、poll、epoll等。

IO复用模型IO请求由用户程序发起,所以IO复用模型为同步IO。

2.4.1 IO复用select模型

select模型通过位图实现IO复用,将socket注册到读,写,或异常位图,通过select系统调用轮询位图,获取socket事件,成功获取到socket事件后,select成功返回,此时可以通过接收函数读取socket缓冲区数据。

2.4.2 IO复用poll模型

poll模型和select非常相似,主要区别为poll模型把位图改成链表,poll通过链表实现IO复用,将socket注册poll_list链表,通过poll系统调用轮询链表,获取socket事件,成功获取到socket事件后,poll成功返回,此时可以通过接收函数读取socket缓冲区数据。

2.4.3 IO复用epoll模型

epoll模式采用回调方式获取就绪socket事件,相比于select和poll模型的轮询方式效率更高,通过epoll_ctl系统调用注册socket事件至红黑树,当socket接收到数据后通过回调函数将socket事件添加至就绪队列,调用epoll_wait查询就绪队列就能获取到socket事件。

2.5 信号驱动IO

信号驱动IO是基于SIGIO信号实现。

信号驱动IO主要由三个步骤组成:

信号驱动IO是由用户程序发起IO请求,所以信号驱动IO属于同步IO。

2.6 异步IO

异步IO实现的方式有很多种,上图以POISX aio为例讲解异步IO。

分析异步IO我们得抓住本质,异步IO的IO请求由内核发起,只要满足这一个点就是异步IO,不管是阻塞或者轮询,或者信号通知,都不影响异步IO这个性质。

3.IO模型常见问题?

问题1:阻塞IO和非阻塞IO区别?

a.阻塞IO

阻塞IO在没有数据包时,会通过阻塞进程等待数据到来,阻塞进程方法为:

进程阻塞期间不会占用CPU资源。

b.非阻塞IO

非阻塞IO在没有数据包时,通过轮询方式等待数据包到来,没有数据包到来,调用接收函数会立即返回EWOULDBLOCK错误码,一直调用接收函数,一直返回EWOULDBLOCK错误码。

非阻塞方式采用轮询方式会一直占用CPU资源。

问题2:同步IO和异步IO区别?

区别同步IO和异步IO方法很简单,就是用户空间和内核空间数据同步由谁发起。

问题3:信号驱动IO和异步IO区别?

信号驱动IO和异步IO虽然实现流程有很多相似的地方,比如:注册信号处理函数,发送通知信号,不会阻塞进程等。

信号驱动IO和异步IO有以下几点区别:

问题4:非阻塞IO是不是异步IO?

很多同学经常把非阻塞IO和异步IO关联在一起,其实这个是很错误的一个想法,同步IO和异步IO都可能会阻塞进程,同步IO和异步IO本质区别为用户空间和内核空间数据同步由谁发起。

非阻塞IO的IO请求由用户程序发起,属于同步IO。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文