操作系统复习(十二)——存储器管理

存储器的层次结构

对于通用计算机而言,存储层次至少应具有三级:最高层为CPU寄存器,中间为主存,最底层为辅存。较高档的计算机里面可以根据具体的功能细分为(CPU)寄存器;(主存)高速缓存、主存储器,磁盘缓存;(辅存)固定磁盘、可移动存储介质。

主存储器简称内存或主存,用于保存进程运行时的程序和数据,也称为可执行存储器。
寄存器具有与处理机相同的速度,故对寄存器的访问速度最快,完全能与CPU协调工作,但价格昂贵,因此容量不可能做得很大。
高速缓存介于寄存器和存储器之间的存储器,主要用于备份主存中较常用的数据,减少处理机对主存储器的访问次数,大幅度提高程序执行速度。
磁盘缓存:因为磁盘的I/O速度远远低于对主存的访问速度,为了缓和两者之间的速度不匹配,设置了磁盘缓存,主要用于暂时存放频繁使用的一部分磁盘数据和信息,以减少访问磁盘的次数。

程序的装入和链接

程序要运行,先得为这个程序创建进程。创建进程的第一件事就是将程序和程序需要用到的数据装入内存。由用户编写的源代码如何变成一个存放在内存中的程序?步骤如下:

  1. 编译:通过编译程序对用户源程序进行编译,形成成若干个目标模块(目标文件)。
  2. 链接:通过链接程序,将编译后形成的若干个目标模块(目标文件)以及它们所需的库函数,链接在一起,形成一个完整的装入模块(可执行文件)。
  3. 装入:由装入程序将装入模块(可执行文件)装入到内存。

程序的装入
程序在装入内存的时候,按照确定绝对地址时所处的步骤阶段可以将装入模式分为3类:

  1. 绝对装入方式
  2. 可重定位装入方式
  3. 动态运行时装入方式

绝对装入方式
分类依据:在绝对装入方式下,确定绝对地址时所处的步骤阶段为源代码阶段(绝对地址由程序员直接赋予)、汇编代码阶段(经过编译后的代码表现形式)或目标模块(目标文件)代码阶段(经过汇编后的代码表现形式)。相当于,在代码的任何表示形式下都不存在相对地址(不过有符号地址的概念)。
特点:这种装入模式只适用于单道程序环境,不适用于多道程序环境。

可重定位装入方式
分类依据:在可重定位装入方式下,确定绝对地址时所处的步骤阶段为装入阶段,装入模块装入内存后,会立即将其相对地址转换为绝对地址。相当于,程序进入内存后其所有相对地址都会变成绝对地址。
特点:这种装入模式使用适用于多道程序环境。

动态运行时装入方式
分类依据:在动态运行时装入方式下,确定绝对地址时所处的步骤阶段为程序运行阶段,装入模块装入内存后,不会立即将其相对地址转换为绝对地址,而是在程序要真正运行时才进行地址转换。
特点:这种装入模式使得程序可以在内存中移动。

程序的链接
按照链接程序将目标模块(目标文件)和程序所需的库函数链接成装入模块(可执行文件)的时间(简单点:链接时间),可以将链接方式分为3类:

  1. 静态链接方式
  2. 装入时动态链接方式
  3. 运行时动态链接方式

静态链接方式
在目标模块装入内存之前进行链接,链接成一个装入模块(可执行文件)后不再拆开。

装入时动态链接方式
在目标模块装入内存时,边装入边链接。即在装入了一个目标模块后,发现其要调用的目标模块不在内存中,则由装入程序找到相应的外部模块并将其装入内存。
相较于静态链接方式的优势:

  1. 方便目标模块的修改和更新。
  2. 便于实现目标模块的共享。

运行时动态链接方式
在程序执行时才将目标模块链接到装入模块中。即在程序的执行过程中,若发现被调用的目标模块未被装入内存时,则操作系统将立即找到该目标模块并将其装入内存,最后将其链接到调用这个目标模块的目标模块上。

较于装入时动态链接方式的优势:
有些目标模块可能并不会被程序执行(错误处理模块),但是装入时动态链接方式会将其链接到装入模块中,这显然是对性能的损害。但是运行时动态链接解决了这个问题。

