同步/异步,阻塞/非阻塞

来源:互联网 发布:淘宝开店软件靠谱吗 编辑:程序博客网 时间:2024/05/28 17:06

阻塞I/O:在调用读函数的时候,如果数据没有准备好(没有完全到来)或者数据没有完全拷贝到用户指定的区域,读函数将一直等待不会返回,直到数据完全拷贝到用户指定区域。所以阻塞I/O在准备数据和数据拷贝都会等待。
这里写图片描述

非阻塞I/O:在调用读函数的时候,如果数据没有准备好,函数也会立即返回,同时返回一个错误代码。用户需要不断的去检查数据到底有没有准备好。直到数据准备好了,此时再调用读函数,系统将数据完全拷贝到用户指定区域,函数返回。所以非阻塞I/O在数据拷贝的时候会等待。
这里写图片描述

I/O复用:应用程序通过I/O复用函数想内核注册一组事件,内核通过I/O复用函数把其中就绪的时间通知给应用程序。比如Linux上的select、poll、epoll_wait。I/O复用本身是阻塞的,调用阻塞时由内核来监听注册进来的多个I/O。
这里写图片描述

同步异步相对trick,要分清楚上下语境,在I/O方面的同步异步和并发模式中的同步异步是两个概念。
在I/O方面的同步异步
同步:要求用户代码自行执行I/O操作(将数据从内核缓冲区读取到用户缓冲区,或将数据从用户缓冲区写入到内湖缓冲区)。
异步:内核来执行I/O操作(数据在内核缓冲区和用户缓冲区之间的移动是由内核在“后台”完成的)。
所以不管是阻塞I/O、非阻塞I/O还是I/O复用都是同步I/O,因为它们都是内核通知数据准备好了,用户主动拷贝数据。

在并发模式方面的同步异步
同步:程序完全按照代码顺序执行,在一定程度上可以看做是单线程,这个线程请求一个方法后就等待回复,否则他不往下执行。
异步:程序的执行需要由系统事件来驱动,在一定程度上可以看做是多线程的,请求一个方法后无需等待继续执行其他的工作。单线程下用DMA读取数据也是异步的。

参考
《linux高性能服务器编程》
http://blog.csdn.net/historyasamirror/article/details/5778378 (I/O同步异步阻塞非阻塞)
http://www.cnblogs.com/easonoutlook/archive/2012/08/21/2649279.html (并发同步异步)
http://avaj.iteye.com/blog/151724 (同上)

0 0