软硬件层面的同步/异步
硬件
在现代操作系统中,I/O是一种与外围设备(peripherals)进行数据交换的方式,I/O包括读或写数据到磁盘/SSD中,或通过网络发送/接收数据,显示信息到显示器上,接收鼠标或键盘的输入。
因此,我们通常说的I/O,不仅仅只限于磁盘文件的读写。*nix将计算机抽象了一番,磁盘文件、硬件、套接字等几乎所有计算机资源都被抽象为了文件。
实现硬件层面异步的机制称为硬件中断(hardware interrupt)。
在典型的硬件**同步(synchronous)**场景中,当CPU请求外围设备读取数据时,CPU会进入一个无限循环(infinite loop),在循环中CPU需要不断去检查外围设备是否已经将数据读取到了,这个过程称为轮询(poll)。
而在现代硬件中,当CPU向外围设备发送I/O请求后,就会立刻去执行其他CPU指令(而不是不断的轮询)。当外围设备将数据准备完成后,它会通过电路中断(circuit interrupt)向CPU发送一个信号(signal)。这就是典型的**硬件异步(asynchronous)**场景。因此,CPU就不再需要静静的等待且不断轮询直到外围设备将数据准备完成,因而大大的提高了CPU的利用率。
软件
操作系统作为一层中间件,抽象了硬件设备,向应用程序以系统调用(System Call)的形式提供I/O操作服务。
类似地,当应用程序(通过调用系统调用)发起一个I/O操作后,操作系统会调用对应的设备驱动(device driver)以操作硬件进行这个I/O操作。
对于这个应用程序来说,如果此时需要静静的等待(或者不断的轮询),直到数据被准备完成后,这就是软件层面的同步,这样的编程方式称之为同步编程(synchronous programming)。
如果操作系统允许应用程序声明一个回调函数(callback),且当I/O操作完成后,操作系统会自动调用这个回调函数,这就是软件层面的异步,这样的编程方式称为异步编程(asynchronous programming)。
...