连续分配存储管理方式

1.单一连续分配
最简单的一种存储管理方式,只能用于单用户、单任务的操作系统中。
优点:易于管理。
缺点:对要求内存空间少的程序,造成内存浪费;程序全部装入,很少使用的程序部分也占用内存。

2.固定分区分配
把内存分为一些大小相等或不等的分区(partition),每个应用进程占用一个分区。操作系统占用其中一个分区。支持多个程序并发执行,适用于多道程序系统和分时系统。最早的多道程序存储管理方式。
缺点:内碎片(一个分区内的剩余空间)造成浪费;划分为几个分区,便只允许几道作业并发,分区总数固定,限制并发执行的程序数目。

3.动态分区分配

  1. 分区的大小不固定:在装入程序时根据进程实际需要,动态分配内存空间,即——需要多少划分多少。
  2. 空闲分区表项:从1项到n项:内存会从初始的一个大分区不断被划分、回收从而形成内存中的多个分区。
  3. 优点:并发进程数没有固定数的限制,不产生内碎片。缺点:有外碎片(分区间无法利用的空间)

4、分区分配算法
①首次适应算法FF(first-fit)
空闲分区排序:以地址递增的次序链接。
检索:分配内存时,从链首开始顺序查找直至找到一个大小能满足要求的空闲分区;
分配:从该分区中划出一块作业要求大小的内存空间分配给请求者,余下的空闲分区大小改变仍留在空闲链中。
若从头到尾检索不到满足要求的分区则分配失败
优点:优先利用内存低址部分,保留了高地址部分的大空闲区;
缺点:但低址部分不断划分,会产生较多小碎片;而且每次查找从低址部分开始,会逐渐增加查找开销。

②循环首次适应算法NF
空闲分区排序:按地址
检索:从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区。为实现算法,需要设置一个起始查寻指针并采用循环查找方式
分配:分出需要的大小
优点:空闲分区分布均匀,减少查找开销
缺点:缺乏大的空闲分区

③最佳适应算法BF
总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。
空闲分区排序:所有空闲分区按容量从小到大排序成空闲分区表或链。
检索:从表或链的头开始,找到的第一个满足的就分配
分配:分出需要的大小
缺点:每次找到最合适大小的分区割下的空闲区也总是最小,会产生许多难以利用的小空闲区(外碎片)

④最差适应算法/最坏匹配法WF
基本不留下小空闲分区,但会出现缺乏较大的空闲分区的情况。

⑤快速适应算法
根据进程常用空间大小进行划分,相同大小的串成一个链,需管理多个各种不同大小的分区的链表。进程需要时,从最接近大小需求的链中摘一个分区。
能快速找到合适分区,但链表信息会很多;实际上是空间换时间。

5、回收分区
(1)回收区(首址a)与一个分区f1末尾(首址b+大小)邻接:将回收区与f1合并,修改f1的表项的分区大小
(2)回收区(首址a+大小)与一个分区f2的首址b邻接:将回收区与f2合并,修改f2的表项的首址、分区大小
(3) (1)(2)两种情况都有,则将回收区与前后两个分区F1、F2邻接:将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和
(4) 回收区没有邻接的分区:为回收区单独建立新表项,填写回收区的首址与大小,根据其首址插到空闲链中的适当位置

动态重定位分区分配——有紧凑功能的动态分区分配
动态重定位分区分配算法与动态分区分配算法基本相同,差别在于增加了紧凑的功能。

伙伴系统
分区大小有规定,且分区动态变化
1、无论已分配还是空闲分区,大小都为2的k此幂。若整个可分配空间大小为2m,则1≤k≤m.
2、随着系统运行,内存被不断划分,形成若干不连续的空闲分区。对每一类具有相同大小的空闲分区设置一双向链表,即会有k个链表,链表中的分区大小都是2m。
3、进程申请n个大小的空间时,计算n= 2i。则找i对应的链表。若i大小的链表没有,则找i+1的链表。找到的分区对半划分后,一半用于分配,一半链接到较小一级的链表里去。
4、一次分配和回收都可能对应多次的划分和合并。

