#b计算机基础/c_计算机系统/b_linux系统/补充
2020年5月2日 下午8:48
简单的讲解:
- 我觉得对于这个问题知乎上的答案有很大的误导性,怎样理解阻塞非阻塞与同步异步的区别? - 知乎,其中大部分人都是把同步_异步,阻塞_非阻塞当成两种思考角度,对不对另说,关键是这样理解我照样不会用!!!
- 我认为正确的理解方式:是从操作系统,内核态、用户态的拷贝来理解!
- 怎样理解阻塞非阻塞与同步异步的区别? - 知乎
- 对unix来讲:阻塞式I_O(默认),非阻塞式I_O(nonblock),I_O复用(select_poll_epoll)都属于同步I_O,因为它们在数据由内核空间复制回进程缓冲区时都是阻塞的(不能干别的事)。只有异步I_O模型(AIO)是符合异步I_O操作的含义的,即在1数据准备完成、2由内核空间拷贝回缓冲区后 通知进程,在等待通知的这段时间里可以干别的事。
- 怎样理解阻塞非阻塞与同步异步的区别? - 知乎

- 怎样理解阻塞非阻塞与同步异步的区别? - 知乎
深入的讲解
- blocking和non-blocking的区别
- 调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还准备数据的情况下会立刻返回。
- synchronous IO和asynchronous IO的区别
- 在说明synchronous IO和asynchronous IO的区别之前,需要先给出两者的定义。POSIX的定义是这样子的:
- A synchronous I_O operation causes the requesting process to be blocked until that I_O operation completes;
- An asynchronous I/O operation does not cause the requesting process to be blocked;
- 两者的区别就在于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。
- 在说明synchronous IO和asynchronous IO的区别之前,需要先给出两者的定义。POSIX的定义是这样子的:
- non-blocking IO和asynchronous IO的区别
- 可以发现non-blocking IO和asynchronous IO的区别还是很明显的。
- —在non-blocking IO中,虽然进程大部分时间都不会被block,但是它仍然要求进程去主动的check,并且当数据准备完成以后,也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。
- 而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。