Asynchronous vs Nonblocking

在I/O模型中有两个概念特别容易混淆,就是同步和异步(synchronous vs nonsynchronous),阻塞和非阻塞(blocking vs nonblocking)的区别在什么地方。

同步非阻塞可能吗,异步阻塞有可能吗? 这几个概念在stevens的《UNIX网络编程(卷一)》6.2节写得很清楚,这里写个总结吧。

阻塞I/O

最流行的I/O模型就是阻塞模型,如果数据没有准备好,那么程序就不会往下运行,一个例子是linux下的系统调用readwrite,如果调用了read,但是file descriptor没有数据的话,就一直等待用户的输入。

非阻塞I/O

把一个file descriptor设置为非阻塞的意思就是,当数据没有准备好,进程即将睡眠的时候,不要让进程睡眠,而是返回一个错误码。在linux下的一个例子就是在read之前调用fcntlO_NONBLOCK作为参数,将fd设为非阻塞的。如果read返回错误码,那么就接着read,如此反复,这种方法叫轮询,浪费cpu时间。

阻塞和非阻塞比较好理解的,然后我们来看同步和异步。

同步/异步IO

POSIX这样定义同步和异步:

同步I/O导致请求阻塞,直到I/O操作完成。

异步I/O不导致进程阻塞。

根据同步的定义,我们得知,只要读或写的操作,是在当前线程完成的,在一段时间里只做I/O,其它事情都不能干,那么就是同步I/O。根据异步的定义,如果我们只需要发布一个命令,让小弟(别的线程)去进行读写操作,然后读写完了告诉主线程(通过回调函数),那么就是异步I/O。

简单来说,理解同步异步的关键是谁在进行真正的I/O, 如果是主线程,那么就是同步;如果是小弟线程,小弟线程工作完了报告主线程,那么就是异步。

所以,严格意义上来说异步和非阻塞是完全两个概念。 但在某些场景下,这两个概念是混用的:当讨论一个API返回速度的时候,异步和非阻塞都是立即返回,在这个上下文中,异步和非阻塞表示的意思相同。

一些例子

同步阻塞:read/write,select/poll(有些说法说select是异步阻塞的,但select做的仅仅是告诉你哪些fd准备读写了,然后主线程可以开始读,所以根据定义,它应该还是同步的)。

同步非阻塞:read/write(O_NONBLOCK)

异步非阻塞:Linux上的AIO库

References

[1] http://www.ibm.com/developerworks/cn/linux/l-async

[2] 《UNIX网络编程》

[3] http://www.cnblogs.com/Jerry-Chou/archive/2012/04/23/2466045.html


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值