【操作系统】3.2 虚拟内存

1.虚拟内存的介绍

① 背景:软件占用的内存可能已经远远超出了电脑本身具有的物理内存

② 问题:为什么可以这样呢? 

虚拟内存。它可以让程序可以拥有超过系统物理内存大小的可用内存空间,虚拟内存为每个进程提供了一个一致的、私有的地址空间,让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)

③ 意义:虚拟内存定义了一个连续的虚拟地址空间,并且把内存扩展到硬盘空间

虚拟内存 使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间)。然而,它实质上是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如 RAM)的使用也更有效率。目前,大多数操作系统都使用了虚拟内存,如 Windows 家族的“虚拟内存”;Linux 的“交换空间”等。

——来自:https://zh.wikipedia.org/wiki/虚拟内存

2.虚拟地址寻址

虚拟寻址(Virtual Addressing) 的寻址方式。使用虚拟寻址,CPU 需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。 实际上完成虚拟地址转换为物理地址转换的硬件是 CPU 中含有一个被称为 内存管理单元(Memory Management Unit, MMU) 的硬件。

虚拟寻址过程

为什么要有虚拟地址空间呢?

如果程序都是直接访问和操作的都是物理内存,这样有什么问题?

① 用户程序可以访问任意内存,寻址内存的每个字节,这样就很容易破坏操作系统,造成操作系统崩溃。

② 如果需要同时运行多个程序特别困难,比如你想同时运行一个微信和一个 QQ 音乐都不行。为什么呢?举个简单的例子:微信在运行的时候给内存地址 1xxx 赋值后,QQ 音乐也同样给内存地址 1xxx 赋值,那么 QQ 音乐对内存的赋值就会覆盖微信之前所赋的值,这就造成了微信这个程序就会崩溃。

总结:如果直接把物理地址暴露出来的话会带来严重问题,比如可能对操作系统造成伤害以及给同时运行多个程序造成困难。

虚拟地址访问内存的优势

① 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。

② 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。

③ 不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。

3.局部性原理

局部性原理是虚拟内存技术的基础,正是因为程序运行具有局部性原理,才可以只装入部分程序到内存就开始运行

程序在执行的时候往往呈现局部性规律,也就是说在某个较短的时间段内,程序执行局限于某一小部分,程序访问的存储空间也局限于某个区域。

虚拟内存技术实质是建立了 “内存一外存”的两级存储器的结构,利用局部性原理实现髙速缓存。

(1)时间局部性 

如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。因为在程序中存在着大量的循环操作。

时间局部性的实现:通过将最近使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。

(2)空间局部性

一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问。因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。

空间局部性的实现:使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。

4.虚拟存储器

基于局部性原理,在加载程序时,可以将程序的一部分加载到内存,而将其他部分留在外存,就可以启动程序执行。因为外存往往比内存大很多,所以运行软件的内存大小可以大于计算机系统实际的内存。

在程序执行过程中,如果所访问的信息不在内存,操作系统将所需要的部分调入内存,然后继续执行程序。同时,操作系统将内存中暂时不使用的内容换到外存上,从而腾出空间存放将要调入内存的信息。因此,计算机好像为用户提供了一个比实际内存大的多的存储器——虚拟存储器。—— 来自:王道考研操作系统知识点整理

5.虚拟内存的实现机制

虚拟内存的实现需要建立在离散分配的内存管理方式的基础上,例如分页管理分段管理段页式管理。

5.1 请求分页存储管理

基于页式管理机制(即基本分页储存管理机制),增加了请求分页功能和页面置换功能。在请求分页存储管理系统中,在作业开始运行之前,仅装入当前要执行的部分段即可运行。假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中

对比基本分页储存管理机制,操作系统需要知道页面是否已经调入内存在外存中的地方访问字段是否被修改过。因此,对比基本分页存储的页表,请求分页存储的页表新增了状态位、访问字段、修改位、外存地址四个字段,如下图所示。

请求分页存储的页表

(1)存在空闲块

如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表相应的页表项。

例子:如下图所示,调入0号页之后的状态。

存在空闲块

(2)不存在空闲快

如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页在内存期间被修改过,则要将其写回外存。未修改过的页面不需要写回外存。

例子:如下图所示,如果选择淘汰2号页,但是2号页被修改过,所以需要将其写回外存。接着2号的内存空间就可以给0号块使用。

不存在空闲块

5.2 请求分段存储管理

基于段式管理机制(即基本分段储存管理机制),增加了请求分段功能、分段置换功能。请求分段储存管理方式就如同请求分页储存管理方式一样,在作业开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。

5.3 请求段页式存储管理

6.页面置换算法

页面置换算法的作用:当发生缺页中断的时候,如果当前内存中并没有空闲的页面,操作系统就必须在内存选择一个页面将其移出内存,以便为将要调入的页面让出空间。用于选择淘汰哪一页的规则叫做页面置换算法

虚拟地址映射到物理地址的过程中,若在页面中发现所要访问的页面不在内存中,则发生缺页中断。 缺页中断 就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。

(1)OPT 页面置换算法(最佳页面置换算法)

最佳(Optimal, OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面。这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。一般作为衡量其他置换算法的方法。

(2)FIFO页面置换算法(先进先出页面置换算法)

总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。

(3)LRU 页面置换算法(最近最久未使用页面置换算法) 

LRU算法采用记录一个页面自上次被访问以来所经历的时间 T,即页表的访问字段。当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。

(4)LFU 页面置换算法(最少使用页面置换算法)

LFU算法采用记录一个页面被访问的次数 N,即页表的访问字段。LFU算法选择在之前时期使用最少的页面作为淘汰页。

你可能感兴趣的:(【操作系统】3.2 虚拟内存)