我有一个关于页表条目的简单问题。假设我们获得了一个32位虚拟地址,具有4 KiB页,并且物理内存大小为2 ^ 28位。
由于页偏移量是12位,所以我们将有2 ^ 20页表项被映射到2 ^ 16个物理帧。但是2 ^ 20条目如何映射到2 ^ 16条目。物理帧地址将用完。假设该进程使用了完整的2 ^ 20页,然后假定整个RAM仅包含该进程的内存,则RAM中的所有2 ^ 16帧都将包含此进程的内存。我是否正确地说页面表条目中的2 ^ 4将显示它映射到磁盘?
此外,如果进程仅使用一个页表,那么其余2 ^ 20-1页表条目将无效?
答案 0 :(得分:1)
您的问题中有很多假设。为了配合使用,您假定页表项是32位。它们可能是64位,甚至是128位。
您还假定有20位可用于指示进入页面帧。任何实际的系统都将需要其中一些用于控制和保护目的。
但是2 ^ 20条目如何映射到2 ^ 16条目。物理帧地址将用完。
这是虚拟内存系统的重点。假设您有2 ^ 20个页面映射到一个流程,但只有2 ^ 16个物理页面,那么并非所有流程的页面都将同时映射到页面框架。
我要说的是2 ^ 4的页表项将显示它映射到磁盘吗?
合理设计的虚拟内存系统会在磁盘上某个位置维护所有进程页面的副本。这些页面将从磁盘复制到内存广告,并根据需要映射到地址空间。
答案 1 :(得分:1)
但是2 ^ 20条目如何映射到2 ^ 16条目。物理帧地址用完了。
要了解有关虚拟内存的重要事情是它是“虚拟的”-这是一种幻觉,实际上(物理上)不存在。这使操作系统可以执行各种技巧,例如:
将某些/很多虚拟页面标记为“未使用/不存在”,以便在不需要内存时不会浪费其内存(从而使程序在尝试访问不存在的内容时出错) -例如SIGSEGV
信号)。
在RAM和交换空间之间移动页面,以假装存在比实际更多的RAM。请注意,这不仅限于“交换磁盘上的空间”,例如它可能是某种设备内置的内存(例如,视频卡中未使用的内存),当前计算机中没有的内存(例如,使用网络将数据存储在另一台计算机的RAM中),也可能是RAM在同一台计算机上(例如,如果一半数据可以压缩到一半大小,那么“压缩为交换空间”将使您在3 MiB RAM中存储4 MiB数据)。
伪装的RAM是通过将同一页充满零的页面映射到各处来分配的,然后在以后分配它(如果且仅当该页面被写入时);这样您就可以拥有一个大的零区域(例如程序的“ .bss”部分),而几乎不花费任何费用(直到/除非将其写入)。
假设文件被映射/加载到内存中而没有分配内存,也没有加载文件;然后在以后访问数据时分配页/ s并将数据加载到其中,并且(如果操作系统将其用于其他用途,则获得更多的可用RAM)如果未修改,则释放内存(知道您可以稍后再从磁盘再次获取它
将同一页RAM映射到多个进程中。例如,如果您有10个进程都在执行同一个可执行文件,那么,那么可执行文件可能会一次存储在RAM中,然后映射到虚拟文件系统的缓存中,再映射到10个不同的进程中。
“写时复制”技巧;将同一页RAM映射到许多进程中(以便任何进程都可以从该页读取),然后,如果某个进程写入该页,则OS可以分配新页并复制旧页并替换旧页原始(共享,只读)页面以及新的(非共享,可写)副本。
如果每个虚拟地址空间为1 MiB,那么您可能有100个进程(具有100个虚拟地址空间,总空间为1 GiB),其中每个进程仅使用(平均)512 KiB虚拟地址空间,因此看起来总共使用了51200 KiB虚拟内存;但是计算机可能只有64 KiB的RAM,而剩余的51136 KiB的虚拟内存只是一个骗局。