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