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