Linux 5种IO模型

Linux 5种IO模型

用户空间和内核空间

任何Linux发行版,其系统内核都是Linux,我们的应用都需要通过linux内核和硬件交互。

为了避免用户应用导致冲突甚至内核崩溃,用户空间和内核分离的。

  • 进程的寻址空间会划分为两部分:内核空间、用户空间

image-20230522174328228

image-20230522175341558

Linux 5-IO模型

阻塞IO

顾名思义,阻塞IO就是两个阶段都必须阻塞等待。

image-20230522180723437

非阻塞IO

顾名思义,非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户进程。

  • 用户进程一直循环 在问内核空间数据是否准备好了,没有准备好返回错误,ok的话,返回数据。盲等空转的情况下,可能导致cpu暴增。
  • 当内核空间数据没有准备好的情况下,从内核空间给用户空间copy的线程,是阻塞的。

image-20230522181058300

无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在与无数据时的处理方案

  • 如果调用recvfrom时,恰好没有数据,阻塞IO会使进程阻塞,非阻塞IO使CPU空转,都不能充分发挥CPU的性能
  • 如果调用recvfrom时,恰好数据,则用户进程可以直接进入第二阶段,读取并处理数据。

比如服务端处理客户端Socket请求时,在单线程情况下,智能一次处理每一个socket,如果正在处理的socket恰好未就绪,线程就会被阻塞,所有其他客户端socket都必须等待,性能自然会差。

多路复用IO

文件描述符:简称FD(File Description),是一个从0开始递增的无符号整数,用来关联linux中的一个文件。在linux 中,一切皆文件,例如常规文件、视频、硬件设备等,当然有包括套接字(socket)。

IO多路复用:是利用单个线程来同时监听多个FD,并在某个FD可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。

image-20230522200239897

监听FD的方式、通知的方式有多种实现,常见的有一下几种

Select模式

select模式存在的问题

  • 需要将整个fd_set从用户空间拷贝到内核空间,select结束还要再次拷贝回用户空间
  • select 无法得知具体是哪个fd就绪,需要遍历整个fd_set
  • fd_set 监听的fd数量不能超过1024

image-20230522212519690

Poll模式

poll模式对select模式做了简单改进,但性能提升不明显。

image-20230522213851120

IO流程

  1. 创建pollfd数组,向其中添加关注的fd信息,数组大小自定义
  2. 调用poll函数,将pollfd数据拷贝到内核空间,转链表存储,无上限
  3. 内核遍历fd,判断是否就绪
  4. 数据就绪或者超时后,拷贝pollfd数组到用户空间,返回就绪的fd数量n
  5. 用户进程判断n是否大于0
  6. 大于0则遍历pollfd数组,找到就绪的fd。

与select对比

  • select模式中的fd_set大小固定为1024,而pollfd在内核中采用链表,理论上无上限
  • 监听fd越多,每次遍历消耗时间越长,性能反而下降
Epoll模式

Epoll模式中如何解决这些问题?

  • 基于epoll实例中的红黑树保存要监听的FD,理论上无上限,而且增删改查效率都非常高,性能不会随监听的FD数量增多而下降
  • 每个FD只需要执行一次epoll_ctl 添加到红黑树,以后每次epol_wait无需传递任何参数,无需重复拷贝FD 到内核空间
  • 内核会将就绪的FD直接拷贝到用户空间的指定位置,用户进程无需遍历所有的Fd就知道就绪的FD是谁

image-20230522215839268

总结
  • select 和poll 只会通知用户进程有FD就绪,但不确定具体是哪个FD,需要用户进程逐个遍历FD 来确认。
  • epoll 则会在通知用户进程的FD 就绪的同时,把已就绪的FD写入用户空间

信号驱动IO

信号驱动IO:是与内核建立SIGIO的信号关联并设置回调,当内核有Fd就绪时,会发出SIGIO信号通知用户,期间用户应用可以执行其他业务,无需阻塞等待。

image-20230522221154334

缺点

当有大量IO操作时,信号较多,SIGIO处理函数不能及时处理可能导致信号队列溢出。

而且内核空间与用户空间的频繁信号交互性能也比较低。

异步IO

异步IO 的整个过程都是非阻塞的,用户进程调用完异步api 就可以去做其他的事情,内核等待数据就绪并拷贝到用户空间后才会递交信号,通知用户进程。

