Linux-高级IO

1. 高级IO

1.1 IO模型

  IO操作包括了等待和拷贝,实际中等待所消耗的时间往往大于拷贝的时间,因此,为了让IO操作高效,核心的方法就是缩短等待时间。
  在低阶IO中,用户通过输入的内容读取到某个变量中,将变量的值打印到屏幕当中,简单的说就是C库维护缓冲区进行的IO操作。
  高阶IO,通常应用于网络socket编程,对UDP、TCP、所维护的发送缓冲区进行IO操作,并且高阶IO分为同步IO和异步IO,同步IO又分为阻塞IO,非阻塞IO,信号驱动IO,多路转接IO。

1.2 阻塞IO

  应用进程调用recvform函数之后,进程进入阻塞,recvfrom通过系统调用进入内核,等待数据的准备,当数据准备好之后,从内核拷贝一份数据到用户空间,然后成功返回。
在这里插入图片描述

1.3 非阻塞IO

  应用进程调用recvfrom函数进入内核,发现进程所需数据没有准备好,便返回EWOULDBLOCK,进程会重复调用recvfrom,直到内核将所需数据准备好,将数据从内核拷贝到用户空间,并成功返回,一般要重复调用recvfrom,所以可搭配循环使用。
在这里插入图片描述

1.4 信号驱动IO

  应用程序建立一个SIGIO信号处理程序,然后进程继续往下执行,建立的SIGIO信号处理程序会系统调用一个sigaction给内核,然后直接返回,然后内核当中就开始准备数据,当数据准备好之后,会给信号处理程序发送一个SIGIO信号,当信号处理程序收到SIGIO信号后,应用进程会调用recvfrom给内核,应用程序在收到成功指示之前会阻塞,内核收到后开始拷贝数据,拷贝完成,返回成功指示

在这里插入图片描述

1.5 多路转接IO

  在流程上和阻塞IO类似,但是本质上最核心的地方就是可以一次性等待多个文件描述符的就绪状态
在这里插入图片描述

1.6 异步IO

  当内核将数据拷贝好之后,通知应用进程进行相关的IO操作,需要注意的是,他和信号驱动IO很像,但是信号驱动IO是内核将数据准备好才通知,而异步IO是内核将数据拷贝好之后才通知

在这里插入图片描述

注:为了性能和效率的优先,C++默认使用的是异步IO的方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天津 唐秙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值