南邮操作系统教程CH-04-存储管理PPT课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ch414p1p2p3p40k0k1515kk38k38k4848kk68k68k80k80k110110kk120k120k空闲区表已分配区表长度标志15k23k未分配48k20k未分配80k30k未分配长度标志0k15kp138k10kp268k12kp3110k10kp4某一时刻的分配状态15k53k未分配ch415可变分区分配算法分配第一个足够大的分区可以从头开始查找也可以从上次分配结束的地点开始查找总是产生最小剩余分区丌浪费一个更大的空间但会寻致剩余分区太小难被再利用总是产生最大剩余分区它可能比最优适应产生的剩余分区更容易利用ch416可变分区的地址转换和存储保护基址基址寄存器逡辑地址cpu绝对地址操作系统区空闲分区1用户迚程1空闲分区2ch417紧凑技术经过一段时间的分配回收后内存中存在很多很小的空闲块
物理地址 = Base(0x4000) + 0x240 = 0x4240
从0x4240获取指令 “la $a0, varx”
Move 0x4050 $a0, Move PC+4 PC
下一条指令的逻辑地址=0x244,转换成物理地址=0x4244,得到 “jal strlen” Move 0x0248 $ra (return address!), Move 0x0360 PC
ch4.10
固定分区存储管理
存储分配:系统维护一张主存分配表,里面记载了 内存的分区划分和使用状态。分配主存时总选择那 些分区占用标志为0且长度小于等于进程所需空间的 分区块。回收只要相应分区占用位置0即可。
分区号 1 2 3 4 5 6
起始地址 8K 16K 32K 48K 64K 96K
长度 8K 16K 16K 16K 32K 32K
两个问题
内存中的进程如何交互? 内核模式和用户模式如何切换?
ch4.9
连续存储管理
所谓连续,是指进程在主存里占用一块连续的空间。 如果系统事先把内存用户区划分为若干分区,分区
大小可以相等,也可以不等,一个进程占据一个分 区。我们称其为固定分区存储管理。 若内存不预先划分好,而是等进程装入时,根据进 程的需求和内存空间的使用情况来决定是否分配。 我们称其为可变分区存储管理。
复习:段式存储的逻辑地址
0x0 0
0
0x0 1 …
0x0 F
0x1 00
0x1 01

1
0x1 0F 0x1 10

0x2 000 0x2 001 … 0x2 00F 0x2 010
2…
0x3 00 0x3 01 … 0x3 0F
3 0x3 10

