用户进程发起read操作之后,立刻就可以开始去做其他的事;从内核角度,当它收到一个异步的read请求操作之后,首先会立刻返回,所以不会对用户进程产生任何阻塞。然后内核会等待数据准备完成,然后将数据拷贝到用户内存中,当这一切都完成之后,内核会给用户进程发一个信号,返回read操作已完成的信息。
调用阻塞IO会一直阻塞住对应的进程直到操作完成,而非阻塞IO在内核还在准备数据的情况下会立刻返回。两者的区别就在于同步IO进行IO操作时会阻塞进程。按照这个定义,阻塞IO、非阻塞IO、多路IO复用都属于同步IO。
非阻塞IO与异步IO
非阻塞IO在执行recvfrom这个系统调用的时候,如果内核的数据没有准备好,这时候不会阻塞进程,但是当内核中数据准备好时,recvfrom会将数据从内核拷贝到用户内存中,这个时候进程会比阻塞。而异步IO则不一样,当进程发起IO操作之后,就直接返回,直到内核发送一个信号,告诉进程IO已完成,则在整个过程中,进程完全没有被阻塞。
所以非阻塞IO和异步IO的区别还是很明显的:在非阻塞IO中,虽然进程大部分时间都不会被阻塞,但是它仍然要求进程去主动检查,并且当数据准备完成以后,也需要进程主动地再次调用recvfrom来将数据拷贝到用户内存中。异步IO则完全不同,它就像是用户进程将整个IO操作交给了他人(内核)完成,然后内核做完后发信息通知。