操作系统基础(二)(内存管理)

内存

内存(RAM)是计算机需要认真管理的重要的资源。每个程序员都梦想拥有这样的存储器:他是 私有的、容量是无限大的、速度是无限快的,并且是永久性的(即断电时不会丢失数据)。然而现实总是充满遗憾的,于是经过多年的探索,人们提出分层存储器体系的概念,即在这个体系中,计算机有若干兆(MB)快速、昂贵且易失性的高速缓存,数千兆(GB)速度与价格适中且同样易失性的内存、以及几兆兆(TB)低速、廉价、非易失性的磁盘存储。操作系统的工作是将这个存储体系抽象为一个有用的模型并管理这个抽象模型。
最简单的存储器抽象就是根本没有抽象,每一个程序都是直接访问物理内存。但这也引发了一系列问题。

存储器的抽象

把物理地址暴露给进程会带来下面几个严重问题:
1)如果用户程序可以寻址内存的每个字节,它们就可以很容易的破坏操作系统,从而使系统慢慢的停止运行。
2)想要同时运行多个程序是很困难的。

地址空间的概念

解决上述的问题办法就是创造一个新的存储器抽象:地址空间。
地址空间 就是一个进程可以用来寻址内存的一套地址的集合,每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(除了在一些特殊情况下进程需要共享它们地址空间)。

解决内存超载的方法

所有进程所需要的RAM数量总和通常要远远超过存储器能够支持的范围。有两种处理内存超载的技术。
1)交换,即把一个内存完整调入内存,使该进程运行一段时间,然后把它存回磁盘。空闲进程主要存储在磁盘上,所以当它们不运行的时就不会占用内存。
2)虚拟内存,每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页或页面。(较为重要)

虚拟内存

当程序执行指令:MOV REG,1000
他把地址为1000的内存单元的内容复制到REG中。地址可以通过索引、基址寄存器、段寄存器或其他方式产生,由程序产生的这些地址称为虚拟地址,它们构成了一个虚拟地址空间。在没有虚拟内存的计算机上,系统能直接将虚拟地址送到内存总线上,而在使用虚拟内存的情况下,虚拟地址不是被直接送到内存总线上,而是被送到内存管理单元(MMU),由MMU把虚拟地址映射为物理内存地址。

分页

虚拟地址按照固定大小划分成被称为页面的若干的单元,在物理内存中对应的单元成为页框,页面和页框大小通常是一样的。但是页面的个数多于页框的个数,从而达到解决内存超载的问题。

页表

作为一种最简单的实现,虚拟地址到物理地址的映射可以概括如下:虚拟地址被分成虚拟页号(高部分)和偏移量(低部分)两部分。虚拟页号可以作为页表的索引,以找到该虚拟页面对应的页表项,由页表项可以找到页框号。

页面置换算法

当发生缺页中断时,操作系统必须在内存中选择一个页面将其换出内存,以便为即将调入的页面腾出空间。如何选择这个页面,从而引申出很多页面置换算法。

最优页面置换算法

在缺页中断发生时,有些页面在内存中,其中有一个页面(包含紧接着的下一条指令的那个页面)将很快被访问,其他页面则可能要到10、100或1000条指令后才会被访问,每个页面都可以用在该页面首次被访问前所要执行的指令数作为标记。
这个算法唯一的问题就是它无法实现,当缺页中断发生时,操作系统无法知道各个页面下一次将在什么时候被访问。下面将研究在实际操作系统中可以使用的算法。

最近未使用页面置换算法

当页面被访问时设置R位,当页面被写入时(即修改)设置M位。当启动一个进程时,他的所有页面的两个位都由操作系统设置为0,R位被定期清零,以区别最近没有被访问的页面和被访问的页面。当发生缺页中断时,操作系检查所有页面并根据它们当前的R位和M位的值,把它们分为4类:
1)第0类:没有访问,没有被修改。
2)第1类:没有被访问,已被修改。
3)第2类:已被访问,没有被修改
4)第3类:已被访问,已被修改。
NRU(最近未使用)算法随机从类编号最小的非空类中挑选一个页面淘汰,这个算法的隐含的意思是,在最近一个时钟滴答中淘汰一个没有被访问的已修改页面比淘汰一个被频繁使用的页面好。

