I/O模型

I/O模型的一些基本概念

POSIX定义

  • 同步I/O操作(Synchronous I/O operation)

    导致请求进程阻塞,直到I/O操作完成

  • 异步I/O操作(Asynchronous I/O operation)

    不导致请求进程阻塞


  • 阻塞( Blocking )

    阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

  • 非阻塞( Nonblocking)

    非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

同步异步,阻塞非阻塞是分别2个不同的概念,它们之间不是相互对应的,但是有关联。

I/O模型

UNIX中存在的5种I/O模型:
阻塞式I/O非阻塞式I/OI/O复用[select,poll]信号驱动式I/O异步I/O (POSIX的aio函数)

  • 阻塞式I/O

  • 非阻塞式I/O

  • I/O复用[select,poll]

  • 信号驱动式I/O

  • 异步I/O (POSIX的aio函数)

一个简单的输入操作通常包括两个不同阶段:

  1. 等待数据准备好;
  2. 从内核向进程复制数据。

阻塞式I/O模型

默认情况下,所有socket都是阻塞的。

image-20210226111455015

recvfrom系统调用,从进程转入kernel,直到kernel的数据准备好,再将数据从kernel拷到用户内存,kernel返回结果,进程解除阻塞。就是说从recvfrom直到返回的时间内进程是被阻塞的

非阻塞式I/O

进程把socket设置为非阻塞,这样当有I/O请求操作的时候,不会把进程阻塞,而是返回一个错误。

image-20210226112306530

recvfrom在前3次调用没有数据返回,kernel立即返回一个EWOULDBLOCK错误,第4次有数据准备好,就被copy到进程的缓冲区,然后返回结果。

在非阻塞的recvfrom调用之后,进程没有被阻塞,kernel返回错误,进程在接到返回后会去做其他的事情,然后间隔一段时间后再次发起recvfrom调用,重复直到完成。这个过程被称为轮询。但是轮询这种操作耗费大量的CPU时间,推高CPU的占用率

I/O复用

I/O复用(IO multiplexing),可以调用select或者poll,阻塞在这2个系统调用的某个上,而不是阻塞在真正的I/O系统调用上 I/O Multiplexing IO多路复用模型

用户进程调用select,那么进程会被阻塞,kernel监视所有selectsocket,当任一个socket数据准备好后,select返回可读标识,用户进程调用read,将数据从kernel拷贝到用户进程。

I/O复用中的2个系统调用(select,read),它的好处在于通过select来处理多个connection,它对于每个socket,都是非阻塞。

信号驱动式I/O

skip

异步I/O

image-20210226125151977

调用aio_read函数,给kernel传递参数,告诉kernel当整个操作完成后如何通知。该系统调用立刻返回,而且在等待I/O完成期间,进程不被阻塞。

模型比较

前4中模型区别在第一阶段,第二阶段是一样的(在data从内核复制到调用者的缓冲区期间,进程阻塞在recvfrom)。而异步I/O在这2个阶段都处理。

image-20210226150550611

所以前4种都属于同步I/O,因为真正的I/O操作(recvfrom)将阻塞进程。只有异步I/O与POSIX定义的异步I/O匹配。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Eric.Cui

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

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

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

打赏作者

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

抵扣说明:

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

余额充值