530 likes | 652 Views
(4) 分段存贮管理 (segrmanent). (a) 段地址空间:作业由若干个逻辑分段组成,如由代码分段 (cs) 数据分段( ds), 栈段( ss) 附加段( Es) 组成. 一个段可定义为一组逻辑信息,如子程序,数组或工作区, ( 分段是程序中自然划分的一组逻辑意义完整的信息集合,它是用户在编程时决定的 ) 。因此,每个作业的地址空间是由一些分段构成的,每段都有自己的名字,且都是一段连续的地址空间。. 0. 0. 0. 0. Call Load store. Y:. D:. C:. …. …. …. …. …. …. …. …. 1k.
E N D
(4) 分段存贮管理(segrmanent) (a) 段地址空间:作业由若干个逻辑分段组成,如由代码分段(cs)数据分段(ds),栈段(ss)附加段(Es)组成
一个段可定义为一组逻辑信息,如子程序,数组或工作区,(分段是程序中自然划分的一组逻辑意义完整的信息集合,它是用户在编程时决定的)。因此,每个作业的地址空间是由一些分段构成的,每段都有自己的名字,且都是一段连续的地址空间。一个段可定义为一组逻辑信息,如子程序,数组或工作区,(分段是程序中自然划分的一组逻辑意义完整的信息集合,它是用户在编程时决定的)。因此,每个作业的地址空间是由一些分段构成的,每段都有自己的名字,且都是一段连续的地址空间。
0 0 0 0 Call Load store Y: D: C: … … … … … … … … 1k 500 300 200 如下图,可见整个作业的地址空间是二维的 Main(主程序) 分段X(子程序) 分段A(数据) 分段B(工作区)
段号S 位移量W 0 7 23 分段地址系统中的地址结构有如下形式:(24位)
0 [MAIN]=0 0 2k load 4k 1k [x] S B 4596 0 段号 段长 主存始址 Y 6k 0 1k 6k LOAD 1, 1100 500 [MAIN] 1 500 4k 7k 0 D 12345 2 300 8k 100 8k 12345 3 200 9200 [A] 300 8292 8492 0 段表 C 9200 [B] 9400 200 分段映射存储
段号S 位移量W 控制寄存器 段表始址 2 100 有效地址 段号 段长 主存始址 0 1k 6k 1 500 4k 2 300 8k 物理地址 3 200 9200 8292 12345 8k 主存 对[A]=2中,D:12345地址确定
段式地址变换的步骤如下: (1) 取出程序地址(s.w) (2) 用S检索段表 (3) 如W<0或WL则内存越界 (4) (B+W)即为所需内存地址
(b) 注意: (i) 分段和分页的差异 页 ––– 作业空间单位,大小固定(“ 物理的”),用存贮器的物理划分实现一级存贮。 段 ––– 大小不定,逻辑的信息单位,实现地址空间的逻辑划分。
(ii) 分段 ––– 用户或编辑程序确定(段的最大长度由W字段的位数决定) 分页 ––– 用户不关心(由机器结构决定)
(iii) 页 ––– 单一连续空间, 段 ––– 二维空间(不同各段,段号,段内位移) (iv) 页 ––– 单段式 段 ––– 多段
(c) 评价: 便于模块化,便于处理共享问题,段的最大长度受限于主存空间,开销大。
(5) 段页式存贮管理 1. 为了获得分段在逻辑上的优点和分页在管理存储空间方面的优点采用段页式存贮管理。
W S P W 0 78 1112 23 S:段号 P:页号 W:页内位移量 2. 地址结构:
控制Reg 段表长度 段表始址 页号 状态 块号 0 1 2 3 4 L0 段号 状态 页表长度 页表始址 0 1 L0 1 0 2 0 3 0 L4 4 1 同上 主存 L4 段页式映射存储
主存 控制reg S 页表 联想存储器 不匹配 P (s.p) 主存块号 块号 w spw 虚地址 s p w 3. 段页式系统地址变换过程:
访问(s.p.w)单元 有 链接障碍中断处理 有否链接障碍? 无 不在 分段在主存吗? 缺段中段处理 在 不在 页面在主存吗? 缺页中断处理 在 形式主存物理地址 执行 4. 段页式管理流程图
链接障碍中断(实现动态链接)主要工作是给 符号命名的分段,分配一个段号;在相应段表及现行调用表中,为其设置表目,段号来作链接间接字。 缺段中段:在系统的现行分段表中建立一个表目(若曾调入进,则只需改变状态)并建立相应页表,并在其段表的相应表目中登记为页表的始址。 缺页中断:在主存中找空闲块(否则淘汰一页)调入所需的页最后修改相应的页表表目。
在段页式系统中,每个分段又被分成若干个固定大小的页,仍出现页内零头问题。见下例:在段页式系统中,每个分段又被分成若干个固定大小的页,仍出现页内零头问题。见下例: 例:该作业有三个分段,页大小为4 第一段为15k字节 占4页(最后一页有1k未用) 第二段为8k字节 占2页 第三段为10k字节 占3页(最后一页有2k未用) 与分页系统一样,这些未写满的页,装入存后依然存在内零头问题。
1段 2段 3段 0 0页 0页 0 4k 0页 1页 4k 8k 1页 2页 4k 8k 12k 1页 2页 3页 15k 10k 8k 12k 16k
注意: (1) 在这里,一个分段是每一次一页地调入主存的,所以分段中那些不被访问的页就不会被调进主存。 (2) 段页式是分段和请求页式管理方案的结合,因而,它具有两者的全部优点。 (3) 段页式管理主要缺点:增加了软件复杂性和管理开销;需要的硬件支持也增加了。
(6) 存储器管理算法 一般而言,对于具有交换功能的可变分区管理、常使用位图、链表和伙伴系统三种方法记录内存分配情况。
(a) 位图法 在位图方法中,存储器按分配单位划分,分配单位可以小至几个字节,大至nk字节。对应每一个分配单位,采用一个二进制位予以指示,该位为0表示分配单位是空闲的,为1表示已使用。
分配单位的大小是设计的重要议题 分配单位越小,位图开销越大。但总的来说,因每个分配单位只占一位,位图开销还是比较小的。例如,若分配单位仅为4个字节,则1000K字节的存储器大约需要30K字节的开销用作位图,即约占存储器的3%。 如果分配单位选择较大的容量,位图开销更少,但当进程的容量不是分配单位的整数倍时,该进程分配到的最后一个单位中的存储空间浪费也较大。
例:1.44M盘软采用位图法进行存储器管理,每单位(扇区)为512个字节,则位图大小为多少?例:1.44M盘软采用位图法进行存储器管理,每单位(扇区)为512个字节,则位图大小为多少? 解: 1.44M = 2×80×18×0.5k (双面盘80个磁道,18个扇区)
位图法对于容量固定的存储器,用它来记录存储器的使用状态是十分简单的,因为位图的大小只与存储器总的容量和分配单位的容量相关。问题是当一个具有K个单位容量的进程装入存储器时,存储器管理模块必须搜索位图,以找到K个连续为0的二进制位,由于此搜索操作比较费时,位图法在实际中不常采用。位图法对于容量固定的存储器,用它来记录存储器的使用状态是十分简单的,因为位图的大小只与存储器总的容量和分配单位的容量相关。问题是当一个具有K个单位容量的进程装入存储器时,存储器管理模块必须搜索位图,以找到K个连续为0的二进制位,由于此搜索操作比较费时,位图法在实际中不常采用。
(b) 链表 另一种记录存储器使用情况的方法是利用链表结构把已分配和尚未分配的存储器段链接起来,以便查找。
P/H 起始地址 长度 指针 链表中每一结点包含四个域,分别说明该段是装有过程或是空闲。起始地址,长度和指向下一结点的指针。
A C E D B 5 8 14 18 20 26 29 图(a) 例如,下图(a)表示存储器当前的使用情况,图中一个刻度表示一个分配单位,则对应的位图如图(b)所示,而采用链表结构如图(c)所示。
A C E D B 5 8 14 18 20 26 29 图(a) 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 0 0 (b) 位图
A C E D B 过程 长度 5 8 14 18 20 26 29 起始 P 0 5 H 5 3 P 8 6 空闲 指针 图(a) H 18 2 P 14 4 P 20 6 H 29 3 P 26 3 (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
(c) 伙伴系统 如果把链表中的空闲段结点做为一个独立链表,且以段的大小排序链表,则分配算法执行速度会很快,但在释放存储段时,速度会变慢。其原因是为了寻找释放段的邻接段必须搜索空闲链表。本节介绍的伙伴(buddy system)内存管理算法,利用了计算机二进制数寻址的优点,来加速相邻空闲段的归并。
下面通过一个例子说明伙伴系统的工作过程。内存管理模块保持有一个空闲块链表,空闲块的大小可以为1,2,4,8,… ,2n字节,其中n为计算机的有效地址位。例如,对于1M的内存,空闲块的大小可有20个不同的值,分别为2i个字节,其中1i20。初始时,整个存储器是空闲的,链表只含有一个1M字节的空闲块。
1024 A 128 256 512 A B 64 512 256 C 64 B 512 128 A C 64 128 128 512 B C 128 64 64 512 D B 128 64 C 512 128 D 128 256 C 512 1024
说明: 1. A - 70K进程装入内存2. B - 35K进程装入内存3. C - 80K进程装入内存4. 释放A5. D - 60K进程装入内存6. 释放B7. 释放D,释放C
进程A退出内存,伙伴系统比较那些按块大小,但不要求块地址是2的整数倍的算法,其优点是当一个大小为2k个字节的块释放时,存储器管理模块只需搜索大小为2k字节的块,看其是否可以合并,而其它算法则必须搜索所有的空闲块。因此,伙伴系统速度快。进程A退出内存,伙伴系统比较那些按块大小,但不要求块地址是2的整数倍的算法,其优点是当一个大小为2k个字节的块释放时,存储器管理模块只需搜索大小为2k字节的块,看其是否可以合并,而其它算法则必须搜索所有的空闲块。因此,伙伴系统速度快。
但存储器利用角度来说,伙伴系统性能很差,其原因是进程的大小不一定是2的整数倍,由此会造成浪费。例如,35K的进程要分配64K的内存给它,29K的内存便浪费掉了。这种存储段内的碎片称之为内部碎片,而存储段间的碎片称之为外部碎片。但存储器利用角度来说,伙伴系统性能很差,其原因是进程的大小不一定是2的整数倍,由此会造成浪费。例如,35K的进程要分配64K的内存给它,29K的内存便浪费掉了。这种存储段内的碎片称之为内部碎片,而存储段间的碎片称之为外部碎片。
如果随机数的分布是均匀分布,则进程段和空闲段的数目将大致相同,但因相邻的空闲段可以合并,最后产生的空闲段数目要少于进程段数目。如果随机数的分布是均匀分布,则进程段和空闲段的数目将大致相同,但因相邻的空闲段可以合并,最后产生的空闲段数目要少于进程段数目。
空闲段和进程段数目之比也可通过分析式得到,这样,平均而言,内存中空闲段的数目为进程段数目的一半。换句话说,若进程段数目平均为n,则空闲段数目平均为n/2。这一结果,常称为百分五十规则,该规则的另一推导思想是因进程段和空闲在内存基本对称,但由于相邻的空闲段可以合并,因此其数目约为进程段数目的一半。空闲段和进程段数目之比也可通过分析式得到,这样,平均而言,内存中空闲段的数目为进程段数目的一半。换句话说,若进程段数目平均为n,则空闲段数目平均为n/2。这一结果,常称为百分五十规则,该规则的另一推导思想是因进程段和空闲在内存基本对称,但由于相邻的空闲段可以合并,因此其数目约为进程段数目的一半。