第08讲_存储管理_1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分区回收算法:当一个进程运行结束,释放它所占 用的分区后,需要将相邻的几个空闲分区合并为一 个大的空闲分区。具体来说,可分以下四种情况:
在分区回收后,可以很方便地更新分区链表。
25
进程A (a) 占 0 5 进程A (b)
空闲区 进程X
空 占 5 3
进程B 占 8 6 空闲区
进程X 占 5 3 空闲区 空 5 9 进程X 占 5 3
9
多个输入队列
800K
分区4
700K
分区3
400K
对于每一个用户分区, 都有一个输入队列。当 一个新的进程到来时, 把它加入到某个输入队 列当中,该输入队列所 对应的分区,是能够装 下该进程的最小分区。 缺点:可能出现小分区 的输入队列是满的,而 大分区的输入队列却空 着(如分区1和分区3的 的情形),从而造成资 源的浪费。
Parkinson定律: 存储器有多大,程序有多长。
3
理想中的存储器:
更大、更快、更便宜的非易失性存储器。
实际中的存储器: 存储器层次结构
(本图摘自Andrew S. Tanenbaum: “Modern Operating Systems” )
4
在操作系统中,负责管理这个存储器层次 结构的部分,称为存储管理器。其任务是: 记录存储器的使用情况;
3)地址映射
为了保证CPU执行指令时可正确访问存储单元, 需要将用户程序中的逻辑地址转换为运行时由 机器直接寻址的物理地址,这一过程称为地址 映射。
29
源程序
0
逻辑地址空间
物理地址空间
int x, y; x = 5; y = x + 3;
. . .
str 5 [200] ldr R1, [200] add R2,R1,3 str R2, [204]
缺点:每次只能运行一个程序;对那些 使用空间较少的程序,造成内存浪费;
适合于单用户、单任务的OS。
6
三种实现方式
BIOS
(本图摘自Andrew S. Tanenbaum: “Modern Operating Systems” )
7
4.2 分区存储管理
内存分为两大区域:系统区,用户区。 又把用户区划分为若干分区(partition), 分区大小可以相等,也可以不等。一个 进程占用一个分区。 特点:适合于多道程序系统和分时系统, 支持多个程序并发执行; 分为两类:固定分区和可变分区。
占 0 5
进程A 占 0 5 空闲区
空 8 6
(c) 略… 空闲区 空 8 6
(d)
空 0 5 空闲区 空 0 14
26
4. 碎片问题
经过一段时间的分配与回收后,内存中存在着很多 不连续的很小的空闲分区(外碎片)。当一个新进 程到来时,这些小的空闲区都不足以满足分配要求, 但其总和满足分配要求。这就是(外)碎片问题。
0 5 8 14 18 20 26 29 32
A
B
C
D
E
占 0 5 空 18 2
空闲
空 5 3 占 20 6
起始 长度
占 8 6 占 26 3
占用
占 14 4 空 29 3 X
19
2. 分区分配算法
分区分配算法:当一个新的进程来到时,需 为它寻找某个空闲分区,其大小必须大于或 等于该进程的要求。若是大于要求,则将该 分区分割成两个分区,其中一个分区为要求 的大小并标记为“占用”,而另一个分区为 余 下部分并标记为“空闲”。分区的先后次序 通 常是从内存低端到高端。 分区分配算法主要有:最先匹配法、下次匹
x y
x y
1200 1204
300
1300
. . .
. . .
32
动态地址映射(动态重定位):当用户程序被装 入内存时,不对指令代码做任何修改。而是在程 序运行过程中,当需要访问内存单元时再来进行 地址转换(即在逐条执行指令时完成转换)。 – 为提高效率,此工作一般由硬件地址映射机 制来完成,通常的做法是设置一个基地址寄 存器(重定位寄存器)。当一个进程被调度 运行时,把它所在分区的起始地址装入到该 寄存器当中; – 在程序运行过程中,当需要访问内存单元时, 硬件就自动地将其中的相对地址加上基地址 寄存器的内容,形成实际的物理地址,然后 按该地址去执行; – 适合于固定分区和可变分区。
8
4.2.1 固定分区存储管理
各个用户分区的个数、位置和大小一旦确定以后, 就固定不变。为了满足不同程序的存储需要,各分 区的大小可相等,也可不等。 • 分区大小相等:只适合于多个相同程序的并发执 行(处理多个类型相同的对象);
• 分区大小不等:多个小分区、适量的中等分区、 少量的大分区; • 当进程到来时,根据它的大小,把它放置到相应 的输入队列当中,等待合适的空闲分区。两种实 现方式:多个输入队列和单个输入队列。
分配和回收存储空间;
如果内存太小,容不下所有的进程,则 需要把进程在内存和外存之间换进换出, 这个交换的过程由存储管理器来管理。 由此可以把存储管理系统分为两类:1) 需要换进换出的;2) 不需要换进换出的。
5
4.1 单道程序存储管理
内存分为两个区域:系统区,用户区。 每次把一个应用程序装入到用户区运行, 由它和操作系统来共享内存。当它运行 结束后,操作系统再装入一个新的程序 把它覆盖; 优点:简单、开销小,易于管理;
最坏匹配法(worst-fit):每次分配时,总是将最大 的空闲区切去一部分分配给请求者,其依据是当 一个很大的空闲区被切割了一部分后可能仍是一 个较大的空闲区,从而避免了空闲区越分越小的 问题。这种算法基本不留下小的空闲分区,但较 大的空闲分区也不被保留。
23
地址低端
8K 12K 22K First Fit
21
下次匹配法 (next-fit) :与最先匹配法的思路是相 似的,只不过每一次当它找到一个合适的结点( 分区)时,就把当前的位置记录下来。然后等下 一次新进程到来的时候,就从这个位置开始继续 往下找(到链表结尾时再回到开头),直到找到 符合要求的第一个分区。而不是象最先匹配法那 样,每次都是从链表的首结点开始找。
把内存分成很多个大小相等的存储单元,每个 单元给一个编号,这个编号称为物理地址; 物理地址可以直接寻址; 物理地址的集合称为物理地址空间(内存地址 空间),它是一个一维的线性空间。
28
2)逻辑地址
也叫相对地址,虚地址;
用户程序经过汇编或编译后形成目标代码,目 标代码通常采用相对地址的形式,其首地址为 0,其余指令中的地址都是相对首地址来编址; 不能用逻辑地址在内存中读取信息。
11
分区2
200K
分区1
100K
操作系统
0
固定分区的实现 数据结构:设置内存分配表
分区号 起始地址 长度 状态 进程名
内存分配:先放入输入队列,然后采用 最先匹配法、最佳匹配法 等算法。 内存回收:简单
12
固定分区的优点:易于实现,开销小。 固定分区的缺点: • 内存利用率不高,内碎片造成很大浪费。 所谓内碎片,即进程所占用分区之内的未 被利用的空间。 • 分区的总数固定,限制了并发执行的程序 个数,不够灵活。 因此,人们又提出了可变分区(动态分区) 的存储管理技术。
31
逻辑地址空间
0
物理地址空间
. . .
str 5 [200] ldr R1, [200] add R2,R1,3 str R2, [204]
. . .
装入分区
str 5 [1200] ldr R1,[1200] add R2,R1,3 str R2,[1204]来自1000100
1100
200 204
查找的结点很少,因而速度快;
该算法使空闲分区分布得更均匀,但较大的 空闲分区不易保留。从性能上略逊于最先匹 配法。
22
最佳匹配法 (best-fit) :将申请内存的进程装入到 与其大小最接近的空闲分区当中。算法的最大缺 点是分割后剩余的空闲分区将会很小,直至无法 使用,从而造成浪费(与固定分区是不同的)。
17
672K 576K 448K
空闲区 96K 进程4 128K 空闲区 320K 进程1
128K
操作系统 128K
0
4.2.3 可变分区的实现
如何实现可变分区的存储管理技术?
1. 内存管理的数据结构; 2. 内存的分配算法
3. 内存的回收方法
4. 碎片问题
18
1. 分区链表
系统维护一个分区链表,来跟踪记录每一个内存 分区的情况,包括该分区的状态(已分配或空闲)、 起始地址、长度等信息。
内存紧缩(Compaction):把所有的进程尽可能
地往地址低端移动,相应的,那些空闲的小分区就 会往地址的高端移动,从而形成一个大的空闲区。 • 所有进程的移动需要大量的CPU时间; • 如何解决程序移动后,地址的重定位问题?
27
4.2.4 重定位和存储保护
1. 地址映射(重定位)
1)物理地址
也叫内存地址、绝对地址,实地址;
52programpagingmainmemoryvirtualaddressregisterpagetablepageframeoffsetpagetableptrpageoffsetframe页式地址映射53页表长度页表地址控制寄存器页号页面号有效地址1c4物理地址1c4页式地址映射举例页号页内偏移量54在现有的方案中每一次访问内存数据指令时都要做两次访问内存的工作第一次是读页表第二次是真正访问数据指令
13
4.2.2 可变分区存储管理
分区不是预先划分好的固定区域,而是动态创建的。 在装入一个程序时,根据它的需求和内存空间的使用 情况来决定是否分配。具体来说,系统生成后,操作 系统会占用内存的一部分(一般在内存地址低端), 其余空间为一个完整的大空闲区。当一个程序要求装 入内存运行时,系统从这个空闲区中划分一块分配给 它,当程序完成后释放所占用的存储区。随着一系列 的内存分配和回收,原来的一整块大空闲区就形成了 若干占用区和空闲区相间的布局。
第八讲
清华大学软件学院
1
第四章 存储管理 1. 单道程序存储管理
2. 分区存储管理
3. 页式和段式存储管理 4. 覆盖技术与交换技术 5. 虚拟存储技术
2
三国志游戏系列
一代 二代 三代 四代 五代 六代 七代
437K 883K 1.9M 6M
八代
6.3M 59M 100M 138M
这说明:
程序规模的增长速度远远大于存储器容量的 增长速度。
672K 进程2 224K 空闲区 224K 448K 进程1 320K 128K
操作系统 128K
0
16
1024K
960K
空闲区 64K 进程3 288K
可变分区的特点: • 在可变分区当中,分区的个 数、位置和大小都是随进程 的进出而动态变化的,非常 灵活,避免了在固定分区中 因分区大小不当所造成的内 碎片,提高了内存利用率。 • 有外碎片,即各个占用分区 之间难以利用的空闲分区 (通常是小空闲分区); • 使得内存的分配、回收和管 理更为复杂。
20
最先匹配法 (first-fit) :假设新进程对内存大小的 要求为M,那么从分区链表的首结点开始,将每 一个“空闲”结点的长度与M进行比较,看是否 大于或等于它,直到找到第一个符合要求的结点 。然后把它所对应的空闲分区分割为二个小分区 ,一个用于装入该进程,另一个仍然空闲。与之 相对应,把该结点也一分为二,并修改相应内容 。 查找的结点很少,因而速度快; 算法的实质是尽可能利用低地址部分的空闲 区,而尽量地保证高地址部分的大空闲区, 使其不被分割成小的区,这样当以后有大的 进程到来时,有足够大的空闲区来满足它。
10
分区2
200K
分区1
100K
操作系统
0
800K
分区4
单个输入队列
700K
分区3
400K
对于所有的用户分 区,只有一个统一 的输入队列。当一 个新进程到来时, 把它加入到该输入 队列当中,然后当 某个分区空闲时: • 离队首最近的、 能装入该分区的 进程被选中; • 搜索整个队列, 选择能装入该分 区的最大进程。
装入 分区
. . .
str 5 [200] ldr R1, [200] add R2,R1,3 str R2, [204]
1000
100 编译 链接 200 204
1100
x y
x y
1200 1204
300
1300
. . .
. . .
30
为了保证CPU执行指令时可正确访问存储单元, 在装入程序时必须进行地址映射,将程序中的 逻辑地址转换为物理地址。这主要有两种方式: 静态地址映射(静态重定位):当用户程序 被装入内存时,直接对指令代码进行修改, 一次性实现逻辑地址到物理地址的转换,以 后不再转换。 – 在可执行文件中,需列出各个需要重定位 的地址单元的位置。在装入时,由一个装 入程序(加载程序)来完成; – 实现简单,不需要硬件的支持; – 程序装入内存后不能移动(只适合固定分 区)。
8K 12K
16K
Best Fit
6K
Last allocated 18K block (14K)
2K
16K
8K
8K
6K
新进程 16K
6K
Allocated block 14K Free block Next Fit 36K 14K
Worst Fit
20K Before
16K
After
地址高端
24
3. 分区回收算法
14
1024K
1024K
空闲区 576K
空闲区 896K
448K 进程1 320K
128K
操作系统 128K 0
128K 操作系统 128K 0
15
1024K 空闲区 352K
1024K
960K
空闲区 64K 进程3 288K
672K
进程2 224K 448K 进程1 320K 128K 操作系统 128K 0
相关文档
最新文档