首先要有IO的一些基础知识。
IO是指输入输出,在CPU和IO设备之间进行(比如硬盘,键盘,显示器等)。
IO是一个底层操作,需要操作系统的支持。
各种IO设备的数据传输速率各异,操作系统的作用就是屏蔽和管理这些差异(利用缓存),此外还要进程数据格式的转换。
IO设备:块设备(可寻址,支持随机存取)、字符设备(不可寻址,不支持随机存取)。
IO设备分为机械部分和电子部分(控制部分),设备控制器上有设备寄存器,这些寄存器与CPU交互。此外还有 缓冲区。
一个IO操作分成两个部分:1)发起IO请求;2)实际的IO操作。(这就是一次系统调用System call)
对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所有等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用程序缓冲区。 好,下面我们以阻塞套接字的recvfrom的的调用图来说明阻塞
同步和异步是不同的消息通信机制,关注的是第二个步骤。同步发起一个请求后,如果没有响应,是不能返回的,一旦返回就拿到了返回值。而异步调用则不必等待响应,可以直接返回,让被调用者去通知调用者,或者用回调函数处理。
阻塞和非阻塞关注的是第一个步骤,即调用者在等待调用结果时的状态。阻塞是指在得到返回结果之前,调用线程被挂起,而非阻塞则不会挂起,但是需要轮询调用结果是否返回(会有一些CPU的浪费)。
JAVA的IO有三种:BIO:同步阻塞,NIO:同步非阻塞,AIO:异步非阻塞。
通过厘清这两组概念,我们应该对调用者和被调用者有更深的认识(程序和程序之间最常见就是调用和被调用的关系)。写到这里,想起来操作系统和用户程序之间的关系,他们互为调用者和被调用者(可参考《现代操作系统》)。
2019-04-22补充:
同步和异步关注的是消息通信机制
阻塞和非阻塞关注的是调用者在等待调用结果(消息,返回值)时的状态.
参考:https://www.zhihu.com/question/19732473
网友评论