0x1 FF
段号
段内位移
15 14
逻辑地址
0
0x2 0FF …
经过一段时间的分配回收后,内存中存在很多很小的 空闲块。它们每一个都很小,不足以满足分配要求; 但其总和满足分配要求。这些空闲块被称为碎片,造 成存储资源的浪费。
解决方法―紧凑
通过在内存移动进程,将所有小的空闲区域合并为大 的空闲区域。
使用静态地址转换的不可以使用紧凑。 采用紧凑技术前要评估开销。
逻辑地址空间 0
物理地址空间 1000
100 goto 200
1100 goto 1200
200
a++
1200 a++
300
1300
ch4.6
动态地址转换
动态转换:在程序执行过程中要访问数据时再进行 地址变换,需要额外的硬件来记录程序装载的内存 基址。
逻辑地址空间 0
物理地址空间 1000
CPU goto 200
0
逻辑地址
0x0000
0x0000
段号
0 (code) 1 (data) 2 (shared) 3 (stack)
基址
0x4000 0x4800 0xF000 0x0000
限长
0x0800 0x1400 0x1000 0x3000
0x4000 0x4800 0x5C00
也可能被共享
其它进程空间
0xFFFF
最坏适应
查找整个分区表,分配最大的足够大的分区 总是产生最大剩余分区,它可能比最优适应产生的剩
余分区更容易利用
ch4.15
可变分区的地址转换和存储保护
限长寄存器 限长
基址寄存器 基址
操作系统区
空闲分区1
CPU 逻辑地址
<限长
+ 绝对地址
用户进程1 空闲分区2
越界!!
ch4.16
紧凑技术
“碎片”问题
占用标志 0 P1 0 0 P2 0
0k
OS (8K)
8k
分区1 (8K)
16k 分区2 (16K)
32k 分区3 (16K) 48k 分区4 (16K) 64k 分区5 (32K) 96k 分区6 (32K)
ch4.11
固定分区的地址转换和存储保护
静态转换:装入时检查绝对地址是否落在分区内 动态转换:执行时检查,如下图所示。
Operating System
进程
0xFFFFFFFF Limit=0x10000 Base=0x20000
0x00000000
Base
+ 逻辑地址
CPU
DRAM
Limit
<?
出错!
ch4.8
看管好用户进程
策略: 将用户进程关在一个内存区域
它不能自己切换到内核模式 它不可以直接改变基址和限长寄存器的值 它不可以随意更改中断控制 它不可以访问其它进程的内存空间数据
0x2 FFF
0x3 FF
我们称这些编号为逻辑地址,前一部分表示段号,后一部分表示段内位移。
段号和段内位移应该占多少位取决于系统和人为规定。在一个采用16位地 址的计算机系统里,如果一个进程最多分成四段,那么段号就仅要占用2 个二进制位即可。
这些段在内存中离散存储,它们在内存中真实的地址叫物理地址,为了能 定位这些离散段在内存中的位置,要把每个段在内存中的起始地址记录下 来,同时要记录每个段可达的最大长度,这两个数值分别被记录在一个基 址和一个限长寄存器之中。
0 demo: 1 int a = 0 2 loop: 3 temp = a – 2 4 if (temp>0) goto do7ne 5 a++ 6 goto lo2op
7 done: 8 return 0
ch4.3
存储地址及地址转换
存储器使用的地址叫物理地址(绝对地址),其空间 是由存储器地址总线扫描出来的空间,其大小取决 于实际安装的主存容量。
ch4.17
紧凑技术的实现过程
操作系统 进程1
空闲区(10K) 进程2
空闲区(10K) 进程3
空闲区(10K)
进程4需要20K空间时 没有足够大的空闲区
操作系统 进程1 进程2 进程3
空闲区(30K)
操作系统 进程1 进程2 进程3
进程4(20K)
空闲区(10K)
ch4.18
内部碎片和外部碎片
固定分区
0k
OS (8K)
8k
分区1 (8K)
16k 分区2 (16K)
32k 分区3 (16K)
48k 分区4 (16K) 64k 分区5 (32K) 96k 分区6 (32K)
0K
外部碎片 15K
38K
内部碎片
48K
68K
80K
碎片
内部碎片 110K
外部碎片
都是“连续”惹得祸→把进程剪
120K
可变分区 P1 P5 P2
目标程序地址叫逻辑地址(相对地址),被限制从0开 始编址,一个用户程序的逻辑地址集合称为该程序 的逻辑地址空间。
地址转换(重定位、地址映射):将程序的逻辑地址 转成物理地址的过程。
静态转换 动态转换
ch4.4
程序执行步骤(地址转换时机)
执行步骤:
源代码
编译 链接/装载
编译器
执行
中间代码 0… 1… 2… 3… …
50K
内存
1 2
0 50K 100K 180K 230K …
其它 目标模块
目标模块 链接器
装载模块 装载器
内存可执行二进制
ch4.5
静态地址转换
静态转换:当用户程序被装入内存时,一次性实现 逻辑地址到物理地址的转换,以后不再转换。一般 在装入内存时由软件完成。若编译时完成则需要程 序员事先知道要装载的地址。
ch4.21
复习:如何将逻辑地址空间分割
代码 共享
数据 堆栈
0
0
3
1
2
1
3
2
逻辑内存
物理内存
将进程剪碎有很多种方法,最自然的分割方法就是按段划分, 通常一个进程都包含几个基本段。
为了标识指令和数据地址,给每一个段从0开始编一个号, 同时在段内部给每一条指令和数据也编一个从0开始号码。
ch4.22
第四章 存储管理 4.1 概述 4.2 连续存储管理 4.3 分页式存储管理 4.4 分段式存储管理 4.5 虚拟存储
ch4.1
学习目标
虚拟设备
多个进程和线程可以共享一个CPU 多个进程和线程应该可以共享一个存储器 多个进程和线程还可以共享一个IO设备(第5章)
如何共享一个存储器?
各进程/线程自己的数据有自己的执行区域,程序变 成进程时是如何映射到那个区域去的?
100 goto 200
200
a++
1100 goto 200
BR
+
1000
1200 a++
300
1300
ch4.7
存储保护
使在内存中的各道进程,只能访问它自己的区域, 避免进程内存空间重叠,特别是不能访问OS的内存 空间。
通常需要两个硬件支持(不需要转换地址):
基址寄存器(Base Register):存放装载的起始地址 限长寄存器(Limit Register):存放的最大逻辑地址
逻辑地址空间
0xF000
物理地址空间
共享段
ch4.25
段式地址转换实例
0x240 0x244

