Linux 操作系统原理 — 内存 — 基于局部性原理实现的内/外存交换技术

目录

前文列表

Linux 操作系统原理 — 内存 — 物理存储器与虚拟存储器
Linux 操作系统原理 — 内存 — 基于 MMU 硬件单元的虚/实地址映射技术

基于局部性原理实现的内-外存交换技术

虚拟存储器的实现思想就是将内存作为辅存的缓存,使得计算机系统拥有了 主存+辅存(交换空间) 大小的存储空间,同时也拥有了接近于主存的访问速度。

局部性原理

虚拟存储器的核心思路是根据程序运行时的局部性原理:一个程序运行时,在一小段时间内,只会用到程序和数据的很小一部分,仅把这部分程序和数据装入主存即可,更多的部分可以在需要用到时随时从辅存调入主存。在操作系统和相应硬件的支持下,数据在辅存和主存之间按程序运行的需要自动成批量地完成交换。

局部性原理是虚拟内存技术的基础,正是因为程序运行具有局部性原理,才可以只装入部分程序到内存就开始运行。早在 1968 年的时候,就有人指出我们的程序在执行的时候往往呈现局部性规律,也就是说在某个较短的时间段内,程序执行局限于某一小部分,程序访问的存储空间也局限于某个区域。

局部性原理表现在以下两个方面:

  1. 时间局部性:如果程序中的某条指令一旦执行,不久以后该指令很可能再次执行;如果某数据被访问过,不久以后该数据很可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。时间局部性是通过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。

  2. 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上就是建立了 “内存-外存” 的两级存储器的结构,利用局部性原理实现髙速缓存。

基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其他部分留在外存,就可以启动程序执行。由于外存往往比内存大很多,所以我们运行的软件的内存大小实际上是可以比计算机系统实际的内存大小大的。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换到外存上,从而腾出空间存放将要调入内存的信息。

可见,内-外存交换技术本质是一种时间换空间的策略,你用 CPU 的计算时间,页的调入调出花费的时间,换来了一个虚拟的更大的空间来支持程序的运行。

Swap 交换分区

通常,Linux 的内存已满并且内核没有可写空间时,系统就会崩溃。但如果系统拥有 Swap(交换)分区,那么 Linux 内核和程序就会使用它,但是速度会慢很多。因此,在内容容量紧张的场景中,拥有 Swap 交换空间会更安全。

为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。

Swap 分区有一个缺点:它比 RAM 慢很多,因此,添加交换空间不会使你的计算机运行速度更快,它只会帮助克服一些内存不足带来的限制。

在这里插入图片描述

虚拟存储器的 Swap 特性并不总是有益,放任进程不停地将数据在内存与磁盘之间大量交换会极大地占用 CPU,降低系统运行效率,所以有时候我们并不希望使用 Swap 分区。可以修改 vm.swappiness=0 来设置内存尽量少使用 Swap 分区,或者干脆使用 swapoff 命令禁用掉 Swap 分区。

猜你喜欢

转载自blog.csdn.net/Jmilk/article/details/106871342
今日推荐