主存管理

送分小仙女□ 提交于 2020-01-22 08:38:51

1 概念

存储器
storage, memmory
能接收数据和保存数据、而且能根据命令提供这些数据的装置。

存储器分成两类:

内存储器(简称内存、主存、物理存储器)
处理机能直接访问的存储器。用来存放系统和用户的程序和数据,其特点是存取速度快,存储方式是以新换旧,断电信息丢失。

外存储器(简称外存、辅助存储器)
处理机不能直接访问的存储器。用来存放用户的各种信息,存取速度相对内存而言要慢得多,但它可用来长期保存用户信息。在文件系统中介绍。

1.内存的物理组织

物理地址:
把内存分成若干个大小相等的存储单元,每个单元给一个编号,这个编号称为内存地址(物理地址、绝对地址、实地址),存储单元占8位,称作字节(byte)。

物理地址空间:
物理地址的集合称为物理地址空间(主存地址空间),它是一个一维的线性空间。
在这里插入图片描述
2.程序的逻辑结构

程序地址:用户编程序时所用的地址(或称逻辑地址 、虚地址 ),基本单位可与内存的基本单位相同,也可以不相同。
程序地址空间(逻辑地址空间、虚地址空间):用户的程序地址的集合称为逻辑地址空间,它的编址总是从0开始的,可以是一维线性空间,也可以是多维空间。
在这里插入图片描述

2存储管理的功能

1.存储管理功能
地址映射 将程序地址空间中使用的逻辑地址变换成主存中的地址的过程
(2) 主存分配
按照一定的算法把某一空闲的主存区分配给作业或进程。
(3) 存储保护 保证用户程序(或进程映像)在各自的存储区域内操作,互不干扰。
(4) 提供虚拟存储技术 使用户程序的大小和结构不受主存容量和结构的限制,即使在用户程序比实际主存容量还要大的情况下,程序也能正确运行.

2.1 地址映射

地址映射
将程序地址空间中使用的逻辑地址变换成主存中的地址的过程称为地址映射。有时也称为地址重定位 。
在这里插入图片描述
二、地址映射方式
地址映射的功能就是要建立虚实地址的对应关系,实现地址映射有三种方式:
1.编程或编译时确定地址映射关系
2.静态地址映射
3.动态地址映射

1.编程或编译时确定地址映射关系
编程时确定虚-实地址的关系是指在用机器指令编程时,程序员直接按物理内存地址编程,这种程序在系统中是不能做任何移动的,否则就会出错。

2.静态地址映射
静态地址映射是在程序装入内存时完成从逻辑地址到物理地址的转换的。
在一些早期的系统中都有一个装入程序(加载程序),它负责将用户程序装入系统,并将用户程序中使用的访问内存的逻辑地址转换成物理地址。如左图所示。
评价:
优点是实现简单,不要硬件的支持。
缺点是程序一旦装入内存,移动就比较困难。有时间上的浪费。在程序装入内存时要将所有访问内存的地址转换成物理地址。
在这里插入图片描述
3.动态地址映射
动态地址映射是在程序执行时由系统硬件完成从逻辑地址到物理地址的转换的。
系统中设置了重定位寄存器。
在这里插入图片描述
动态地址映射是由硬件执行时完成的,程序中不执行的程序就不做地址映射的工作,这样节省了CPU的时间 。
重定位寄存器的内容由操作系统用特权指令来设置,比较灵活。
实现动态地址映射必须有硬件的支持,并有一定的执行时间延迟。现代计算机系统中都采用动态地址映射技术。

动态地址映射技术能满足以下目标:
(1)具有给一个用户程序任意分配内存区的能力;
(2)可实现虚拟存储;
(3)具有重新分配的能力
(4)对于一个用户程序,可以分配到多个不同的存储区

2.3 内存分配

在多道程序设计的环境中,内存分配的功能包括:制定分配策略、构造分配用的数据结构、响应系统的内存分配的请求和回收系统释放的内存区。内存管理策略有三种:
1、放置策略
决定内存中放置信息的区域(或位置),即如何在若干个空闲区中选择一个或几个空闲区的原则;
2、调入策略
决定信息装入内存的时机,有两种:在用户请求时调入,称为请调;根据某种算法,确定系统将要使用的信息,并在执行前预先调入内存,称为预调 ;
3、淘汰策略
当内存不足时,决定将某些信息调出内存的策略 。

