Operating system 逻辑地址空间大于物理和备份存储的总和

Operating system 逻辑地址空间大于物理和备份存储的总和,operating-system,virtual-memory,mmu,Operating System,Virtual Memory,Mmu,当虚拟地址空间大于物理内存时,操作系统可以使用交换退出页帧(例如LRU退出)。CPU生成页面错误,然后磁盘中的页面被交换到主内存中。当虚拟地址足够大,以至于主内存或磁盘都没有足够的存储空间容纳它时,会发生什么情况?当页面框架也不在磁盘中时会发生什么?是否调用了另一个页面错误 当虚拟地址足够大,以至于主内存或磁盘都没有足够的存储空间容纳它时,会发生什么情况 虚拟内存系统在辅助存储器中维护逻辑地址空间的映像。一个设计良好的操作系统不允许一个进程映射一个逻辑地址,而这个逻辑地址在辅助存储中没有备份。当

当虚拟地址空间大于物理内存时,操作系统可以使用交换退出页帧(例如LRU退出)。CPU生成页面错误,然后磁盘中的页面被交换到主内存中。当虚拟地址足够大,以至于主内存或磁盘都没有足够的存储空间容纳它时,会发生什么情况?当页面框架也不在磁盘中时会发生什么?是否调用了另一个页面错误

当虚拟地址足够大,以至于主内存或磁盘都没有足够的存储空间容纳它时,会发生什么情况

虚拟内存系统在辅助存储器中维护逻辑地址空间的映像。一个设计良好的操作系统不允许一个进程映射一个逻辑地址,而这个逻辑地址在辅助存储中没有备份。当应用程序调用系统服务将页映射到逻辑地址空间时,如果没有可用于页的辅助存储,则调用将失败

当页面框架也不在磁盘中时会发生什么

有些设计拙劣的操作系统会在没有辅助存储的情况下映射页面。如果调用系统服务来映射页面,则即使无法在辅助存储中备份页面,系统服务也会成功。 在这种情况下,访问时会出现内存异常(并且在应用程序中不会得到任何提示,表明真正的问题是内存分配失败)

是否调用了另一个页面错误

没有

在逻辑内存系统(大多数处理器都支持)中,页面有两种状态:

1. Mapped
2. Unmapped
在虚拟内存系统中,有三种状态:

1. Mapped
2. Unmapped and valid
3. Unmapped and invalid
当出现页面错误时,处理器只知道页面未映射到内存。然后,操作系统必须确定页面是否位于辅助存储中的某个位置。如果不是,操作将导致进程看到异常。如果是,则操作系统加载并映射页面,允许进程以其愉快的方式继续

当虚拟地址空间大于物理内存时,操作系统可以使用交换退出页帧(例如LRU退出)

假设一个虚拟地址是48位(因此一个虚拟地址空间的大小是256 TiB),并且您正在运行123个进程,其中每个进程都有自己的虚拟地址空间。这总共有31488个TiB的虚拟地址空间。注意:对于运行现代操作系统(Windows、Linux等)的现代80x86 PC来说,这是“非常正常的”

在这31488个TiB中:

  • 几乎所有这些都将未使用,并标记为“不存在”。如果软件试图访问它,您会得到一个页面错误,页面错误处理程序会意识到这是一个bug,您可能会得到一个
    SIGSEGV
    (或“死亡蓝屏”或…)。因为它没有被使用,所以操作系统不需要任何RAM或磁盘空间

  • 其中一些将是相同的东西加载到RAM中一次,然后映射到许多虚拟地址空间。这对于内核本身和共享库/DLL来说非常常见。它还包括以下情况:同一RAM用于虚拟文件系统缓存和内存映射文件,或者同一RAM作为“共享内存”映射到2个或多个进程,或者同一RAM作为“写时复制”映射到2个或多个虚拟地址空间(例如,在
    fork()
    之后)

  • 有些将是“写时分配”-字面上是在许多虚拟地址空间中的许多虚拟地址处映射满零的同一页,如果您对其进行写入,则会出现一个页面错误,页面错误处理程序会为您尝试写入的页面分配一个新的RAM页面。这允许操作系统假装分配了大量虚拟空间,并用零填充,而不使用任何RAM或任何磁盘空间(直到实际修改)

  • 有些将是特定流程特有的(修改的)数据

最终的结果是,总虚拟空间的31488 TiB可能只需要几个GiB的RAM(并且可能根本不会使用交换空间)

过度提交

操作系统使用了一堆技巧来假装内存被分配了,而实际上并没有。这可能会造成最坏的情况,操作系统假装分配的所有内存实际上都需要分配。有两种方法可以解决此问题:

a) 如果无法覆盖最坏的情况,请拒绝让进程分配更多的内存(例如,当进程试图分配的内存超过操作系统所能提供的数量时,返回“内存不足”错误)。这是不好的,因为最坏的情况极不可能发生,最终软件会无缘无故地失败(“内存不足”,而实际上有足够的内存来满足当前的需求)

b) 允许流程分配更多(在合理范围内),即使您无法覆盖最坏的情况。这在大多数情况下都可以正常工作,但如果最坏的情况真的发生,则必须中断某些操作(例如,操作系统终止进程以释放一些RAM)

最好的选择(在我看来)是第一个选择(不允许过度提交),但是要有大量的交换空间。基本上;这类似于“允许RAM过度提交,但不允许交换空间+RAM过度提交”;在操作系统开始告诉进程“没有更多内存”之前,操作系统可能运行缓慢(由于交换空间使用过多);在大多数情况下,所有内容都在RAM中(理想情况下,交换空间仅用于覆盖不太可能出现的最坏情况)