IO(一)

字数 697阅读 28

所谓的输入输出(I/O)无非就是把数据移出移进缓冲区。

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


1.进程使用read()系统调用,要求其缓冲区被填满。

2.内核随即向磁盘控制硬件发出命令。要求其从磁盘读取数据。

3.磁盘控制器把数据直接写入内核内存缓冲区。这一步通过DMA完成无需cpu。

4.内核即把数据从内核空间的临时缓冲区拷贝到 进程执行read(), 系统调用指定的缓冲区


在用户空间的进程 通过内核空间 与磁盘进行交互 

注意 图中存在两个缓冲区 已经 用户空间 内核空间

用户空间和内核空间值得注意 。

用户空间是常规进程所在的区域  (jvm)是非特权区域。

在该区域执行的代码不能直接访问硬件设备 。内核空间是操作系统所在的区域。内核代码有特别的权力。它能与设备控制器通信。控制着用户区进程 的运行 转台。

所有的io 直接或者间接的通过内核空间 



1.当进程请求IO 操作的时候 。它执行一个系统调用 将控制权移交给内核。例如 :c/c++程序员所熟知的底层方法 open()read() write() close() .

2.当内核被系统调用时,随机采取任何必要步骤。找到进程所需数据。并把数据送到用户空间内的指定缓冲区。

3. 内核试图对数据进行高速缓存或预读取 ,因此进程所需数据可能已经送到内核空间里面了 这就是为什么有两个缓冲区 。 所以 用户空间里面的进程 只需要简单的拷贝出来即可。如果内核中没有数据 进程就会被挂起。

这里需要说下 为什么需要两个缓冲区 而不是直接把磁盘中的数据送到用户空间中。


1.硬件不能直接访问用户空间(因为硬件无法访问 虚拟内存地址)

2.磁盘中的储存格式一般以块为单位 。而数据往往是随意大小的数据块。

3.内核在 数据的分解组合工作中 充当了一个中间人的角色  。

推荐阅读更多精彩内容