2.4 提供虚存

1、问题的提出
物理存储器的结构是个一维的线性空间,容量是有限的。
用户程序结构:
一维空间
一个用户程序就是一个程序,并且程序和数据是不分离的;
二维空间 程序由主程序和若干个子程序(或函数)组成,并且程序与数据是分离的;
n维空间 即一个大型程序,由一个主模块和多个子模块组成,其中各子模块又由主程序和子程序(或函数)组成。
用户程序的大小,可能比内存容量小,也可能比内存容量大,有时候要大得多。
2. 虚拟存储器概念
虚拟存储器
为用户提供一种不受物理存储器结构和容量限制的存储器的技术称为虚拟存储器,或称虚拟存储技术。
它是用户编程时所使用的一种用户思维中的存储器,它可以是任何结构(一维线性空间、二维空间、乃至n维空间),并没有容量的限制。
现代计算机操作系统都采用了这种技术,使得用户编程序时不需要考虑物理内存的结构和容量,极大地方便了用户。
虚拟存储器需要大容量的外存储器的支持,或称物资基础。

2.5 存储保护

在多道程序设计的环境下,系统中有系统程序和多个用户程序同时存在,如何保证用户程序不破坏系统程序,用户程序之间不相互干扰?这就是存储保护所要解决的问题。
常用的存储保护有两种。
1.上下界保护
下界寄存器 存放程序装入内存后的开始地址(首址)
上界寄存器 存放程序装入内存后的末地址
判别式:
下界寄存器 ≤ 物理地址 < 上界寄存器
在这里插入图片描述
例:
有一程序装入内存的首地址是500,末地址是1500,访问内存的逻辑地址是500、345、1000。
下界寄存器:500
上界寄存器:1500
逻辑地址+装入内存的首地= 物理地址
1、500+500 = 1000 500 ≤ 1000 < 1500√
2、345+500 = 845 500 ≤ 845 < 1500√
3、1000+500 = 1500 500 ≤ 1500 < 1500×

2.基址、限长寄存器保护
例:
有一程序装入内存的首地址是500,末地址是1500,访问内存的逻辑地址是500、345、1000。
下界寄存器:500
上界寄存器:1500
1、 500 ≤ 500 < 1000√
2、 500 ≤ 345 < 1000√
3、 500 ≤ 1000 < 1000×

3.两种存储保护技术的区别
区别:
1、寄存器的设置不同;
2、判别式中用的判别条件不同
上下界寄存器保护法用的是物理地址
基址、限长寄存器保护法用的是程序的逻辑地址。对于合法的访问地址这两者的效率是相同的,对不合法的访问地址来说,上下界存储保护浪费的CPU时间相对来说要多些。

3 分区存储管理

3.1 概述

分区存储管理是满足多道程序设计的最简单的一种存储管理方法,它允许多个用户程序同时存在系统内存中,即共享内存空间。
最早期的分区存储管理采用固定分区的方法,把内存空间分成若干个大小不等的区域,称为分区。每个用户程序(作业、进程)调入内存后,占用其中一个分区,程序运行完成后释放该分区。
这种存储管理的方法的主要问题是内存使用效率极低,很快就被淘汰了。
动态分区存储管理技术
系统生成后,操作系统占用内存的一部分,一般在物理内存的开始处,比如,一个操作系统占20KB,装入系统后占用0~20KB的内存空间,剩下的部分作为一个空闲区,当一个用户程序(作业、进程)调入内存时,把这个空闲区的低地址部分的区域分配给它,如图所示。
在这里插入图片描述
在这里插入图片描述
当有作业完成后释放所占用的存储区。 在系统运行的过程中,系统中形成多个空闲的不连续的存储区,称主空闲。

分区存储管理技术的实现:
1、地址映射
2、动态存储管理的机构(数据结构)
3、分区的分配和回收
4、三种基本的放置策略

3.2 用基地址寄存器实现动态地址映射

