第四章 存储器管理

第四章 存储器管理
1.源程序要运行通常经过编译(compile)链接(link)装入(load)等几个步骤
2.(1)编译。
由编译程序将用户源代码编译成若干个目标模块。
(2)链接。
由链接程序将编译后形成的目标模块以及它们所需要的库函数,链接在一起,形成一个装入模块。
(3)装入。
由装入程序将装入模块装入主存的过程。
3.程序的装入
1.绝对装入方式
2.可重定位装入方式
3.动态运行时装入方式
4.
1.绝对装入方式(Absolute Loading Mode)(适合“单道”)
在编译时,如果知道程序将驻留在内存的什么位置,则编译程序产生绝对地址的目标代码
装入模块被装入内存后,由于程序中的逻辑地址与实际内存地址完全相同,故不需对程序和数据的地址进行修改
程序中所使用的绝对地址,既可在编译或汇编时给出, 也可由程序员直接赋予。但在由程序员直接给出绝对地址时,不仅要求程序员熟悉内存的使用情况,而且一旦程序或数据被修改后,可能要改变程序中的所有地址。因此,通常是宁可在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。
5.
2.可重定位装入方式(Relocation Loading Mode)(可用于“多道”)
绝对装入方式只能将目标模块装入到内存中事先指定的位置
在多道程序环境下,不可能预知目标模块放在内存中的地址,因此绝对装入方式不适合在多道环境下使用
程序中目标模块的地址通常从0开始,其他地址都是相对于0计算
把在装入时对目标程序中指令和数据的修改过程称为重定位,又因为地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定位。
静态重定位特点:简单、不能在内存中移动、要求连续。
6.
3.动态运行时装入方式(Denamic Run-time Loading) (可用于“多道”)
可重定位方式不允许程序运行时在内存中移动位置
装入程序,在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址都仍是相对地址,依靠硬件支持进行地址转换。
动态重定位特点:在内存中可移动。
7.程序的链接
1.静态链接方式(Static Linking)
在程序运行前,先将各目标模块及所需的库函数链接成一个完整的装入模块,以后不再拆开
在将这几个目标模块装配成一个装入模块时,须解决以下两个问题
(1)对相对地址进行修改
(2)变换外部调用符号
2.装入时动态链接(Load time Dynamic Linking)
将用户的源程序编译后所得的一组目标模块在装入内存时采用边装入边链接的方式

优点:(1)便于目标模块的修改和更新
(2)便于实现对目标模块的共享
3.运行时动态链接(Run-time Dynamic Linking)
应用程序在每次运行的模块可能不相同,出错模块不一定什么时候运行。
运行时动态链接方式将对某些模块的链接推迟到执行时才去做,即在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存,把它链接到调用者模块上
凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间
8.单一连续分配
连续分配方式为一个用户程序分配一个连续的内存空间
单一连续分配是最简单的一种存储管理方式,但只能用于单用户、单任务的操作系统中
采用这种存储管理方式时,可把内存分为系统区和用户区两部分,系统区仅提供给OS使用,通常是放在内存的低址部分;用户区是指除系统区以外的全部内存空间,提供给用户使用
一般情况下无存储器保护机构(早期有)
特点:(1)简单易行,系统开销小
(2)资源利用率低(一次只能装入一个作业)
9.固定分区分配
最简单的可运行多道程序的存储管理方式
将内存用户空间划分为若干个固定大小的区域,每个分区中只装入一道作业
1.划分分区的方法
(1)分区大小相等 即使所有的内存分区大小相等
分区太大 浪费
分区太小 不够用
(2)分区大小不等 划分为多个大、中、小搭配的分区
根据程序大小决定所使用的分区 大班在大教室、小班在小教室
2.内存分配
按分区使用表进行分配,依分区大小排序。
10.动态分区分配
1.分区分配中的数据结构
空闲分区表:记录每个空闲分区的情况
空闲分区链 实现对空闲分区的分配和链接
2.分区分配算法
(1)首次适应算法FF
空闲分区链以地址递增顺序链接
分配时从链首开始查找,找到一个大小可满足的空闲分区,划出一块给请求者
可能会造成在低地址部分很多难以利用的小空闲分区
优点:(1)分配算法简单(2)优先利用低址部分,保留了高址的大空闲区,为大作业装入提供条件。
缺点:每次从链首开始,增加了查找开销,并且留下许多难以利用的”碎片”(外碎片)
2.分区分配算法
(1)首次适应算法FF
空闲分区链以地址递增顺序链接
分配时从链首开始查找,找到一个大小可满足的空闲分区,划出一块给请求者
可能会造成在低地址部分很多难以利用的小空闲分区
优点:(1)分配算法简单(2)优先利用低址部分,保留了高址的大空闲区,为大作业装入提供条件。
缺点:每次从链首开始,增加了查找开销,并且留下许多难以利用的”碎片”(外碎片)
(3)最佳适应算法
每次分配时,把能满足要求、又是最小的分区分配给作业
空闲分区链以大小递增顺序链接
从头开始,第一次找到满足要求的空闲分区,必然是最优的,避免了“大材小用”
宏观上看,会在存储器中留直许多难以利用的小分分区
特点:解决了大作业的分配问题;每次总是最小的,容易产生不可利用的空闲区(“小碎片”);收回主存时,要按分区大小递增顺序插入到空闲区表中。
(4)最差(坏)适应算法
每次分配时,把能满足要求、又是最大的分区分配给作业
空闲分区链以大小递减顺序链接
可以保证不出现太小的“碎片”
特点:不会产生过多的碎片;影响大作业的分配;收回主存时,要按大小递减的顺序插入到空闲区表
(5)快速适应算法(分类搜索法)
按照分区大小设置多个空闲分区链,增加一个索引表,可以快速对应到一个空闲分区链上。
空闲分区链分类:常用的大小分类,如2KB,4KB,8KB
特点:分配速度快,不进行分区分割;存在一定的主存浪费;典型的以空间换时间的作法。
3.分区分配操作
1)分配内存
2)回收内存
进程运行完释放内存时,系统根据回收区的首地址,从空闲链表区找到相应的插入点,有以下几种情况
回收区与插入点的前一个空闲分区相邻接
回收区与插入点的后一个空闲分区相邻接
回收区同时与插入点的前、后两个分区相邻接
回收区不与任何空闲区邻接
中。
11.伙伴算法原理
Linux采用伙伴(buddy)算法对物理内存进行管理
通过不断地平分较大的空闲内存块来获得较小的空闲内存块,直到获得所需的内存块;当内存释放时,尽可能的合并空闲内存块。
其中内存块分配与合并都采用以2的幂次方为单位。
所谓“伙伴”,就是指在空闲块被分裂时,由一个大块内存分裂出来的两个小块内存,互称“伙伴”
算法采用位图和空闲链表作为辅助工具,其中位图用来跟踪内存块的使用情况,空闲链表用来维护内存中没有使用的内存块
12.哈希算法
引入原因:上述的分类搜索法和伙伴系统中,都是把空闲分区进行分类,再查找这些分类的分区上会使时间性能下降。
原理:哈希算法就是利用哈希快速查找的优点,对索引表进行快速查找。
13.可重定位分区分配
1.可重定位的引入
连续分配存在的问题
必须有足够大的连续空间才能分配
“拼接”或“紧凑”的引入
缺点:(1)紧凑增加主机的开销
(2)紧凑修改空闲分区表