image-20230522221623663

同步和异步

IO 操作是同步还是异步,关键看数据在内核空间还是用户空间的拷贝过程,(数据读写的IO操作)。也就是阶段二是同步还是异步。

image-20230522222338903

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux IO 模型是指 Linux 操作系统中的 IO 处理机制。它的目的是解决多个程序同时使用 IO 设备时的资源竞争问题,以及提供一种高效的 IO 处理方式。 Linux IO 模型主要分为三种:阻塞 IO、非阻塞 IOIO 多路复用。 阻塞 IO 指的是当程序进行 IO 操作时,会被挂起直到 IO 操作完成,这种方式简单易用,但是对于高并发环境不太适用。 非阻塞 IO 指的是程序进行 IO 操作时,如果无法立即完成,会立即返回一个错误码,程序可以通过循环不断地进行 IO 操作来实现轮询的效果。非阻塞 IO 可以提高程序的响应速度,但是会增加程序的复杂度。 IO 多路复用指的是程序可以同时监听多个 IO 设备,一旦有 IO 事件发生,就会立即执行相应的操作。IO 多路复用可以提高程序的效率,但是需要程序员手动编写代码来实现。 Linux IO 模型还有其他的实现方式,比如信号驱动 IO 和异步 IO 等。但是这些方式的使用比较复杂,一般不常用。 ### 回答2: Linux中的IO模型是指操作系统在处理输入输出的过程中所遵循的一种方式。它主要包括阻塞IO、非阻塞IO、多路复用IO和异步IO四种模型。 阻塞IO是最简单的IO模型,当一个IO操作发生时,应用程序会被阻塞,直到IO操作完成才能继续执行。这种模型的特点是简单直接,但是当有多个IO操作时会造成线程的阻塞,影响系统的性能。 非阻塞IO是在阻塞IO的基础上发展而来的,应用程序在发起一个IO操作后可以继续执行其他任务,不必等待IO操作的完成。但是需要通过轮询来不断地检查IO操作是否完成,效率相对较低。 多路复用IO使用select、poll、epoll等系统调用来监听多个IO事件,当某个IO事件就绪时,应用程序才会进行读写操作,避免了前两种模型的效率问题。多路复用IO模型适用于连接数较多时的场景,如服务器的网络通信。 异步IO是最高效的IO模型,应用程序发起一个IO操作后,立即可以执行其他任务,不需要等待IO操作的完成。当IO操作完成后,操作系统会通知应用程序进行后续处理。异步IO模型常用于高吞吐量、低延迟的应用,如高性能服务器和数据库等。 总之,Linux IO模型提供了多种不同的方式来处理输入输出,每种模型都有其适用的场景和特点。选择合适的IO模型可以提高系统的性能和效率。 ### 回答3: Linux IO模型是指操作系统中用于处理输入输出操作的一种方法或机制。在Linux中,常见的IO模型有阻塞IO、非阻塞IOIO多路复用和异步IO。 阻塞IO是最基本的IO模型,当应用程序发起一个IO请求时,它将一直阻塞等待直到IO操作完成,期间无法做其他任务。虽然简单易用,但是对资源的利用不高。 非阻塞IO在发起一个IO请求后,不会阻塞等待IO操作完成,而是立即返回并继续做其他任务。应用程序需要不断地轮询IO操作状态,直到操作完成。由于需要不断轮询,对CPU的占用较高,但可以提高资源的利用率。 IO多路复用是通过一个线程同时监听多个IO事件,从而实现并发处理多个IO操作。在IO多路复用模型中,应用程序不需要进行轮询,而是通过调用select、poll或epoll等系统调用监听多个文件描述符的IO事件。这样可以在单个线程中处理多个IO操作,提高并发性能。 异步IO模型在发起一个IO请求后,应用程序不需要等待IO操作完成,而是继续做其他任务。当IO操作完成后,操作系统会通知应用程序。异步IO模型需要操作系统的支持,效率较高,但实现较为复杂。 通过选择合适的IO模型,可以根据不同的应用场景来提高IO操作的效率和性能。例如,对于需要同时处理大量连接的服务器应用,IO多路复用是一种常见的选择;而对于需要处理大量IO操作的高性能服务器,则可以考虑使用异步IO模型
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值