在这种存储管理技术中,系现设置一个专用寄存器,称为基地址寄存器,当一个进程(或程序、作业)被调度运行时,系统首先从PCB中取出该进程的首地址装入基地址寄存器中,在该进程运行的过程中实现动态地址映射。

3.3 分区分配机构

分区存储管理使用的数据结构主要是空闲区表、空闲区队列两种。其形式如图所示。
在这里插入图片描述

3.4 分区的分配与回收

内存分配程序包括分配一个内存块(分区)和释放一个内存块(分区)两个函数,当进程需要一个大小为size的内存时,可以通过系统调用向系统申请。

调用形式:request(size)
返回:成功为分区的首地址,失败为0。

进程释放一个分区时,调用:
release(释放区首地址)
返回:无

一、分配算法
教材上的p145的分配算法是以空闲内存队列的数据结构进行分配。介绍空闲区表数据结构的分配算法。
注:
1、分配算法中切割空闲区是从低地址开始的,例如,一个空闲区大小是100KB,首址是230KB,一申请者要求80KB,分配时将从230KB开始的80KB分配给申请者,剩下的部分仍作为一个空闲区,其首址是310KB,大小是20KB。
2、门限值是切割空闲区后剩下的区域若小于门限值,就不切割该空闲区,统统分给申请者。
在这里插入图片描述
二、回收算法
当一个进程(或程序)释放某内存区时,要调用存储区释放算法release,它将首先检查释放区是否与空闲区表(队列)中的其它空闲区相邻,若相邻则合并成一个空闲区,否则,将释放为一个空闲区插入空闲区表(或队列)中的适当位置。

3.5 几种放置策略

分区分配和回收是对空闲区表(或空闲区队列)数据结构进行操作,空闲区表的组织有两种方法:
1、按空闲区大小的升序(降序)组织;
2、按空闲区首址升序(降序)组织。
根据空闲区表组织的方法的不同,有不同的放置策略,它们是最佳适应算法、首次适应算法和最坏适应算法三种。

一、首次适应算法
首次适应算法的表是按空闲区首址升序的(即空闲区表是按空闲区首址从小到大)方法组织的。
在这里插入图片描述
分配时从表首开始,以请求内存区的大小逐个与空闲区进行比较,找到第一个满足要求的空闲后,若空闲区大小与请求区的大小相等,则将该空闲区分配给请求者,并撤销该空闲区所在表目;若大于请求区,就将该空闲区的一部分分配给请求者,然后,修改空闲区的大小和首址。

这种算法的实质是尽可能地利用低地址部分的空闲区,而尽量地保证高地址部分的大空闲区,使其不被切削成小的区,其目的是保证在有大的作业到来时有足够大的空闲区来满足请求者。

回收时,首先考察释放区是否与系统中的某个空闲区相邻,若相邻则合并成一个空闲区,否则,将释放区作为一个空闲区按首址升序的规则插入到空闲区表适当的位置。

二、最佳适应算法
最佳适应算法是将申请者放入与其大小最接近的空闲区中。切割后的空闲区最小,若系统中有与申请区大小相等的空闲区,这种算法肯定能将这种空闲区分配给申请者。(首次适应法则不一定)。
最佳适应算法的空闲区表按空闲区大小升序方法组织。
分配时,按申请的大小逐个与空闲区大小进行比较,找到一个满足要求的空闲区,就说明它是最适合的(即最佳的)。
这种算法最大的缺点是分割后的空闲区将会很小,直至无法使用,而造成浪费。
在这里插入图片描述
三、最坏适应算法
为了克服最佳适应算法把空闲区切割得太小的缺点,人们提出了一种最坏适应算法,即每次分配时,总是将最大的空闲区切去一部分分配给请求者,其依据是当一个很大的空闲区被切割了一部分后可能仍是一个较大的空闲区。避免了空闲区越分越小的问题。

最坏适应算法的空闲区表是按空闲区大小降序的方法组织的(从大到小的顺序)。
分配时总是取表中的第一个表目,若不能满足申请者的要求,则表示系统中无满足要求的空闲区,分配失败;否则,将从该空闲区中分配给申请者,然后修改空闲区的大小,并将它插入到空闲区表的适当位置。
在这里插入图片描述
这三种放置算法的优劣很难区分,要具体情况具体分析。

3.6 碎片问题及拼接技术

