一、IO
1、IO介绍
I就是input输入,O就是output输出,一起就是基本输入输出设备;I/O也就是输入输出地址。每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息。I/O地址绝对不能重复,如果两个设备的I/O地址有冲突,系统硬件就不能正常工作。
2、IO模型
对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,它会经历两个阶段:
(1) 等待数据准备 (Waiting for the data to be ready)
(2)将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
在网络编程环境中,一次IO操作主要包括两个部分:等数据准备和搬迁数据,所以如果想要提高IO效率,就应该想办法让等的比重减少。
二、五种IO模型
正是因为IO操作的两个阶段,linux系统产生了下面五种网络模式的方案。
1、阻塞IO
在linux中,默认情况下所有的socket都是阻塞的,在内核数据准备好之前,系统调用会一直等待。具体流程如下:
(1)当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据(对于网络IO来说,很多时候数据在一开始还没有到达。比如,还没有收到一个完整的UDP包。这个时候kernel就要等待足够的数据到来)。这个过程需要等待,也就是说数据被拷贝到操作系统内核的缓冲区中是需要一个过程的。而在用户进程这边,整个进程会被阻塞(当然,是进程自己选择的阻塞)。
(