0x360 0x364 0x368

0x4050
main:
strlen: loop:
varx
la $a0, varx jal strlen

li $v0, 0 lb $t0, ($a0) beq $r0,$t1, done
回收:将已分配表的标志改为“空”,再将其加入 未分配表中。
ch4K
38K
P2
48K
68K
P3
80K
110K
P4
120K
始址 1155KK 48K 80K
空闲区表
长度 5233KK 20K 30K
标志 未未分分配配 未分配 未分配
始址 0K 38K 68K 110K
下限寄存器
B
操作系统区 用户分区1
越界!!
用户分区2
CPU
+
逻辑地址 绝对地址
< B+L2
用户分区3 用户分区4
上限寄存器 B + L2
用户分区5 用户分区6
ch4.12
可变分区存储管理
存储分配:
系统维护两张表,一张记录尚未分配的内存状态,另 一张记录已分配的情况。
初始状态已分配表为空,未分配表仅有一条记录,整 个用户区就是空闲区。系统总是从空闲中选择一个足 够容纳进程的分区分配,并将分配情况记在已分配表 中,剩余的分区空间记录进未分配表。
ch4.23
复习:段式存储管理的地址转换和保护
逻辑地址 段号 段内位移
Base0 Limit0 V Base1 Limit1 V Base2 Limit2 V Base3 Limit3 N Base4 Limit4 V Base5 Limit5 N Base6 Limit6 N Base7 Limit7 V
> 越界
+
物理地址
段式存储管理的逻辑地址包括段号和段内位移。 每一个段都对应着基址和限长两个值,一个进程所有段的这
些寄存器对的值列表被称作“段表”。 物理地址 = 逻辑地址中段号对应的段基址 + 段内位移 限长寄存器的值用于存储保护
ch4.24
简单的分段实例(16位地址空间)
段号
段内位移
15 14 13
> 越界
+
物理地址
每个程序段都有一个段号,段号从0开始,每一段也从0开始 编址,段内地址是连续的,逻辑地址包括段号和段内位移。
通过基址和限长可以找到段在内存的位置,一个进程所有段 的这些值列表被称作“段表”。段表可设置标志位决定该段 的读写性。
物理地址 = 逻辑地址中段号对应的段基址 + 段内位移

dw 0x314159
段号 0 (code) 1 (data) 2 (shared) 3 (stack)
基址 0x4000 0x4800 0xF000 0x0000
限长 0x0800 0x1400 0x1000 0x3000
程序执行流程 (PC=0x240):
得到下一条指令的逻辑地址=0x240,段号:0,位移:0x240
已分配区表
长度 15K 10K 12K 10K
标志 P1 P2 P3 P4
ch4.14
可变分区分配算法
首次适应
分配第一个足够大的分区,可以从头开始查找,也可 以从上次分配结束的地点开始查找
最优适应
查找整个分区表,分配最小的足够大的分区 总是产生最小剩余分区,不浪费一个更大的空间,但
会导致剩余分区太小难被再利用
P3
P4
ch4.19
如何将逻辑地址空间分割
代码
数据
堆栈
附加
0
0
3
1
2
1
3
2
逻辑内存
内存
最自然的分割方法就是按段划分,通常一个进程都 包含几个基本段。
这些段可以在内存中分散存储,为了能找到它们, 每个段都设有一个基址和一个限长。
ch4.20
段式存储管理的地址转换和保护
逻辑地址 段号 段内位移
Base0 Limit0 V Base1 Limit1 V Base2 Limit2 V Base3 Limit3 N Base4 Limit4 V Base5 Limit5 N Base6 Limit6 N Base7 Limit7 V
对各进程/线程在内存中的数据要加以保护,如何实 施?
为了更好地利用CPU,就应该让更多的进程/线程并 发执行,如果内存不够用了怎么办?
虚拟存储器
ch4.2
源代码的伪中间代码
int demo(){ int a = 0;
while(a<2){ a++;
} return 0; }
代码执行时,这些行 号需要改变吗?
相关文档
最新文档