启动进程时,分页(虚拟内存)系统会发生什么?

时间:2013-10-27 21:40:01

标签: pagination operating-system virtual-memory

我正在通过Tanenbaum的“现代操作系统”一书进行研究,并阅读了本书的以下段落:

  

启动进程时,其所有页表条目都标记为不在内存中。一旦引用任何页面,就会发生页面错误。然后操作系统设置R位(在其内部表中),将页表条目更改为指向正确页面,模式为READ ONLY,然后重新启动指令。如果随后修改了页面,则会发生另一个页面错误,允许操作系统设置M位并将页面模式更改为READ / WRITE。

对我来说似乎非常有用。他建议,当一个进程启动时,必须发生很多页面错误,并且在执行指令时正在填充实际内存。

对我来说似乎更合乎逻辑的是,至少进程的文本在开头放在内存中,而不是放在每个指令执行时(每个指令执行一次页面错误)。

有人可以解释一下这本书解释的方法的优点是什么?

1 个答案:

答案 0 :(得分:1)

Tanenbaum在本段中描述了两种技术:

  

启动进程时,其所有页表条目都标记为不在内存中。作为>在引用任何页面时,将发生页面错误。然后操作系统设置> R位(在其内部表中),将页表条目更改为指向正确的页面,>使用READ ONLY模式,然后重新启动指令。

此技术也称为请求分页(如果发生页面错误,页面将按需从磁盘加载到内存)。我至少可以想到你想要这样做的两个原因:

  1. 内存消耗:只有真正需要的页面才会从磁盘加载到主内存中,可能有部分程序从未执行过,或者数据部分中有部分内容从未在执行过程中写入。在这种情况下,这些部件从不首先加载,这意味着您有更多的RAM可用于其他进程。如今,如果这仍然是一个有效的论据,你可以通过大量的记忆来辩论。

  2. 速度:从磁盘加载速度很慢,十年前速度要慢得多。以惰性方式按需进行页面表设置允许推迟从磁盘获取块。一次加载所有内容可能会延迟程序的执行。同样,磁盘现在速度更快,SSD使这一论点更加无效。另一方面,由于动态库,二进制文件并不大,通常只需要几个页面错误,直到它们被加载到RAM中。

  3.   

    如果随后修改了页面,则会发生另一个页面错误,允许   操作系统设置M位并将页面模式更改为READ / WRITE。

    同样,其原因是内存消耗。在过去,内存稀缺,交换(如果内存已满,将页面再次移回磁盘)是一种解决方案,可以为您提供更大工作页面的错觉。如果一个页面之前已经被换掉过并且从未在中间进行过修改,那么你可以通过删除页面表中的当前位来删除页面,从而释放页面占用的内容以加载另一个帧。修改后的位可以帮助您检测是否需要将新版本的页面写回磁盘,或者是否可以保留旧版本,并在需要时再次将其重新交换。

    您提到的方法,您设置一个预先填充所有页表条目(也称为预分页)的进程是完全有效的。你正在以速度交换内存消耗。页表行走以及设置修改的位是在硬件中实现的(在x86上),这意味着它的表现并不差。但是,预填充会使您无法执行页面错误处理程序,而这通常是经过大量优化的处理程序,而是通过软件实现的。