对换

当内存空间还是满足不了需求时,把内存中暂时不能运行、或暂时不用的程序和数据调到外存上,以腾出足够的内存;把已具备运行条件的进程和进程所需要的程序和数据,调入内存。

对换分为整体对换与页面(分段)对换。

分页存储管理方式

此方式下,将用户程序的地址空间分为若干个固定大小的区域,称为’页’或者’页面’。相应的,也将内存空间分为若干个物理块或叶框,页和块的大小相同。这样可以将用户程序的任一页放入任一物理地址中,实现了离散分配。

地址计算方式:
分页地址中的地址结构分为页号P与偏移量W,即页内地址。例:31~12位是页号,11 ~ 0位是页内地址,此方式下每页大小为4KB,12 ~31位是页号,地址空间最多允许有1M页。
对特定机器,其地质结构是一定的。若给定一个逻辑地址空间中的地址为A,页面大小为L,则页号P与页内地址d计算公式如下:P = INT [ A / L ] , d = [A] mod L 其中,INT为整除函数,mod是取余函数,例:系统页面大小1KB,设A=2120B,由公式可得P=2,d=72。

为了便于在内存找到进程的每个页面所对应块,分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。
页表存放在内存中,属于进程的现场信息。 用途:1.记录进程的内存分配情况 2.实现进程运行时的动态重定位。 访问一个数据需访问内存 2 次 (页表一次,内存一次)。
页表的基址及长度由页表寄存器给出。
页表的作用是实现从页号到物理块号的地址映射。

页表定位:页表始址 + 页号 × 页表项长度。{查询页表:读出块号。
物理地址:块号 + 块内地址。 (块内地址 = 页内地址)
地址变换例题
例:若在一分页存储管理系统中,某作业的页表如下表所示,已知页面大小为 1024B,试将十进制逻辑地址 1011,2148,5012 转化为相应的物理地址。
在这里插入图片描述
设页号为 P,页内位移为 W,逻辑地址为 A,内存地址为 M,页面大小为 L,则
P = INT ( A / L )
W = A mod L
对于逻辑地址 1011 ,P=INT(1011/1024)=0 ,W=1011 mod 1024=1011 ,A=1011=(0,1011)
查页表第 0 页在第 2 块,所以物理地址为 M=10242+1011= 3059。
对于逻辑地址为 2148 ,P= int (2148/1024)=2 ,W=2148 mod 1024=100 ,A=2148=(2,100)
查页表第 2 页在第 1 块,所以物理地 址为 M=1024
1+100=1124。
对于逻辑地址 5012 ,P= int ( 5012/1024)=4 ,W=5012 mod 1024=916
页号超过页表长度,该逻辑地址非法。

分段存储管理方式

此方式是为了满足用户要求而形成的一种存储管理方式。把用户程序的地址空间分为若干个不同大小的段,每段可定义一组相对完整的信息。在存储器分配时,以段为单位,这些断在内存中可以不相邻接,所以也同样实现了离散分配。

分段地址中的地址具有如下结构:N位段号,M位段内地址(N+M等于处理机位数)。
即在该地址结构中,允许一个作业最长有 2^ N个段,每段最大长度为 2^ M 字节。

访问一个数据需访问内存2 次 (段表一次,内存一次)。

段页式存储管理方式

是分页和分段两种存储管理方式相结合的产物。同时具有两者的优点,是目前应用较广泛的一种存储管理方式。

段页式地址中的地址由三部分组成:段号段内页号页内地址

访问一个数据需访问内存3次 (段表一次,页表一次,内存一次)。

各存储方式异同总结

分页与分段的主要区别:

  1. 页是信息的物理单位,是系统行为,用户不可见。段是信息的逻辑单位。
  2. 页的大小固定且由系统决定。段的大小不定,决定与用户所编写的程序。
  3. 分页的用户程序地址空间是一维的。分段的用户程序的地址空间是二维的,即标识一个地址时,既需要给出段名,有需要给出段内地址。

分页式存储管理:离散分配的基本单位是页。
分段式存储管理:离散分配的基本单位是段。
段页式存储管理:离散分配的基本单位是段、页。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值