碎片是指在已分配区之间存在着的一些没有被充分利用的空闲区。

拼接技术是指移动存储器中某些已分配区中的信息,使本来分散的空闲区连成一个大的空闲区。

4 页式存储管理

4.1 页式系统应解决的问题

一、问题的提出
分区存储管理的主要问题是碎片问题。
在采用分区存储管理的系统中,会形成一些非常小的分区,最终这些非常小的分区不能被系统中的任何用户(程序)利用而浪费。
造成这样问题的主要原因是用户程序装入内存时是整体装入的,为解决这个问题,提出了分页存储管理技术。

二、分页的概念
程序地址空间分成大小相等的页面,同时把内存也分成与页面大小相等的块,当一个用户程序装入内存时,以页面为单位进行分配。页面的大小是为2n ,通常为1KB,2KB,nKB等。
在这里插入图片描述
页式存储管理要解决如下问题:

1、页式存储管理系统的地址映射;
2、调入策略;
3、淘汰策略;
4、放置策略。

4.2 页式地址变换

一、页表
页表是页式存储管理的数据结构,它包括用户程序空间的页面与内存块的对应关系、页面的存储保护和存取控制方面的信息。
在这里插入图片描述
在实际的系统中,为了节省存储空间,在页表中可以省去页号这个表目。
在这里插入图片描述
二、虚地址结构(程序字)
虚地址是用户程序中的逻辑地址,它包括页号和页内地址(页内位移)。
区分页号和页内地址的依据是页的大小,页内地址占虚地址的低位部分,页号占虚地址的高位部分。
在这里插入图片描述
三、页式地址映射
在这里插入图片描述1. 虚地址(逻辑地址、程序地址)以十六进制、八进制、二进制的形式给出
将虚地址转换成二进制的数;
按页的大小分离出页号和位移量(低位部分是位移量,高位部分是页号);
根据题意产生页表;
将位移量直接复制到内存地址寄存器的低位部分;
以页号查页表,得到对应页装入内存的块号,并将块号转换成二进制数填入地址寄存器的高位部分,从而形成内存地址。

2.虚地址以十进制数给出
页号=虚地址%页大小
位移量=虚地址 mod 页大小
根据题意产生页表;
以页号查页表,得到对应页装入内存的块号
内存地址=块号×页大小+位移量

例1:有一系统采用页式存储管理,有一作业大小是8KB,页大小为2KB,依次装入内存的第7、9、A、5块,试将虚地址0AFEH,1ADDH转换成内存地址。
虚地址0AFEH
0000 1010 1111 1110
P=1 W=010 1111 1110
MR=0100 1010 1111 1110
=4AFEH
在这里插入图片描述
虚地址1ADDH
0001 1010 1101 1101
P=3
W=010 1101 1101
MR=0010 1010 1101
1101=2ADDH

四、采用相应技术加快页表的查询速度
在页式存储技术中,我们可看到每访问一次内存,就要做两次访问内存的工作,即,查页表时要作一次访问内存的工作,然后是访问程序要求访问的内存,这样,存取速度降低一倍,将会影响整个系统的使用效率。在早期的计算机系统中有的采用联想存储器的技术来加快查表的速度,有的采用寄存器做页表。
采用寄存器做页表的典型是早期的UNIX系统(PDP-11系统计算机上)中,地址映射机构中就有两套页表机构,叫做页地址映射寄存器组,一套用于核心态,另一套用于用户态。每组有8对寄存器,每对寄存器中有一个地址寄存器和一个说明寄存器,地址寄存器中存放相应页在内存的首地址,说明寄存器中存放对应页的大小,访问方式,存储保护等方面的信息。

4.3 请调策略

一、问题的提出
在页式存储管理提高了内存的利用效率,但并不为用户提供虚存,换句话说,当一个用户程序的页数大于当前总空闲内存块数时,系统就不能将该程序装入运行。即用户程序将受到物理内存大小的限制。为了解决这个问题,人们提出请求分页存储管理技术。

二、请求分页概念
请求分页技术当一个用户程序要调入内存时,不是将该程序全部装入内存,而是只装入部分页到内存,就可启动程序运行,在运行的过程中,如果发现要运行的程序或要访问数据不在内存,则向系统发出缺页中断请求,系统在处理这个中断时,将在外存相应的页调入内存,该程序继续运行。