先进先出页面置换算法

由操作系统维护一个所有当前在内存中的页面的链表,最新进入的页面放在表尾,最早进入的页面放在表尾,最早进入的页面放在表头。当发生缺页中断时,淘汰表头的页面并把新调入的页面放在表尾。(这样会造成很常用的页面被淘汰,所以在操作系统中很少使用)

第二次机会页面置换算法

第二次机会算法就是寻找一个在最近的时钟间隔内没有被访问过的页面。如果所有页面都被访问过了,该算法就简化为纯粹的先进先出算法。

时钟页面置换算法

将所有页面都保存在一个类似钟面的环形链表中,一个表针指向最老的页面,当发生缺页中断时,如果它的R位(0表示没被访问,1表示被访问)为0就淘汰该页面,并把新的页面插入这个位置,然后把表针前移一个位置;如果R为为1就清除R位并把表针前移一个位置。重复这个过程指导找到了一个R位为0的页面为止。

最近最少使用页面置换算法

当发生缺页中断时,置换未使用时间最长的页面,这个测策略就是LRU(最近最少使用)页面置换算法。虽然LRU在理论上是可行的,但代价很高;为完全实现LRU,需要在内存中维护一个所有页面的链表,最近最多使用的页面在表头,最近最少使用的页面在表尾。困难的是每次访问内存时都必须要更新整个链表。

工作集页面置换算法

一个进程当前正在使用的页面的集合成为它的工作集。不少分页系统都回去设法跟踪进程的工作集,以确保在让进程运行前,它的工作集就已在内存中了,这种方法称为工作集模型,其目的在于大大减少中断率。
工作集的页面置换算法,基本思路就是找出一个不在工作集中的页面淘汰它。为了实现该算法,就需要一种精确的方法来确定哪些页面在工作集中。根据定义,工作集就是最近k次内存访问所使用过的页面的集合。为了实现工作集算法,必须预先选定k的值。但是由于这种方法开销较大,采用一种近似的方法来实现。即工作集是过去10ms中,内存访问所用到的页面的集合。
算法主要靠页面的生存时间t和R位(访问)来判断该页面是否在工作集中,从而淘汰不在工作集中的页面。

工作集时钟页面置换算法

当缺页中断发生后,需要扫描整个页表才能确定被淘汰的页面,因此基本工作集算法是比较费时的。
工作集时钟算法将时钟算法和工作集算法集合起来,采用一个以页框为元素的循环表,然后利用工作集的思想来淘汰内存中的页]\面。

分页系统中的设计问题

1)局部分配策略和全局分配策略
2)负载控制
3)页面大小
4)分离的指令空间和数据空间
5)共享页面
6)共享库
7)内存映射文件
8)清除策略
9)虚拟内存接口

有关实现的问题

1)与分页有关的工作
2)缺页中断的处理
3)指令备份
4)锁定内存中的页面
5)后备存储
6)策略和机制的分离

分段

到目前为止讨论的虚拟内存都是一维的虚拟地址从0到最大地址,一个地址接着一个地址,对许多问题来说,有两个或者多个独立的地址有助于问题的求解。从而引申出段的概念,每一段都是一个从0到最大的线性地址序列构成,各个段的长度可以是0到某个允许的最大值之间的任何一个值。

小结

本章主要讲解内存管理,最简单的系统中是根本没有任何交换或分页的。一旦程序装入内存,它将持续在内存中运				
行,直到结束。一些操作系统一次只允许一个进程在内存中运行,而另一些操作系统支持多道程序设计。接来下是交
换技术,通过交换技术,系统可以同时运行总内存占用超过实际物理内存大小的多个进程,如果一个进程没有内存间
可用,它将会被交换到磁盘上。
现代计算机都拥有某种形式的虚拟内存。最简单的情况,每一个进程的地址空间被划分成同等大小的块,称为页面,
页面可以被放入内存中任何可用的页框里,从而引申了很多页面置换算法。
为了使分页系统工作良好,仅页面置换算法是不够的,还需要管制诸多问题。
如果要处理在执行过程中大小有变化的数据结构,分段是一个有用的选择,他还能简化连接和共享,同时他还有利于
为不同的段提供不同的保护。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值