移动条件:无内外存信息交换
2.可重定位的实现
作业装入内存后的所有地址仍是相对地址,将相对地址转换成物理地址的工作在指令执行时进行
地址变换过程是在程序执行期间,随着每条指令和数据的访问而自动进行的。
真正访问地址=相对地址+重定位寄存器中地址
需要有硬件地址变换机构的支持
3.可重定位分区分配算法
在这里插入图片描述
优点:可以消除碎片,能够分配更多的分区,有助于多道程序设计,提高内存的利用率。
缺点:紧凑花费了大量CPU时间;
14.对换
1.对换的引入
所谓“对换”, 是指把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据,调入内存。对换是提高内存利用率的有效措施
如果对换是以整个进程为单位,称为“整体对换”或“进程对换”
如果对换是以“页”或“段”为单位进行的,则称为“页面对换”或“分段对换”,又统称为“部分对换”, 这种对换方法是实现请求分页及请求分段式存储器的基础,其目的是为了支持虚拟存储系统。
2.对换空间的管理
在具有对换功能的OS中,通常把外存分为文件区和对换区
文件区管理的主要目标是提高文件存储空间的利用率,采取离散分配方式。
外存中对换区主要存放从内存中换出的进程,对换空间管理的主要目标是提高进程换入和换出的速度。
为了能对对换区中的空闲盘块进行管理,在系统中应配置相应的数据结构,以记录外存的使用情况。其形式与内存在动态分区分配方式中所用数据结构相似,即同样可以用空闲分区表或空闲分区链。在空闲分区表中的每个表目中应包含两项, 即对换区的首址及其大小,它们的单位是盘块号和盘块数
对换区的分配采用连续分配方式,分配算法可以是首次适应算法、循环首次适应算法或最佳适应算法
15.3.进程的换出与换入
(1)进程的换出
①选出被换出的进程
选择原则:ⅰ先“阻塞”或“睡眠”的进程,后“就绪”
ⅱ优先级低的进程
ⅲ在内存最长的进程的进程换出
ⅳ最近最久未使用进程
②进程换出过程
系统首先选择处于“阻塞”状态且优先级最低的进程作为换出进程,然后启动盘块,将该进程的程序和数据传送到磁盘的对换区上。若传送过程未出现错误,便可回收该进程所占用的内存空间,并对该进程的进程控制块做相应的修改。
(2)进程的换入
系统应定时地查看所有进程的状态,从中找出(PCB集合中)“就绪”状态且已换出的进程,将其中换出时间(换出到磁盘上)最久的进程作为换入进程,申请内存,若成功将之换入,否则在换出某些进程,腾出足够内存,在换入。
16.对换与覆盖异同点
共同点:
进程的程序和数据主要放在外存,当前需要执行的部分放在内存,内外存之间进行信息对换
17.覆盖技术的缺点
对用户不透明,增加了用户负担
目前这一技术用于小型系统中的系统程序的内存管理上
MS-DOS的启动过程中,多次使用覆盖技术;启动之后,用户程序区TPA的高端部分与COMMAND.COM暂驻模块也是一种覆盖结构
18.离散分配方式
连续分配方式要求为一个进程分配连续的内存空间(整体装入),分形成许多“碎片”而浪费,“紧凑”操作会付出相当大的代价
如果允许一个进程直接分散地装入到许多不相邻接的分区中,称为离散分配方式
离散分配方式有分页存储管理方式、分段存储管理方式和段页存储管理方式

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值