介绍:
同步IO、异步IO、阻塞IO、非阻塞IO的简单理解笔记。
对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:
- 等待数据准备 (Waiting for the data to be ready)
- 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
blocking IO:
用户进程在进行系统调用(recvfrom)的时候,系统在进行底层IO操作的时候,用户进程会一直处于阻塞状态的。
nonblockingIO:
用户进程在进行系统调用(recvfrom)的时候,系统依然要进行底层IO的操作,底层操作包括两部分:1、数据准备 2、把数据从内核空间拷贝到用户空间。
IO multiplexing:
IO多路复用,就是一个main reactor(一个线程),一个sub reactor,多个socket注册到selector上面并阻塞着直到有可read字节或者可write字节可用;然后从sub reactor 线程池里面选取一个线程用来处理这个socket里面的内容。
synchronous IO:
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;
asynchronous IO :
An asynchronous I/O operation does not cause the requesting process to be blocked;
用户进程在进行系统调用(recvfrom)的时候,会直接返回,然后进程就可以做自己的事情;当IO操作处理完成的时候,会通知用户的。
区别:
两者的区别就在于synchronous IO做”IO operation”的时候会将process阻塞。按照这个定义,之前所述的blocking IO,non-blocking IO,IO multiplexing都属于synchronous IO。有人可能会说,non-blocking IO并没有被block啊。这里有个非常“狡猾”的地方,定义中所指的”IO operation”是指真实的IO操作,就是例子中的recvfrom这个system call。non-blocking IO在执行recvfrom这个system call的时候,如果kernel的数据没有准备好,这时候不会block进程。但是,当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block了,在这段时间内,进程是被block的。而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。
总结:
IO操作其实也就是对字节进行read和write,读进来,写出去;IO模型有很多种,每一种都用对应的场景;然后再进行编码、解码,转换成应用对象,接下来进行对应的业务逻辑处理。