天天看点

ZZIO模型– 同步和阻塞,异步和非阻塞的区别

在http://hi.baidu.com/deep_pro/blog/item/cf964b0ade9f4d1594ca6b1b.html

这些词之间的区别难倒了很多人,还有什么同步阻塞, 同步非阻塞, 异步阻塞, 异步非阻塞,乱七八糟的。

很多文章也想讲明白这个问题。著名且引起热议的有

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

http://www.cppblog.com/converse/archive/2009/05/13/82879.html

可是看了之后还是有点将信将疑,跑到图书馆翻了UNP 第一卷,不愧是圣经级别的著作,似有所悟。

UNP所述:

POSIX定义中,同步IO操作:IO操作将导致请求进程阻塞,直到IO操作完成。

异步IO操作:IO操作不导致请求进程阻塞

UNP中总结的IO模型有5种之多

阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,前四种都属于同步IO。

阻塞IO不必说了

非阻塞IO ,IO请求时加上O_NONBLOCK一类的标志位,立刻返回,IO没有就绪会返回错误,需要请求进程主动轮询不断发IO请求直到返回正确

IO复用同非阻塞IO本质一样,不过利用了新的select系统调用,由内核来负责本来是请求进程该做的轮询操作。看似比非阻塞IO还多了一个系统调用开销,不过因为可以支持多路IO,才算提高了效率

信号驱动IO,调用sigaltion系统调用,当内核中IO数据就绪时以SIGIO信号通知请求进程,请求进程再把数据从内核读入到用户空间,这一步是阻塞的。

异步IO,如定义所说,不会因为IO操作阻塞,IO操作全部完成才通知请求进程。

这样以来,同步和阻塞,异步和非阻塞就不会被混淆了,它们不是同一个方面上的概念,不能比较区别

同步和异步是只跟IO操作过程中进程的状态变化有关

阻塞和非阻塞就是进程的两种状态。

Unix下的五种I/O模型是:

阻塞I/O

非阻塞I/O

I/O复用(select 和poll)

信号驱动I/O

异步I/O

阻塞I/O模型图:

ZZIO模型– 同步和阻塞,异步和非阻塞的区别

非阻塞IO模型图解:

ZZIO模型– 同步和阻塞,异步和非阻塞的区别

IO复用模型图解:

ZZIO模型– 同步和阻塞,异步和非阻塞的区别

信号驱动IO图解:

ZZIO模型– 同步和阻塞,异步和非阻塞的区别

异步IO模型图解:

ZZIO模型– 同步和阻塞,异步和非阻塞的区别

同步IO引起进程阻塞,直至IO操作完成。

异步IO不会引起进程阻塞。

IO复用是先通过select调用阻塞。

好了,上图已经解释的很清楚了,再来一张书中的综合图解:

ZZIO模型– 同步和阻塞,异步和非阻塞的区别

以上这些应该解释的足够清楚了吧 ~~~