`
sjk2013
  • 浏览: 2182911 次
文章分类
社区版块
存档分类
最新评论

阻塞与非阻塞,同步与异步

 
阅读更多

阻塞与非阻塞,同步与异步

这个问题其实也是老生长谈。

首先给给出阻塞与非阻塞的概念。

阻塞是说:当一个用户进程向内核系统调用读写请求的时候,数据没准备好,或者内存不为空的时候。用户进程将会等待,直到内核准备好。

然后结束请求,返回用户进程,如果系统调用一直没有返回则用户进程死等(阻塞)。

非阻塞是说:当一个用户进程向内核系统调用读写请求的时候,数据没准备好,或者内存不为空的时候。则系统调用返回错误号,用户进程去执行别的事情,过一会用户进程再来发出相同的读写请求,直到读写系统调用完成或者退出,这个过程可能会持续好多次。

I/O复用是说select和poll系统调用可以同时监控多路读写事件的状态。而I/O信号驱动则是说当I/O条件准备好的时候,用一个SIGIO信号通知用户进程,该进程处理的I/O时间至少有一个准备好。

异步I/O是说,用户进程直接系统调用(aio_read等),有内核进城去处理数据IO,如果数据准备好,内核进程还要把数据拷贝到用户进程,然后通知用户进程,用户进程按照设定的入口函数,去处理异步调用结果,它的异步请求已完成。

综上所述,上诉四种阻塞、非阻塞、I/O复用、I/O信号驱动,都属于同步I/O。

只有最后一种异步I/O。才是异步IO.

阻塞与非阻塞是说用户进程同步IO时的情况方式。

而异步是说,用户进程根本就不关心IO的问题,只是简单地把读写操作扔给内核,自己就不管了,如果异步IO完成了,则内核会给用户进程一个信号,调用相应的处理函数。

参考文献: W.richards stevens UNIN networks programming 第六章,6.1,6.2节。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics