Linux IO模型

Linux IO模型:

简介

主要的的IO模型有以下几种,阻塞式IO,非阻塞式IO,同步IO,异步IO。

首先让我们介绍以下基本的概念,下面以recvfrom操作为例子,从内核空间读取网络的数据需要两步操作:

  • 阶段一:等待内核准备好我们需要读取的数据,此时数据还在内核空间里
  • 阶段二:将数据从内核空间复制到用户空间即自己定义的数据的缓冲区

一般地,每个进程都有三种状态,就绪态, 运行态,阻塞态。阻塞态是指进程在等待某种资源满足,知道资源满足之前,进程什么都不做,也上面都做不了,我们下面描述的阻塞还是非阻塞其实描述的是进程在做recvfrom操作的时候是处于阻塞态还是运行态。

阻塞式IO:

如果当前资源不可读的话,进程就睡眠等待内核准备好数据,此时进程处于阻塞态。recvfrom默认是阻塞。
在这里插入图片描述

非阻塞式IO:

如果当前资源不可读的话,进程不会进入睡眠而是转而执行其他的任务,此时进程处于运行态。将recvfrom设置为NON_BLOCK
在这里插入图片描述

同步IO:

在执行recvfrom的过程中,只要有一个阶段满足以下情况则认为是同步的。进程必须等待目前的IO操作全部完成之后,进程才能去执行其他的任务。进程有可能是处于阻塞态,也可能处于运行态。使用select/poll 实现IO复用的操作和信号驱动的IO模型也是同步的IO。
在这里插入图片描述
在这里插入图片描述

异步IO:

这个类型的IO操作几乎不需要程序去参与读写,当进程发起异步IO操作时,函数立即返回,不论内核是否已经准备好数据或者数据是否已经拷贝到用户区,在整个IO操作完成后(两个阶段都完成),内核会个进程发送一个信号告诉进程IO操作完成。AIO是异步IO的例子。
在这里插入图片描述

总结:

阻塞IO描述的是进程在等待内核资源的是否处于阻塞态(IO操作的第一阶段)
同步/同步IO描述的是进程在整个IO操作的过程是否需要自己参与。做同步的IO操作的进程要么在阶段一会进入阻塞态,要么在第二阶段需要进程参与,直到整个IO操作完成后才能返回。异步IO的整个IO操作的过程中一直处于执行态。

下面我个人觉得写的比较好的两篇博文:
同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

网络IO: 同步、异步、阻塞、非阻塞、IO复用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值