三、请求分页要解决的问题
采用这种技术要解决以下问题:
1、如何发现执行的程序或访问的数据不在内存;
2、程序或数据什么时候调入内存,调入策略;
3、当一些页调入内存时,内存没有空闲内存时,将淘汰哪些页,淘汰策略。

四、数据结构
为了实现请求分页技术,页表应增加相应的内容,反映该页是否在内存,在外存的位置,在内存的时间的长短等。
中断位:0 表示该页在内存, 1表示该页不在内存
引用位:0 表示最近没有进程访问 1表示最近有进程访问
修改位:0 表示该页调入内存后没有修改 1表示页调入内存后修改过
在请求分页技术中,页表中的页号是不能省略的,为什么?
在这里插入图片描述
在这里插入图片描述
五. 调入策略
1、预调
系统根据作业(进程)运行的情况,预测哪些页将要运行,在其运行之前先行调入内存,这样在程序运行的过程中就不会出现缺页中断。这样方法从表面上看起来很好,但系统无法预计系统中作业的运行情况,难以实现。
2、请调
进程在执行的过程中,发现要执行的程序或处理的数据不在内存,向系统提出调入相应程序的请求,系统响应用户的请求。

4.4 淘汰策略

一、置换算法
当要索取一页面并送入到全满的内存中时,必须把已在内存中的某一页淘汰掉。用来选择淘汰哪一页的规则叫做置换算法。

二、颠簸
简单地说,导致系统效率急剧下降的主存和辅存之间的频繁页面置换现象称为“抖动”。
“抖动”现象花费了系统大量的开销,但收效甚微。因此,各种置换算法应考虑尽量减少和排除抖动现象的出现。

4.5 几种置换算法

一、最佳算法
假定程序p共有n页,而系统分配给它的内存只有m块(1≤m≤n),并且以作业在执行的过程中页面置换的频率的高低来衡量算法的优劣。
访问的页在内存,称访问成功,否则为失败。
a=s+f
a:访问的总次数 s:访问成功的次数 f:访问失败的次数

缺页中断率f, = f/a 则有:
f’ =f(r,m,p)
最佳算法是指对于任何m和p,r:调度算法有f’=f(r,m,p)最小。
最佳算法:当要调入一新页而必须淘汰一旧页时,所淘汰的页是以后不再使用的,或者是以后相当长的时间内不会使用的。这种算法是不可能的。

二、先进先出算法
先进入内存的页,先退出内存。
实质上是淘汰在内存驻留时间最长的页。
其理由是:最早调入内存的页,不再被使用的可能性比近期调入内存的大。

三、最久未使用淘汰算法(lRU算法)
这种算法的实质:当需要淘汰一页时,选择最长时间未使用的页。
依据的理论是如果某页被访问,它可能马上还要被访问;相反,如果某页长时间未被访问,它可能最近也不可能被访问。
算法的实现(软件):设置一个活动页面栈,当访问某页时,将此页号压入栈顶,然后,考察栈内是否有与此页面相同的页号,若有则抽出。淘汰一页时,总是从栈底抽出一个页号,它就是最久未使用的。

页式系统的存储保护的方法类似于基址限长存储保护,当地址映射机构分离出页号和页内位移后。
若0≤页号<用户程序的总页数,则访问合法,否则访问越界。
页式系统的存储保护还包括存取控制。
在页表中增加存取控制位,表示该页的存取控制权限,如r表示可读,w表示可读可写,e表示可执行。
当有一程序访问该页时,系统就按存取控制位设置的权限实施存取控制。

5 段式系统

一个用户程序往往由几个程序段(主程序、子程序和函数)所组成,当一个程序装入内存时,按段进行分配,每个段的大小是不相等的。
程序地址的组成:S:W
例:
S1:XXXX
S2:XXXX
S3;XXXX
在这里插入图片描述
在这里插入图片描述
段页式系统:
在段式系统中,若段内分页,称为段页式系统。
目前流行的UNIX系统采用这种存储管理的方式,一个进程的图象分为U区、共享正文区、用户栈区和数据区,各进程的各个区的大小是不相等的,只有U区的大小是相等的。这里的区类似于段。每个段又分成大小相等的页,内存的分配是以页为单位的。
因此,在UNIX系统中存储管理(上下文,context)机构包括区表和页表。

