Linux 内存管理--虚拟内存和需求分页
内存管理是 Linux 内核完成的最复杂的活动之一。它有各种与之相关的概念及问题。
在本文中,我们将尝试基于虚拟内存和需求分页,因为这些是与内存管理相关的一些重要概念。
虚拟内存
虚拟内存的概念是内存管理中非常强大的方面之一。自计算机的最初时代以来,人们就感觉到对内存的需求超过了现有的物理内存。多年来,许多解决方案被用来克服这个问题,其中最成功的是虚拟内存的概念。
虚拟内存使您的系统看起来好像拥有比实际更多的内存。这听起来可能很有趣,并且可能会提示人们这怎么可能。所以,让我们理解这个概念。
- 首先,我们必须了解虚拟内存是映射到物理地址的一层内存地址。
- 在虚拟内存模型中,当处理器执行程序指令时,它会从虚拟内存中读取指令并执行它。
- 但在执行指令之前,它首先将虚拟内存地址转换为物理地址。
- 这种转换是基于虚拟到物理地址的映射完成的,该映射是基于页表中包含的映射信息(由操作系统维护)完成的。
虚拟和物理内存被划分为称为页面的固定长度块。在这种分页模型中,虚拟地址可以分为两部分:
- 偏移量(低 12 位)
- 一个虚拟页帧号(其余位)
当处理器遇到虚拟地址时,它会从中提取虚拟页帧号。然后它将这个虚拟页框号转换为物理页框号,偏移部分帮助它到达物理页中的确切地址。这种地址转换是通过页表完成的。
理论上我们可以考虑一个页表包含以下信息:
- 描述条目是否有效的标志
- 此条目描述的物理页框号
- 访问有关页面的信息(如只读、读写等)
通过虚拟页框号访问页表,使用它作为页表中条目的偏移量。例如,虚拟页框号“2”指向页表中的条目“1”(条目号以“0”开头)。
下图中,VPFN 代表虚拟页框号,PFN 表示物理页框号。
处理器可能会转到具有虚拟页框号的进程页表条目并发现该条目无效。在这种情况下,处理器负责将控制权交给内核并要求它解决问题。不同的处理器以不同的方式传递控制,但这种现象被称为“页面错误”。但如果条目有效,则处理器获取物理页帧号,乘以页面大小以获得物理页的基地址,然后添加偏移量以获得确切的物理地址。
所以现在我们了解到,通过虚拟内存的概念,每个进程都认为它拥有所有范围的虚拟地址可供使用,因此这个概念使系统看起来好像它拥有比实际可用的更多的物理内存。
请求分页
在上一节中,我们了解到,如果处理器使用虚拟页框号进入进程页表,而表中没有条目,则会出现两种情况。
- 进程试图访问无效的内存地址
- 虚拟地址对应的物理页没有加载到物理内存中
在上述两种情况中,情况 1 是进程尝试存储不允许的地址的情况。在这种情况下,会产生页面错误并且内核终止该进程。
而在情况“2”中,如已经说明的,对应于虚拟地址的物理页面尚未加载到物理内存中。在这种情况下,也会产生页面错误,然后内核会尝试将所需的内存页面从硬盘带入物理内存。
由于将页面从硬盘带入物理内存的操作非常耗时,因此此时会发生进程之间的上下文切换,并且会执行一些其他进程。同时,较早进程的页面被带入物理内存并更新页表,然后从导致“页面错误”的同一条指令再次将该进程带回执行。
这称为需求分页,其中与进程对应的所有内存页面在任何给定时间都不存在于物理内存中。这样可以避免物理内存被不需要的内存页面堵塞,而在必要时可以通过页面错误将这些页面带入物理内存。
- 点赞
- 收藏
- 关注作者
评论(0)