读取磁盘文件的整个过程

理解 I/O

I/O 就是数据的拷贝,再无其它。

内存 与 外部设备 之间不嫌麻烦的来回拷贝数据就是Input and Output:

输入(Input):从外部设备接收数据到内存中,例如从键盘输入文字,从磁盘读取文件数据,网络中主机发过来的消息。

输出(Output):将内存里面的数据发送到外部设备,例如将数据显示在屏幕上,或将数据写入到文件中,发送信息到网络中的主机。

执行I/O时底层都发生了什么

进程 A 从磁盘中拷贝文件到内存中,当前进程 A 就会阻塞,进入到阻塞队列中,等待 I/O 操作完成才可以继续往下执行指令。

虽然这时进程 A 已经被暂停执行了,但这并不妨碍磁盘向内存中拷贝数据,因为这件事情并不是 CPU 来做的,而是让 DMA 来做

进程 A 阻塞期间,操作系统会保存当前进程 A 的上下文信息,并把 CPU 资源调度分配给就绪队列中的其他进程(比方说进程 B)。

等到 进程A 的 I/O 操作完成之后,触发中断来通知操作系统。操作系统就把阻塞队列中的进程 A 移动到 就绪队列中去,尽管这个时候进程 A 不能立即获得 CPU 资源,因为这是一种公平策略,就绪队列中还有其他进程也在等待调度。

进程 B 还在执行,时间片耗完之后也加入到就绪队列中,等待下一次被调度。

这个时候我们假定就绪队列中只有进程A 和 进程 B,那么从前面的操作来看,进程A 排在 进程 B 之前,因此这个时候 CPU 调度 进程 A,进程 A 也知道 数据已经从磁盘中拷贝文件到内存中,恢复上下文信息,继续往下执行指令。

b8740a904a50d44a7fbdd6a64e96828f.png

我们现在谈论的就是图中硬件设备到内核空间的事情。