【操作系统那些事儿】叁 存储管理

在这里插入图片描述

这是【自动驾驶事务所】的第十篇原创

什么内存?计算机中的内存是如何管理的吗?

内存(RAM)是计算机中一种需要认真管理的重要资源。

在这一讲中,我们就来聊聊操作系统是怎么对内存创建抽象模型以及怎样管理内存的那些事儿。

【操作系统那些事儿】系列文章
【操作系统那些事儿】壹 操作系统介绍

【操作系统那些事儿】贰 进程与线程(一)

【操作系统那些事儿】贰 进程与线程(二)

【操作系统那些事儿】贰 进程间通信(三)

学习目标
1、了解什么是内存?

2、了解什么是存储器抽象?

3、了解什么是虚拟内存?

4、了解什么内存中的虚拟置换法?

“不管存储器有多大,程序都可以把它填满。”
–帕金森定律

每个程序员都梦想拥有这样的内存:它是私有的、容量无限大的、速度无限快的,并且是用久性的存储器(即断电时不会丢失数据)。

如果价格还很便宜,那就更好了图片。

经过多年的探索,人们提出了“分层存储器体系(memory hierarchy)”的概念。

在这个体系中,主要有四种不同大小,作用的存储器。

1、若干兆(MB)快速、昂贵且易失性的高速缓存(cache);

2、数千兆(GB)速度与价格适中且同样易失性的内存;

3、几兆兆(TB)低速、廉价、非易失性的磁盘存储;

4、DVD或者USB等可移动存储装置。

操作系统的工作是将这个存储体系抽象成一个有用的模型并管理这个抽象模型。

操作系统中管理分层存储器体系的部分称为存储器管理(memorymananger)。

01

什么是虚拟内存

虚拟内存是在1961年提出来的,虚拟内存的基本思想是:每个程序拥有自己的地址空间,这个空间被分割成多个快,每一块称作一页或页面。

每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。

当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。

当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。

从某些角度可以说,虚拟内存是对基址寄存器和界限寄存器的一种综合。

而虚拟内存使得整个空间可以用相对较小的单元映射到物理内存,而不是为正文段和数据段分别进行重定位。

虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。

02

虚拟内存如何实现

分页

大部分虚拟内存系统中都使用一种称为分页(paging)的技术。

MOV REG, 1000

当程序执行上面的指令时,它把地址为1000的内存单元的内容复制到REG中,地址可以通过索引、基址寄存器、段寄存器或其他方式产生。

由程序产生的这些地址称为虚拟地址(virtural address),他们构成了一个虚拟地址空间(virtural address space)。

在没有虚拟内存的计算机上,系统直接将虚拟地址送到内存总线上,读写操作使用具有同样地址的物理内存字;

而在使用虚拟内存的情况下,虚拟地址不是被直接送到内存总线上,而是被送到内存管理单元(Memory Management Unit, MMU),MMU把虚拟地址映射为物理内存地址。

在这里插入图片描述

虚拟地址空间按照固定大小划分成页面(page)的若干单元。

在物理内存中对应的单元称为【页框】(page frame)。

**页表**

页表是最简单的一种虚拟内存的实现方法。

虚拟地址到物理地址的映射可以概括如下:虚拟地址被分成虚拟页号(高位部分)和偏移量(低位部分)两部分。

例如:对于16位地址和4KB的页面大小,高4位可以指定16个虚拟内存页面中的一页,而低12位接着确定了所选页面中的字节偏移量(0-4095)。

但是使用3或者5或者其他位数拆分虚拟地址也是可行的。不同的划分对应的页面大小。

页表的目的是把虚拟页面映射车为页框,从数学角度说,页表是一个函数,它的参数是虚拟页号,结果是物理页号。

通过这个函数可以把虚拟地址中的虚拟页面域替换成页框域,从而形成物理地址。

图片

虚拟内存本质上是用来创造一个新的抽象概念----地址空间,这个概念是对物理内存的抽象,类似于进程是对物理机器(CPU)的抽象。

虚拟内存的实现,是将虚拟地址空间分解成页,并将每一页映射到物理内存的某个页框或者(暂时)解除映射。

