Linux系统的五种IO模型

概述

在Linux系统中,共有5种IO模型,它们分别是:阻塞IO模型,非阻塞IO模型,信号驱动IO模型,多路复用IO模型和异步IO模型
执行IO操作的过程分为两个步骤:数据准备和数据拷贝

阻塞IO模型

进程或线程等待某个条件,如果条件不满足,一直等下去;如果条件满足,进行下一步操作
应用进程通过系统调用recvfrom接收数据,由于内核还未准备好数据,应用进程会阻塞住,直到内核准备好数据,
recvfrom完成数据拷贝工作,应用进程才结束阻塞状态

非阻塞IO模型

应用程序与内核交互如果条件不满足,不再等待直接返回,不断轮询内核,若数据准备好,则进行下一步
应用进程通过recvfrom和内核交互,如果内核没有准备好数据,会返回error,应用程序接受到error后,会先去执行其他任务,一段时间后在发起recvfrom

信号驱动IO模型

应用程序在读取文件是通知内核,当发生某个socket事件时,内核发出信号通知应用程序,收到信号后,信号对应的处理函数会做后续处理,信号驱动模型在数据准备阶段是异步的,在数据拷贝阶段是同步的
应用程序预先向内核注册一个信号处理函数,然后不阻塞,当数据准备条件满足时,内核发出信号给应用程序,应用程序通过信号处理函数完成数据拷贝到用户空间的任务

多路复用IO模型

多个进程的IO可以注册到同一个管道上,这个管道会统一和内核交互,当管道中的某一个请求需要的数据准备好了,进程再把对应的数据拷贝到用户空间
IO多路转接是多了一个select函数,多个进程的IO可以注册到同一个select上,当用户进程调用该selectselect会监听所有注册好的IO,如果所有被监听的IO需要的数据都没有准备好时,select调用进程会阻塞。当任意一个IO所需的数据准备好之后,select调用就会返回,然后进程在通过recvfrom来进行数据拷贝。
这里的IO复用模型,并没有向内核注册信号处理函数,所以,他并不是非阻塞的。进程在发出select后,要等到select监听的所有IO操作中至少有一个需要的数据准备好,才会有返回,并且也需要再次发送请求去进行文件的拷贝。

异步IO模型

应用进程把IO请求传给内核后,完全由内核去操作文件拷贝。内核完成相关操作后,会发信号告诉应用进程本次IO已经完成
用户进程发起aio_read操作之后,给内核传递描述符、缓冲区指针、缓冲区大小等,告诉内核当整个操作完成时,如何通知进程,然后就立刻去做其他事情了。当内核收到aio_read后,会立刻返回,然后内核开始等待数据准备,数据准备好以后,直接把数据拷贝到用户控件,然后再通知进程本次IO已经完成

五种IO模型对比

在这里插入图片描述

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值