IO操作构成
- 步骤一 : 准备数据,将数据从存储介质(例如硬盘、Socket等)加载到内核缓存。
- 步骤二 : 拷贝数据,将数据从内核缓存拷贝到用户内存。
阻塞IO
在Linux中,默认情况下所有的Socket都是阻塞IO。一个典型的阻塞读IO操作如下图所示:
当应用进程调用了recvfrom这个系统调用,操作系统内核就开始了IO的第一个阶段 : 准备数据。
对于网络IO来说,很多情况下数据并不能一次性到达 (比如,还没有收到一个完整的UDP包 ),此时操作系统内核需要等待完整的数据到来。
此时,应用进程整个进程会被阻塞。
当操作系统内核数据准备好了,它会将数据从内核缓存中拷贝到应用内存,应用进程才解除阻塞的状态,重新运行。
所以,阻塞IO的特点就是在IO操作的两个阶段准备数据和拷贝数据都被阻塞了。
非阻塞IO
Linux下,可以通过设置Socket使其变为非阻塞IO。一个典型的非阻塞读IO操作如下图所示: