linux 阻塞非阻塞模式,Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结...

同步和异步:与消息的通知机制有关。

本质区别

现实例子

同步模式

由处理消息者自己去等待消息是否被触发

我去银行办理业务,选择排队等,排到头了就办理。

异步模式

由触发机制来通知处理消息者

我去银行办理业务,取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务。

阻塞与非阻塞:与线程等待消息(无所谓同步或者异步)时的状态有关。

本质区别

现实例子

阻塞调用

线程挂起,不能做其他事。

上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息之外不能做其它的事情,那么该机制就是阻塞的。

非阻塞调用

线程活跃,能处理其他事。

在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的。

它们之间的组合应用举例:

阻塞调用

非阻塞调用

同步模式

read/write

read/write

O_NONBLOCK

异步模式

IO复用:select/poll,epoll(LT模式)

AIO系列:aio_read,aio_write等;epoll(ET模式)

同步阻塞IO

最常用的一个模型是同步阻塞I/O模型。在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发生错误)。调用应用程序处于一种不再消费CPU而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。

图1给出了传统的阻塞I/O模型,这也是目前应用程序中最为常用的一种模型。其行为非常容易理解,其用法对于典型的应用程序来说都非常有效。在调用read系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻塞(read调用返回)。

29660031_1.gif

图1.同步阻塞I/O模型的典型流程

从应用程序的角度来说,read调用会延续很长时间。实际上,在内核执行读操作和其他工作时,应用程序的确会被阻塞。

同步非阻塞I/O

同步阻塞I/O的一种效率稍低的变种是同步非阻塞I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着I/O操作不会立即完成,read操作可能会返回一个错误代码,说明这个命令不能立即满足(EAGAIN或EWOULDBLOCK),如图2所示。

29660031_2.gif

图2.同步非阻塞I/O模型的典型流程

非阻塞的实现是I/O命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成(轮询)。这可能效率不高,因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,或者试图执行其他工作。正如图2所示的一样,这个方法可以引入I/O操作的延时,因为数据在内核中变为可用到用户调用read返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。

异步阻塞IO

另外一个阻塞解决方案是带有阻塞通知的非阻塞I/O。在这种模型中,配置的是非阻塞I/O,然后使用阻塞select系统调用来确定一个I/O描述符何时有操作。使select调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。

29660031_3.gif

图3异步阻塞IO模型的典型流程(select)

select调用的主要问题是它的效率不是非常高。尽管这是异步通知使用的一种方便模型,但是对于高性能的I/O操作来说不建议使用。

异步非阻塞IO

最后,异步非阻塞I/O模型是一种处理与I/O重叠进行的模型。读请求会立即返回,说明read请求已经成功发起了。在后台完成读操作时,应用程序然后会执行其他处理操作。当read的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次I/O处理过程。

29660031_4.gif

图4异步非阻塞IO模型的典型流程

在一个进程中为了执行多个I/O请求而对计算操作和I/O处理进行重叠处理的能力利用了处理速度与I/O速度之间的差异。当一个或多个I/O请求挂起时,CPU可以执行其他任务;或者更为常见的是,在发起其他I/O的同时对已经完成的I/O进行操作。

异步IO的动机

从前面 I/O 模型的分类中,我们可以看出 AIO 的动机。这种阻塞模型需要在 I/O 操作开始时阻塞应用程序。这意味着不可能同时重叠进行处理和 I/O 操作。同步非阻塞模型允许处理和 I/O 操作重叠进行,但是这需要应用程序根据重现的规则来检查 I/O 操作的状态。这样就剩下异步非阻塞 I/O 了,它允许处理和 I/O 操作重叠进行,包括 I/O 操作完成的通知。

除了需要阻塞之外,select 函数所提供的功能(异步阻塞 I/O)与 AIO 类似。不过,它是对通知事件进行阻塞,而不是对 I/O 调用进行阻塞。

转载:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值