![Linux 如何管理虚拟内存中交换/磁盘分区的“同时”写入?](https://linux22.com/image/6256/Linux%20%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E4%B8%AD%E4%BA%A4%E6%8D%A2%2F%E7%A3%81%E7%9B%98%E5%88%86%E5%8C%BA%E7%9A%84%E2%80%9C%E5%90%8C%E6%97%B6%E2%80%9D%E5%86%99%E5%85%A5%EF%BC%9F.png)
我目前正在开发一个名为 Pintos 的教育操作系统。在实现虚拟内存时,我遇到的问题之一是写入数据以交换从文件系统读取数据时发生的页面错误。
问题是交换分区和文件系统分区使用相同的控制器,因此一次只能访问一个。当我尝试逐出页面以交换由文件系统读取引起的页面错误时,我遇到死锁(每个设备都在等待另一个设备变得空闲,因此两者都无法取得进展)。
我想知道现实世界的操作系统(例如Linux)如何解决这个问题。我正在考虑的一个解决方案是首先将交换的页面写入内核内存,在队列中管理它,然后安排写回以在设备可用时稍后进行交换。然而,这很昂贵,因为写入必须完成两次。此外,我更有可能耗尽 RAM,因为可用交换空间比物理内存多得多。
另一个解决方案是“强制”设备在页面错误中变为空闲状态?我知道设备控制器使用一些位(BSY 和 DRQ)来确定设备状态。然而,这很可能取决于实现,并且我不确定是否应该接触这些位,因为它们可以由硬件设置。
任何建议将不胜感激。
答案1
嗯...这很简单:一个队列。一张磁盘:一个队列。两个任务是否尝试访问一个分区中的不同文件或两个不同分区中的不同文件并不重要;两个请求都会进入队列,磁盘驱动程序一次为它们提供一个服务。