440 likes | 527 Views
(ii) 分区回收算法. 检查是否与空白区相邻,是则合并成一个大空白区. 修改两个表 ( 返回分配区与空白区序号和始址 ). (c) 分区管理算法 ( 可适应于固定分区及可变分区 ). (i) 首次适应算法( First Fit: FF). 将空白区按存贮顺序链成一个队列,用一指针指向队首分配时将找到的第一个满足要求的空白区分配给它。. 指针. 10k. 60k. 90k. 20k. 例:. 有四块空白区 ( 从低地址 高地址 ) ,来了一个作业需分配 19k 内存 。. 指针. 10k. 60k. 90k. 20k. 41k. 解:.
E N D
(ii) 分区回收算法 检查是否与空白区相邻,是则合并成一个大空白区 修改两个表(返回分配区与空白区序号和始址)
(c) 分区管理算法 (可适应于固定分区及可变分区) (i) 首次适应算法(First Fit: FF) 将空白区按存贮顺序链成一个队列,用一指针指向队首分配时将找到的第一个满足要求的空白区分配给它。
指针 10k 60k 90k 20k 例: 有四块空白区(从低地址高地址),来了一个作业需分配19k内存。
指针 10k 60k 90k 20k 41k 解: FF特点: 在高地址空白区中保持较大空白区(每次从10k开始分配寻找)。
1 2 指针移动 (ii) 循环首次适应(Next fit: NF) 将空白区组成环状队列,按循环顺序寻找空白区。(与FF区别,头指针从低地址开始向高地址循环移动) NF特点: 使得小空白区均匀分布,易于与其它空白区合并。
指针 10k 60k 90k 20k (iii) 最佳适应算法(Best fit: BF) 将空白区按大小排成队列,寻找时总是以最小的空白区开始,找到第一个合适的分区 例: 来一个19k的作业
指针 10k 20k 60k 90k 1k 解: 特点: 最佳地利用分区; 开销比较大,并不是最好算法。
指针 90k 60k 20k 10k 71k (iv) 最坏适应算法(Worst fit: WF) 将空白区排序(按从大到小) 找最大空白区 特点: 如上例: 不会出现小的空白区。
指针 a b c d e f 7k 3k 10k 8k 20k 5k 例:设系统空白链表为 用户先后申请7.5k,4k试用四种算法,试求出分配块。
FF: c,a a b c d e f 3k 3k 2.5k 8k 20k 5k NF: c,d a b c d e f 7k 3k 2.5k 4k 20k 5k 首先从小到大排序 BF: b f a d c e 3k 5k 7k 8k 10k 20k
b f a d c e 3k 5k 7k 0.5k 10k 20k d b f a c e 0.5k 3k 5k 7k 10k 20k 再排序从小到大 分配块为d, f
d b f a c e 0.5k 3k 1k 7k 10k 20k e c d a f b 8.5k 10k 8k 7k 5k 3k WF: e,e
可变式分区与固定式分区分配方案相比,一般来说其存储空间的利用率高些,但是,由于存在着一些分散的,较小的空白区,仍然不能充分利用-称之为存储器的“ 零头”。
(d) 碎片(零头)问题:存在于已分配的分区之间的一些不能充分利用的空白区 (i) 原因:请求释放使存区分割 (ii) 碎片总和>nk,但不能装入nk作业
RR11 RR 12 Job1 Job4部分1 Job2 RR21 Job4部分2 Job3 RR22 (iii) 解决的方法: (I) 将程序装入分散存区中 ––– 多重分区
Job1 Job2 Job3 Job4 可重定位分区分配法是利用分区的“ 拼接”(对空白区而言)或“ 紧凑”(作业程序而言)技术解决“ 零头”。 (II) 将碎片集中(紧凑或拼接) ––– 可重定位分配
(4) 可重定位分区分配 (a) 概要: 移动内存已分配区的信息,使得所有分配区靠在一起使空白区连成一片,采用浮动方法。 (b) 浮动(重定位-动态)进行主存的压缩,就要将主存中用户程序移动(浮动),对作业中与地址有关的部分进行调整。
请求分配一个大小为xk的分区 有大于xk的 空闲区吗? 是 分配分区并 修改诸表 返回一个 分区号数 否 空闲区的总和 xk吗? 否 此刻已经 分配一个 分区 是 紧缩存储并相应地修改诸表 (得到一个完整的空闲区xk) (c) 动态重定位可变分区分配算法:
作业5 o.s o.s 80k o.s 20k 20k 作业1(8k) 1(8k) 20k 1 3 2 4 28k 28k 3(24k) (16k) 64k 52k 作业3(24k) 2(20k) 88k 72k (24k) 4(50k) 112k 122k 122k 作业5(80k) 作业(20k) (134k) 132k (54k) 202k 作业4(50k) 182k (74k) 256k 256k (b)移动之后(即浮动) (c)分配作业5之后 (a)初始状态 例
实现这种重定位,可通过类似于重定位装入程序的软件来达到,但这种方案要在费许多处理机时间,而且限制较大。实现这种重定位,可通过类似于重定位装入程序的软件来达到,但这种方案要在费许多处理机时间,而且限制较大。 较好的办法是采用动态重定位技术(在本章中,当一个作业装入与其地址空间不一致的存储空间时,可在每次访问指令或数据时,通过重定位寄存器来自动修改访问存储器的地址) 因而,一个作业在主存中移动后,只需要改变重定位寄存器的内容即可。
例: 图(a)是作业拼接之前的执行情况,这时重定位寄存器RR的值为64k,(b)是拼接后作业3执行情况,作业3被移动到28k大字节开始的分区中。为保证在新的位置上仍能正确执行,只需要将重点定位寄存器RR的值改为28k即可。
定位 寄存器 RR 相对 地址 0 64K Load 1,500 1 2 3 4 5 64 65636 500 LDAD 1,500 作业3的分区 100 66036 12345 500 88K 处理机一侧 存贮器一侧 (a) 拼接前
定位 寄存器 RR 相对 地址 0 28K Load 1,500 1 2 3 4 5 28k 28772 100 500 Load 1,500 29172 500 12345 52k 24k 256k 主存 (b) 拼接后的执行情况
采取动态重定位后,由于目标程序装入主存后不需修改地址指针及所有与地址有关的项,因而程序可在主存中随意浮动而不影响其正确执行。这样,就可以方便地进行存储器紧缩,较好地解决了碎片问题。采取动态重定位后,由于目标程序装入主存后不需修改地址指针及所有与地址有关的项,因而程序可在主存中随意浮动而不影响其正确执行。这样,就可以方便地进行存储器紧缩,较好地解决了碎片问题。
(d) 拼凑时机 (i) 出现相邻空白区即拼接;(或某分区被释放后即紧缩) 紧缩工作大,开销大,但管理简单 (ii) 存贮不足(空白分区不够大)时进行拼接 紧缩次数少,但管理(算法)较复杂。 前面已有框图表示
(5) 多重分区分配-不拼接而解决零头问题 (a) 概要 将程序分为若干段,按小段申请存区,即将程序分散在不连续存区中运行。 程序:程序、数据区等(也可解决共亨信息问题)
例:多个编绎源程序,共享一个编绎程序,要求设置多对界地址寄存器,并在为每个作业(或进程)分配主存时,可按界地址寄存器对的多个数为其共分配多个不相邻接的自由分区(空白区)例:多个编绎源程序,共享一个编绎程序,要求设置多对界地址寄存器,并在为每个作业(或进程)分配主存时,可按界地址寄存器对的多个数为其共分配多个不相邻接的自由分区(空白区) 采用多重分区技术既可以改善碎片情况,又便于共享。如上述几个进程要求同时编译的情况,只要这些进程的多重分区中都包含装有该程序的分区即可,这样主存中只有一个编译程序的副本。
o.s 下界0 作A 0区 上界0 下界1 作A 1区 上界1 例:给一个作业分配二个分区 采用动态重定位技术: 利用下界寄存器作为重定位Reg 而上界可供检查地址越界用
PC机中CS. DS. ES. SS段 代码 数据 附覆 堆栈 例: 在实存管理技术中,多重分区的多重程序不宜过多,否则会增加管理的复杂性,一般不超过3~4对界地址寄存器。多重分区技术的进一步发展导致了段式虚拟存储管理技术的出现。
(6) 覆盖(overlay): 指一个作业的若干程序段(或数据段)或几个作业的某些部分间共享某主存空间 (a) 目标:用较小的存区满足较大的存区要求 (b) 程序的分析:并不是作业的每一部分都是时时要用的
例: main A 20k A0, 30k B0, 40k B1, 30k A1, 60k A2, 30k A3, 20k A4, 40k
main 20k A main 20k B0, 40k B1, 30k 覆盖段0 40k A0, 30k A1, 60k A2, 30k 覆盖段1 60k A3, 20k A4, 40k 覆盖段2 40k 则总计270k 160k内存即可 可装入
(c) 注意: (i) 每次仅放入作业的一个部分 (ii) 覆盖段程序员事先确定 (iii) 系统自动覆盖-虚存 (iv) 可与其内存分配方法结合使用
(7) 交换:(swapping) (a) 目标:解决小主存分区大作业的矛盾––– 利用辅存 (b) 概要: 将主存中已阻塞的作业信息存入辅存,将辅存中的活动作业调入主存并运行。
job1 job2 job3 job1 job2 job2 job3 主存 job2 Job2下部 辅存 job1 job2 job3 job3 job1 上部 上部 下部 Job1 <Job3 < Job2 覆盖的部分保存好!
(c) 注意: (i) 覆盖与交换的区别 • 覆盖由用户解决空间不足 • 交换由系统解决空间不足 • 覆盖中被覆盖的那部分,既使未被破坏也不能使用,要重新调用。而交换中在界地址寄存器的保护下次可使用。
单一连续区 固定分区 多用户 (i) 两大类分区分配类 可定分区 多重分区 解决零头 可重定位分区 覆盖 覆盖交换类 交换 小结:实存管理小结
(ii) 空白区管理 分裂、合并、零头问题,分配回收算法:FF、NF、BF、WF。
§7.3 虚拟存贮管理 (Virtual storage) (1) 虚拟存贮器的概念 (a) 在实存管理技术中(除开覆盖),要求整个作业必须装入主存 作业尺寸>主存大小作业无法运行 “ 扩充”主存 ––– 虚拟存贮技术 (b) 虚拟存贮器:
地址空间 存贮空间 (运行) (编程) 交换 逻辑 物理 o.s 实存、实空间 虚空间(虚存) 关键点:
程序的访问地址称为虚地址而程序可访问的虚地址范围叫做程序的虚地址空间。程序的访问地址称为虚地址而程序可访问的虚地址范围叫做程序的虚地址空间。 可使用的实地址范围叫实地址空间(即主存) 在多道程序运行环境下,o.s把实际内存扩充成若干个虚存系统为每个用户建立一个虚拟存贮器,各用户可独立在虚存上编程运行。
(c) 虚空间独立于实空间 虚空间>>实空间(也可以虚空间<实空间) 系统地址空间 ––– 虚存空间 地址结构cpu 20位有效地址长度 ––– 0~220(寻址范围),实存64k<虚存220作业可以大于内存,部分作业调入运行,其余放入磁盘。 利用辅存存放放不进内存的作业部分。 主存+辅存虚拟存(仅与地址结构有关)
(d) 制约: (i) 主存、辅存必须有一定量 (ii) 指令的地址或长度一定(受制约) (iii) 要有地址的变换机构
(e) 虚存管理三大策略:调入策略(把哪部分装入主存),放置策略(放在主存什么地方),淘汰策略(主存不足时,把哪部分淘汰出主存。)