6 UNIX系统存储管理

6.1 概述

UNIX系统的早期版本采用分页存储管理,进程的存储映像可以在内存和交换区之间传递,称为对换;
UNIX 第6、7版采用对换。
在目前的一些UNIX系统中,采用请求分页存储管理,也就是采用虚拟存储技术,称为请求调页。
UNIX SYSTEM Ⅴ采用请求调页(请求分页)。以后的UNIX系统的各种版本均采用了请求调页技术。

6.2 对换空间的管理

在这里插入图片描述

对换存储管理的数据结构
系统设置了两个相同的结构:
coremap 内存空闲区表
swapmap 对换区空闲区表
空闲区的分配采用最佳适应法。
程序是:malloc(map,size)
空闲区回收程序:
mfree(map,size,aa)
map:内存(或对换区);size:大小 ;
aa:释放区首址
在这里插入图片描述

6.3 对换进程

对换进程就是0号进程,它一个永远处于核心态的进程。其任务是将进程的映像在内存和对换区之间传递。
在这里插入图片描述
(一)进程换入
当内存空闲时,0号进程将对换区中处于就绪状态的进程的映像调入内存,直到内存满,或者是对换区中已经没有处于就绪状态的进程。
调入就绪进程的依据是进程在对换区中驻留的时间,每次调入一个在对换区中驻留时间最长的进程映像进入内存。

(二)进程换出
当内存空间不足时,0号进程将内存中的某些进程换到对换区。
不能换出的进程是核心态的进程(UNIX核心)、处于创建状态的进程、上锁的进程,在内存中驻留时间不足两分钞钟的就绪进程。
换出的顺序是:处于睡眠状态的进程、暂停状态的进程。
若无以上这两类进程,就是处于就绪状态的进程。
按就绪状态的进程在内存中驻留时间从长到短的顺序依次调出内存,直到内存中无进程可调出为止。

进程映像的结构:
在请求调页的系统中,进程映像的结构是
U区、正文区、数据区、用户栈区。其中U区的大小是固定的,其它的各区的大小不是固定的。
在这里插入图片描述

6.4 请求调页数据结构

在这里插入图片描述
(一)进程区表

在UNIX system Ⅴ中,一个进程可以有正文区、数据区、用户栈区和U区。其中U区只有处于运行状态的进程才有,其它状态的进程没有U区。每个区又分成若干个页。所以,每个区有一个页表。

(二)页和页表
将用户的程序空间分成大小相等的单位,称为页。并把内存空间也分成与之相等的块。页的大小为512字节。刚好与磁盘的物理块大小相等。
页表的格式如下:
在这里插入图片描述
块号:内存块号 年龄:该块在工作集中驻留的时间
修改:表示该页调入内存后修改过,置1,否则为0;
访问:该页调入内存后,被访问过;
有效:为1表示该页在内存,否则不在内存;
保护:该页的存储保护信息;
对换设备:指明对换设备;
磁盘块号:该页在对换设备上的磁盘物理块号。

6.5页面错(缺页中断)

在UNIX系统中产生页面错有两种情况:
1.进程企图访问虚存空间范围之外的页面,即段违例,在这种情况下,核心向违例的进程发送一个“段违例”的软中断。(这是一般操作系统中页面错的处理方法)。
2.进程企图访问一个有效位为0的页(该页不在内存),这时将产生一个有效位错的中断(类似于一般OS中的缺页中断)。核心处理该中断时,将所而的页面调入内存。

6.6偷页进程(页面淘汰)

当有进程需要调入一些页面时,又没有内存空间时,核心将按某种策略将系统中的一些页面调出内存,在一般的OS中称为页面淘汰,在UNIX中称为偷页。
1.选择淘汰的页;
2.选中了淘汰页后,执行淘汰,若修改位为1,表示该页调入内存后,已经修改,淘汰时,要将要淘汰的页面写到相应的磁盘块。若修改位为0,表示该页面调入内存后没有修改过,只是把该页置为空。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!