在没有交换的情况下如何管理分页。如果是这种情况,如何管理页面错误?
我的意思是,如果没有可用的交换,那么如何管理分页。我知道会有两个页面列表 - free_pages 列表和 allocate_pages 列表。当 free_pages 列表中的页面变低时,它会将 LRU 页面从 allocate_pages 列表移动到交换分区。我只是想知道如果没有交换分区会发生什么。
答案1
据我了解你的问题,通常会以这种方式发生:
如果分配内存:
- 将内存标记为已分配,但不分配物理内存(因此在访问时会出现页面错误)。在Linux中,它会在这个阶段停止,但系统可能会立即分配物理空间 - 然后它在最后执行与页面错误类似的算法,除了不会发生OOM。
如果存在页面错误(访问未映射的页面)
- 检查是否分配了内存,如果没有则返回错误。
- 检查是否有空闲物理页。如果有转到5
- 检查是否有部分可以写回磁盘(例如缓存中的文件)或者交换区上是否有可用空间(如果没有交换区,则将其视为大小为 0 的交换区)。如果存在将文件/块写回磁盘或将页面写入磁盘,则取消映射并转到 5。如果两者都可以,请选择任何一个。
- 返回 OOM 条件。这取决于内核会发生什么 - 它可能会向用户显示错误、内核恐慌/蓝屏、找到要杀死的进程等。
- 将导致问题的页面映射到已释放的页面。如果页面被交换,则从交换中读取页面并将其放入页面中。如果页面由文件支持,则读取文件并将内容放在那里。
一般来说,你可能会说没有交换相当于完全交换。
答案2
交换,允许移动未使用的页面从内存中取出并写入磁盘。不过,这并不是必须的,根据实际情况寻呼操作,即使没有交换也会发生。
答案3
如果我正确理解你的问题,你会问如果没有定义交换空间,分页是如何发生的。
对于使用传统 Unix 方法的操作系统,虚拟内存始终由物理 RAM 支持,因此不会因为缺少交换区域而发生页面错误,当然除了内存映射文件或虚假指针等不相关的情况之外。
对于像 Linux 这样的过度使用操作系统,不会发生严格的保留,因此在没有更多 RAM 可用的情况下首次访问未映射的页面将触发 OOM 杀手或其他一些破坏性/错误事件。