对于一个网络IO,会涉及到两个系统对象,一个时调用这个IO的进程,一个时系统内核。
当一个read操作发生时,会经历两个阶段:(1)等待数据;(2)将数据从内核拷贝到进程中。
阻塞I/O:当进程调用了recvfrom后,就会一直等到有数据到达并且被拷贝到进程中才会返回。
非阻塞IO:当进程发出read操作时,如果数据还没准备好,不会阻塞用户进程,而是立即返回一个error。进程收到error后再次发起read操作。当内核中的数据准备好了,就会将数据拷贝到用户内存,然后返回。
用户需要不断主动询问内核数据准备好没。
IO多路复用:单个进程同时处理多个IO。当用户进程调用了select,整个进程会被阻塞,同时内核会监视所有select负责的socket,当任何一个socket中的数据准备好了,select会返回。此时,用户进程再调用read操作,将数据从内核拷贝到用户内存。
同步IO:等待数据到达或用轮询的方式检查数据是否到达,数据到达之后,将数据从内核拷贝到用户内存才会返回。同步是指第二步的IO操作会将进程阻塞。
异步IO:进程发起read操作之后,立刻去做别的事。内核会等待数据到来,然后拷贝到用户内存,这两步完成之后,内核会给进程发一个信号。
阻塞和非阻塞是从第一个步骤来看的,而同步和异步的阻塞是从真正的IO操作来也就是第二步来看的。