Linux 内存管理--交换、缓存和共享虚拟机

举报
Tiamo_T 发表于 2022/06/04 09:07:30 2022/06/04
【摘要】 尽管虚拟内存和按需分页是 Linux 内存管理系统的构建块,但还有许多其他概念使 Linux 内存管理非常强大。 在本文中,我们将尝试接触其中一些概念(交换、缓存和共享虚拟内存)。

尽管虚拟内存和按需分页是 Linux 内存管理系统的构建块,但还有许多其他概念使 Linux 内存管理非常强大。

在本文中,我们将尝试接触其中一些概念(交换、缓存和共享虚拟内存)。

一、Linux交换

假设有这样一种情况,一个进程需要将它的一个虚拟页面放入物理内存,但物理内存没有空间容纳更多页面。

在这种情况下会发生什么?

好吧,操作系统将不得不通过允许此页面位于物理内存中来管理这种情况。但是要做到这一点,已经存在于物理内存中的页面需要被丢弃。


现在,如果要丢弃的页面来自可执行映像或数据文件并且该页面尚未被写入,那么它可以很容易地被丢弃,因为在需要时,可以很容易地将同一页面从同一个可执行文件带回物理内存图像或数据文件。

但是假设操作系统要丢弃的页面是已写入的页面,那么这种页面称为脏页面。

必须保留脏页,以便在以后的某个阶段使用。当从物理内存中丢弃脏页时,它们会保存在称为交换文件的特殊文件中。这称为交换

如果与处理器的速度相比,访问交换页面所花费的时间是相当可观的。

所以我们看到操作系统应该有一个好的交换算法来决定丢弃还是交换。低效的交换算法可能会导致一种现象,即操作系统忙于交换文件,然后再次读回物理内存,实际上它只花费很少的时间来处理所需的实际工作。这种现象被称为抖动

此外,进程持续使用的一组页面称为工作集。一个好的交换算法很少会让操作系统陷入颠簸,并且还会确保所有进程的工作集始终存在于物理内存中。

Linux 使用“最近最少使用”的方案来决定将哪些页面保留在内存中以及删除哪些页面。

在这个方案中,物理内存中的每一页都有一个与之相关的年龄。年龄随着页面是否被访问而改变。如果该页面被频繁访问,那么该页面的年龄应该很年轻,而如果一个页面没有被访问,那么该页面就会变老。较旧的页面被提议从物理内存中交换/丢弃。

二、缓存

为了充分利用系统,正在开发快速处理器和操作系统。虽然这很好,但使处理器、操作系统及其交互更快的一个方面是缓存的概念。

下面介绍 Linux 中的一些重要缓存。

1.Linux交换缓存

如上所述,只有脏页被交换,因为我们需要保留已修改的页面。另外,假设如果一个页面被修改并被交换,现在如果同一个页面被带回物理内存,现在需要再次交换它但该页面没有被进一步修改,那么就不需要交换这个页。只需丢弃它,因为此版本的页面已经存在于交换文件中。这样可以节省大量时间,否则会被浪费掉。

现在为了实现上述概念,Linux 使用了交换缓存。

  • 交换缓存只不过是一个页表条目列表,每个物理页有一个条目。
  • 每个条目对应于一个换出的页面,以及有关保存该页面的交换文件的信息以及它在交换文件中的确切位置。
  • 如果交换缓存中的任何页表条目不为零,则它表示正在保存在交换文件中的页面并且该页面尚未被进一步修改。
  • 如果一个页面在交换缓存中有它的条目并且被进一步修改,则从交换缓存中删除它的条目。
  • 这样,缓存仅包含自上次交换后未修改的页面的信息。

所以我们看到交换缓存对提高交换机制的效率有很大帮助。

2.硬件缓存

正如我们在上一篇文章中已经讨论过的,处理器读取页表条目以将虚拟地址转换为物理地址。通常,处理器将页表条目的信息存储在硬件缓存中。

此硬件缓存由平移后备缓冲区或 TLB组成。

每当处理器需要转换虚拟地址时,它就会尝试从 TLB 中获取页表条目信息。如果找到该条目,则继续进行,但如果处理器无法找到任何此类条目,则它会告诉操作系统发生了 TLB 未命中并要求操作系统进行修复。

为了将 TLB 未命中的信息传递给操作系统,使用了某种依赖于处理器的异常机制。现在,操作系统找到正确的条目并用它更新 TLB 条目。当异常被清除时(在操作系统修复问题之后),处理器再次尝试在 TLB 中搜索条目,这一次它找到了一个有效的条目。

3.Linux缓冲区缓存

缓冲区高速缓存包含块设备驱动程序使用的数据缓冲区。

块设备驱动程序是一种对数据块进行操作的驱动程序,即可以通过读取或写入固定的数据块或数据块来访问它。缓冲区高速缓存被索引。设备标识符用于索引目的。

缓冲区缓存使读/写非常高效和快速。例如考虑一个块设备,例如硬盘。读取/写入硬盘需要文件 I/O,如果每次读取或写入都在硬盘上执行,这将非常昂贵。位于两者之间的缓冲区缓存可以节省时间,因为在此完成读取和写入,其余由缓存负责。

要查看交换、内存、页面、块 IO、陷阱、磁盘和 cpu 活动,您可以使用vmstatsar等工具。

三、共享虚拟内存

编写代码时,开发人员会非常小心,不要不必要地重复任何代码。例如,在程序中使用函数,以便可以随时从代码中调用同一段代码。

一组可以常用的函数被合并到库中。这就是共享内存的概念,它一旦加载到内存中,就可以被多个进程使用。

虚拟内存使进程可以轻松共享内存,这是因为物理地址是通过页表映射的,同一物理页帧号很可能会映射到多个进程的页表中。这个概念被称为共享虚拟内存

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。