I/O模型
通常来说,IO操作包括:对硬盘的读写,对socket的读写以及外设的读写。
一个完整的IO请求操作包括以下两部分:
- 查看数据是否就绪;
- 进行数据拷贝(内核将数据拷贝到用户线程)。
在《Unix网络编程》中提到了五中IO模型,分别是:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO、和异步IO。
阻塞IO模型:
最传统的一种IO模型,即在读写操作过程中发生阻塞现象。
当用户线程发出IO请求之后,内核会查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户将交出CPU的占用。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果个给用户线程,用户线程才接触block状态。
应该注意到,在阻塞过程中,其他应用进程还可以执行,因此阻塞并不意味着整个操作系统都被阻塞。因为其他应用程序还可以执行,所以该线程不消耗CPU,这种模型CPU的利用率会比较高。
典型的阻塞IO的例子为:
data = socket.read(); #如果没有就绪,就会一直阻塞在read方法
非阻塞IO模型:
当用户线程发起一个read操作后&#