http://blog.csdn.net/historyasamirror/article/details/5778378编程
首先说明我对这些概念也不是很清楚,如下内容是我作的一些理事。网络
同步和异步、阻塞和非阻塞这是两组概念,说的是不一样的事情,同步和阻塞没有必然的联系,异步和非阻塞也没有必然的联系。同步和异步是只跟IO操做过程当中进程的状态变化有关。阻塞和非阻塞就是进程的两种状态。好比你去银行,排除的话就是一种同步的方式,叫号的话就是异步的方式。排队必须本身看着何时轮到本身,而叫号则没必要,轮到你的时候会触发一个事件,或者说你会收到一个信号,别人会叫你。无论是排除仍是叫号,若是你在等待的过程当中不能作其余事情,那就是阻塞模式,不然就是非阻塞模式。同步的时候能够有阻塞和非阻塞,异步的时候也能够有阻塞和非阻塞。异步
Linux下的I/O操做默认是阻塞I/O,即open和socket建立的I/O都是阻塞I/O。当读写操做没有完成时,函数就不会返回,进程一直阻塞在那里。socket
非阻塞模式的使用并不广泛,由于非阻塞模式会浪费大量的CPU资源。
函数
网络编程时listen,recvfrom,connect都会引发阻塞。非阻塞IO一般应用于网络编程中,IO请求时加上O_NONBLOCK一类的标志位,函数马上返回,IO没有就绪会返回错误,须要请求进程主动轮询不断发IO请求直到返回正确
好比调用recvfrom时,若是系统尚未接收到网络数据,内核立刻返回一个 EWOULDBLOCK的错误。测试
当一个应用程序使用了非阻塞模式的套接字,它须要使用一个循环来不停地测试是否一个文件描述符有数据可读(称作 polling(轮询))。应用程序不停的 polling 内核来检查是否 I/O操做已经就绪。这将是一个极浪费 CPU资源的操做。这种模式使用中不是很广泛。spa
针对批量IP操做时,使用I/O多路复用,很是有好。.net