I/O 基础

缓冲区操作

缓冲区以及缓冲区是如何工作,是所有I/O的基础。“输入/输出”就是把数据移进或移出缓冲区。

进程执行I/O操作,就是向操作系统发出请求,让它要么把缓冲区的数据排干(写),要么用数据把缓冲区填满(读)。进程使用这一机制处理所有数据进出操作。

从磁盘读数据到进程内存区:
read-from-disk-into-user-process

进程使用 read( ) 系统调用,要求其缓冲区被填满。内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过DMA完成,无需主CPU 协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行 read( ) 调用时指定的缓冲区。

用户空间与内核空间

  • 用户空间:用户空间是常规进程所在区域,是非特权区域,比如该区域的代码不能直接访问硬件设备。
  • 内核空间:内核空间是操作系统所在区域,有特别的权利:能与设备控制器通讯,控制用户区域进程的运行状态等等。

所有I/O都直接或间接通过内核空间,通过请求页面调度完成。

当进程请求I/O操作的时候,它执行一个系统调用将控制权移交给内核。内核随即采取必要步骤,找到进程所需数据,并把数据传送到用户空间内指定的缓冲区。如果数据已在内核空间,直接拷贝即可;如果不在内核空间,则进程被挂起,内核着手把数据读进内存。

发散、汇聚

根据发散、汇聚的概念,进程只需一个系统调用,就能把一连串缓冲区地址传递给操作系统,然后内核就可以顺序填充或排干多个缓冲区,读的时候把数据发散到多个用户空间缓冲区,写的时候再从多个缓冲区把数据汇聚起来。

scatter-gather

继续阅读