03

页面置换算法

当发生缺页中断时,操作系统必须在内存中选择一个页面将其换出内存,以便为即将调入的页面腾出空间。

如果要换出的页面在内存驻留期间已经被修改过,就必须把它写回磁盘以更新该页面在磁盘上的副本;

如果该页面没有被修改过(如一个包含程序正文的页面),那么它在磁盘上的副本已经是最新的,不需要回写。直接用调入的页面覆盖掉被淘汰的页面就可了。

最好的页面置换算法,该算法是这样工作的:在缺页中断发生时,有些页面在内存中,其中有一个页面(包含紧接着的下一条指令的那个页面)将很快被访问,其他页面则可能要到10、100或1000条指令后才会被访问,每个页面都可以用在该页面首次被访问前所要执行的指令数作为标记。

下面介绍几种页面置换算法:

1、最优页面置换算法

最优页面置换算法规定应该置换标记最大的页面。

如果一个页面在800万条指令内不会被使用,另外一个页面在600万条指令内不会被使用,则置换前一个页面,从而把因需要调入这个页面而发生的缺页中断推迟到将来,越久越好。

2、最近未使用页面置换算法

NRU(Not Recently Used,最近未使用)算法随机地从类编号最小的非空类中挑选一个页面淘汰之。

这个算法隐含的意思是,在最近一个时钟滴答中(典型的时间是大约20ms)淘汰一个没有被访问的已修改页面要比淘汰一个被频繁使用的“干净”页面好。

NRU主要优点是易于理解和能够有效地被实现,虽然它的性能不是最好的,但是已经够用了。

3、先进先出页面置换算法

开销较小的页面置换算法是FIFO(First-In First-Out,先进先出)算法。

先来先服务调度算法是一种最简单的调度算法,也称为先进先出或严格排队方案。

当每个进程就绪后,它加入就绪队列。当前正运行的进程停止执行,选择在就绪队列中存在时间最长的进程运行。

该算法既可以用于作业调度,也可以用于进程调度。先来先去服务比较适合于常作业(进程),而不利于段作业(进程)。

4、第二次机会页面置换算法

FIFO算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:检查最老页面的R位。

如果R位是0,那么这个页面既老又没有被使用,可以立刻置换掉;

如果是1,就将R位清0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续搜索。

这一算法称为第二次机会(second chance)算法,如图3-15所示。

在图3-15a中我们看到页面A到页面H按照进入内存的时间顺序保存在链表中。

在这里插入图片描述

5、时钟页面置换算法

在这里插入图片描述

6、最近最少使用页面置换算法
这个思想提示了一个可实现的算法:在缺页中断发生时,置换未使用时间最长的页面。

这个策略称为LRU(Least Recently Used,最近最少使用)页面置换算法。

小结:
在这里插入图片描述

NRU算法根据R位和M位的状态把页面分为四类。

从编号最小的类中随机选择一个页面置换。

该算法易于实现,但是性能不是很好,还存在更好的算法。

FIFO算法通过维护一个页面的链表来记录它们装入内存的顺序。

淘汰的是最老的页面,但是该页面可能仍在使用,因此FIFO算法不是一个好的选择。

总之,最好的两种算法是老化算法和工作集时钟算法,它们分别基于LRU和工作集。

它们都具有良好的页面调度性能,可以有效地实现。也存在其他一些算法,但在实际应用中,这两种算法可能是最重要的。

总结:

本章中我们考察了存储管理。我们看到在最简单的系统中是根本没有任何交换或分页的。

一旦一个程序装入内存,它将一直在内存中运行直到完成。

一些操作系统在同一时刻只允许一个进程在内存中运行,而另一些操作系统支持多道程序设计。

现代计算机都有某种形式的虚拟内存。

在最简单的形式中,每一个进程的地址空间被划分为同等大小的块,称为页面,页面可以被放入内存中任何可用的页框内。

有多种页面置换算法,其中两个比较好的算法是老化算法和工作集时钟算法。

免费获取千本电子书:
Github账号:https://github.com/alex-github-11/Basic-Module

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值