operating-system - 逻辑地址空间大于物理和后备存储的总和
问题描述
当虚拟地址空间大于物理内存时,操作系统可以使用交换来逐出页面帧(例如 LRU 逐出)。CPU 生成页面错误,然后将磁盘中的页面交换到主内存中。当虚拟地址足够大以至于主内存或磁盘都没有足够的存储空间来容纳它时会发生什么?当页框也不在磁盘中时会发生什么?是否调用了另一个页面错误?
解决方案
当虚拟地址足够大以至于主内存或磁盘都没有足够的存储空间来容纳它时会发生什么?
虚拟内存系统在二级存储中维护逻辑地址空间的映像。设计良好的操作系统不会允许进程映射在辅助存储中没有支持的逻辑地址。当您的应用程序调用系统服务将页面映射到逻辑地址空间时,如果没有可用于页面的辅助存储,则调用将失败。
当页框也不在磁盘中时会发生什么?
有一些设计不佳的操作系统会映射页面而没有辅助存储。您调用系统服务来映射页面,即使页面无法在辅助存储中备份,它也会成功。在这种情况下,您在访问时会遇到内存异常(并且在您的应用程序中没有提示真正的问题是内存分配失败)。
是否调用了另一个页面错误?
不。
在逻辑内存系统(大多数处理器支持)中,页面有两种状态:
1. Mapped
2. Unmapped
在虚拟内存系统中,存在三种状态:
1. Mapped
2. Unmapped and valid
3. Unmapped and invalid
当发生页面错误时,处理器只知道该页面没有映射到内存。然后操作系统必须确定该页面是否在某处的辅助存储中。如果不是,则操作会导致进程看到异常。如果是,操作系统会加载并映射页面,让进程继续愉快地进行。
推荐阅读
- r - 如何根据 textInput 和某些条件在 Shiny App 中渲染和删除 UI?
- lisp - Lisp中未定义的函数b
- rest - 这是设计 REST API URI 的正确方法吗?
- apache-kafka - 每个业务用例的 Kafka Consumer - 最佳实施方式
- jqgrid - 我想通过检查 jqgrid 多选来获取数据
- ios - SwiftUI NavigationBar 标题下空白
- node.js - docker USER 没有被首先执行,为什么?
- php - 禁用数据库缓存凭据 laravel
- python - 在“py”命令之后运行任意 Python
- python - 为什么我没有像我想的那样改变全局范围