异步 同步 阻塞 非阻塞

http://blog.csdn.net/historyasamirror/article/details/5778378编程

首先说明我对这些概念也不是很清楚,如下内容是我作的一些理事。网络

同步和异步、阻塞和非阻塞这是两组概念,说的是不一样的事情,同步和阻塞没有必然的联系,异步和非阻塞也没有必然的联系。同步和异步是只跟IO操做过程当中进程的状态变化有关。阻塞和非阻塞就是进程的两种状态。好比你去银行,排除的话就是一种同步的方式,叫号的话就是异步的方式。排队必须本身看着何时轮到本身,而叫号则没必要,轮到你的时候会触发一个事件,或者说你会收到一个信号,别人会叫你。无论是排除仍是叫号,若是你在等待的过程当中不能作其余事情,那就是阻塞模式,不然就是非阻塞模式。同步的时候能够有阻塞和非阻塞,异步的时候也能够有阻塞和非阻塞。异步

阻塞 I/O

Linux下的I/O操做默认是阻塞I/O,即open和socket建立的I/O都是阻塞I/O。当读写操做没有完成时,函数就不会返回,进程一直阻塞在那里。socket

非阻塞I/O    

非阻塞模式的使用并不广泛,由于非阻塞模式会浪费大量的CPU资源。
函数

网络编程时listen,recvfrom,connect都会引发阻塞。非阻塞IO一般应用于网络编程中,IO请求时加上O_NONBLOCK一类的标志位,函数马上返回,IO没有就绪会返回错误,须要请求进程主动轮询不断发IO请求直到返回正确
好比调用recvfrom时,若是系统尚未接收到网络数据,内核立刻返回一个 EWOULDBLOCK的错误。
测试

 当一个应用程序使用了非阻塞模式的套接字,它须要使用一个循环来不停地测试是否一个文件描述符有数据可读(称作 polling(轮询))。应用程序不停的 polling 内核来检查是否 I/O操做已经就绪。这将是一个极浪费 CPU资源的操做。这种模式使用中不是很广泛。spa

I/O多路复用

针对批量IP操做时,使用I/O多路复用,很是有好。.net

在使用 I/O 多路技术的时候,咱们调用 select()函数和 poll()函数或epoll函数(2.6内核开始支持),在调用它们的时候阻塞。
当咱们调用 select函数阻塞的时候,select 函数等待数据报套接字进入读就绪状态。当select函数返回的时候, 也就是套接字能够读取数据的时候。 这时候咱们就能够调用 recvfrom函数来将数据拷贝到咱们的程序缓冲区中。
IO复用同非阻塞IO本质同样,不过利用了新的select系统调用,由内核来负责原本是请求进程该作的轮询操做。看似比非阻塞IO还多了一个系统调用开销,不过由于能够支持多路IO,才算提升了效率。多路复用的高级之处在于:它能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就能够返回。

异步I/O

      当咱们运行在异步 I/O 模式下时,咱们若是想进行 I/O 操做,只须要告诉内核咱们要进行 I/O 操做,而后内核会立刻返回。具体的 I/O 和数据的拷贝所有由内核来完成,咱们的程序能够继续向下执行。当内核完成全部的 I/O 操做和数据拷贝后,内核将通知咱们的程序。
相关文章
相关标签/搜索