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

上传人:我*** 文档编号:145492438 上传时间:2020-09-20 格式:PPT 页数:70 大小:739.50KB
返回 下载 相关 举报
南邮操作系统教程CH 04 存储管理课件_第1页
第1页 / 共70页
南邮操作系统教程CH 04 存储管理课件_第2页
第2页 / 共70页
南邮操作系统教程CH 04 存储管理课件_第3页
第3页 / 共70页
南邮操作系统教程CH 04 存储管理课件_第4页
第4页 / 共70页
南邮操作系统教程CH 04 存储管理课件_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《南邮操作系统教程CH 04 存储管理课件》由会员分享,可在线阅读,更多相关《南邮操作系统教程CH 04 存储管理课件(70页珍藏版)》请在金锄头文库上搜索。

1、第四章 存储管理,4.1 概述 4.2 连续存储管理 4.3 分页式存储管理 4.4 分段式存储管理 4.5 虚拟存储,学习目标,虚拟设备 多个进程和线程可以共享一个CPU 多个进程和线程应该可以共享一个存储器 多个进程和线程还可以共享一个IO设备(第5章) 如何共享一个存储器? 各进程/线程自己的数据有自己的执行区域,程序变成进程时是如何映射到那个区域去的? 对各进程/线程在内存中的数据要加以保护,如何实施? 为了更好地利用CPU,就应该让更多的进程/线程并发执行,如果内存不够用了怎么办? 虚拟存储器,源代码的伪中间代码,int demo() int a = 0; while(a2) a+;

2、 return 0; 代码执行时,这些行号需要改变吗?,0 demo: 1int a = 0 2 loop: 3temp = a 2 4if (temp0) goto done 5a+ 6 goto loop 7 done: 8return 0,7,2,存储地址及地址转换,存储器使用的地址叫物理地址(绝对地址),其空间是由存储器地址总线扫描出来的空间,其大小取决于实际安装的主存容量。 目标程序地址叫逻辑地址(相对地址),被限制从0开始编址,一个用户程序的逻辑地址集合称为该程序的逻辑地址空间。 地址转换(重定位、地址映射):将程序的逻辑地址转成物理地址的过程。 静态转换 动态转换,执行步骤: 编

3、译 链接/装载 执行,程序执行步骤(地址转换时机),中间代码 0 1 2 3 ,0 50K 100K 180K 230K ,50K,1,2,内存,静态地址转换,静态转换:当用户程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换。一般在装入内存时由软件完成。若编译时完成则需要程序员事先知道要装载的地址。,1000,goto 1200,0,100,200,300,goto 200,a+,逻辑地址空间,1100,1200,1300,物理地址空间,a+,动态地址转换,动态转换:在程序执行过程中要访问数据时再进行地址变换,需要额外的硬件来记录程序装载的内存基址。,1000,goto 20

4、0,0,100,200,300,a+,1100,1200,1300,a+,逻辑地址空间,物理地址空间,CPU goto 200,1000,BR,+,goto 200,存储保护,使在内存中的各道进程,只能访问它自己的区域,避免进程内存空间重叠,特别是不能访问OS的内存空间。 通常需要两个硬件支持(不需要转换地址): 基址寄存器(Base Register):存放装载的起始地址 限长寄存器(Limit Register):存放的最大逻辑地址,0 x00000000,0 xFFFFFFFF,Operating System,进程,DRAM,+,Base,Limit,CPU,逻辑地址,看管好用户进程,

5、策略: 将用户进程关在一个内存区域 它不能自己切换到内核模式 它不可以直接改变基址和限长寄存器的值 它不可以随意更改中断控制 它不可以访问其它进程的内存空间数据 两个问题 内存中的进程如何交互? 内核模式和用户模式如何切换?,连续存储管理,所谓连续,是指进程在主存里占用一块连续的空间。 如果系统事先把内存用户区划分为若干分区,分区大小可以相等,也可以不等,一个进程占据一个分区。我们称其为固定分区存储管理。 若内存不预先划分好,而是等进程装入时,根据进程的需求和内存空间的使用情况来决定是否分配。我们称其为可变分区存储管理。,固定分区存储管理,存储分配:系统维护一张主存分配表,里面记载了内存的分区

6、划分和使用状态。分配主存时总选择那些分区占用标志为0且长度小于等于进程所需空间的分区块。回收只要相应分区占用位置0即可。,固定分区的地址转换和存储保护,静态转换:装入时检查绝对地址是否落在分区内 动态转换:执行时检查,如下图所示。,可变分区存储管理,存储分配: 系统维护两张表,一张记录尚未分配的内存状态,另一张记录已分配的情况。 初始状态已分配表为空,未分配表仅有一条记录,整个用户区就是空闲区。系统总是从空闲中选择一个足够容纳进程的分区分配,并将分配情况记在已分配表中,剩余的分区空间记录进未分配表。 回收:将已分配表的标志改为“空”,再将其加入未分配表中。,空闲区表,已分配区表,某一时刻的分配

7、状态,可变分区分配算法,首次适应 分配第一个足够大的分区,可以从头开始查找,也可以从上次分配结束的地点开始查找 最优适应 查找整个分区表,分配最小的足够大的分区 总是产生最小剩余分区,不浪费一个更大的空间,但会导致剩余分区太小难被再利用 最坏适应 查找整个分区表,分配最大的足够大的分区 总是产生最大剩余分区,它可能比最优适应产生的剩余分区更容易利用,可变分区的地址转换和存储保护,基址,基址寄存器,逻辑地址,CPU,绝对地址,操作系统区,空闲分区1,用户进程1,空闲分区2,限长,限长寄存器,限长,越界!,+,紧凑技术,“碎片”问题 经过一段时间的分配回收后,内存中存在很多很小的空闲块。它们每一个

8、都很小,不足以满足分配要求;但其总和满足分配要求。这些空闲块被称为碎片,造成存储资源的浪费。 解决方法紧凑 通过在内存移动进程,将所有小的空闲区域合并为大的空闲区域。 使用静态地址转换的不可以使用紧凑。 采用紧凑技术前要评估开销。,紧凑技术的实现过程,进程4需要20K空间时没有足够大的空闲区,内部碎片和外部碎片,碎片 内部碎片 外部碎片 都是“连续”惹得祸把进程剪碎,P1,P2,P3,P4,0K,15K,38K,48K,68K,80K,110K,120K,固定分区,可变分区,P5,外部碎片,内部碎片,如何将逻辑地址空间分割,最自然的分割方法就是按段划分,通常一个进程都包含几个基本段。 这些段可

9、以在内存中分散存储,为了能找到它们,每个段都设有一个基址和一个限长。,0,2,1,3,逻辑内存,内存,代码,数据,堆栈,附加,段式存储管理的地址转换和保护,每个程序段都有一个段号,段号从0开始,每一段也从0开始编址,段内地址是连续的,逻辑地址包括段号和段内位移。 通过基址和限长可以找到段在内存的位置,一个进程所有段的这些值列表被称作“段表”。段表可设置标志位决定该段的读写性。 物理地址 = 逻辑地址中段号对应的段基址 + 段内位移,复习:如何将逻辑地址空间分割,将进程剪碎有很多种方法,最自然的分割方法就是按段划分,通常一个进程都包含几个基本段。 为了标识指令和数据地址,给每一个段从0开始编一个

10、号,同时在段内部给每一条指令和数据也编一个从0开始号码。,0,2,1,3,逻辑内存,物理内存,代码,数据,共享,堆栈,复习:段式存储的逻辑地址,我们称这些编号为逻辑地址,前一部分表示段号,后一部分表示段内位移。 段号和段内位移应该占多少位取决于系统和人为规定。在一个采用16位地址的计算机系统里,如果一个进程最多分成四段,那么段号就仅要占用2个二进制位即可。 这些段在内存中离散存储,它们在内存中真实的地址叫物理地址,为了能定位这些离散段在内存中的位置,要把每个段在内存中的起始地址记录下来,同时要记录每个段可达的最大长度,这两个数值分别被记录在一个基址和一个限长寄存器之中。,复习:段式存储管理的地

11、址转换和保护,段式存储管理的逻辑地址包括段号和段内位移。 每一个段都对应着基址和限长两个值,一个进程所有段的这些寄存器对的值列表被称作“段表”。 物理地址 = 逻辑地址中段号对应的段基址 + 段内位移 限长寄存器的值用于存储保护,简单的分段实例(16位地址空间),段式地址转换实例,程序执行流程 (PC=0 x240): 得到下一条指令的逻辑地址=0 x240,段号:0,位移:0 x240 物理地址 = Base(0 x4000) + 0 x240 = 0 x4240 从0 x4240获取指令 “la $a0, varx” Move 0 x4050 $a0, Move PC+4 PC 下一条指令

12、的逻辑地址=0 x244,转换成物理地址=0 x4244,得到 “jal strlen”Move 0 x0248 $ra (return address!), Move 0 x0360 PC 跳转到strlen函数部分(还处于第0段,为什么?) Move 0 x0$v0,Move PC+4PC 下一条指令的逻辑地址=0 x364,转换成物理地址=0 x4364,得到 “lb $t0,($a0)”$a0 的逻辑地址=0 x4050,段号=1,位移=0 x50,物理地址=0 x4800+0 x50=0 x4850 Load Byte from 0 x4850 $t0, Move PC+4 PC,0

13、 x240main:la $a0, varx0 x244jal strlen 0 x360strlen:li $v0, 0 0 x364loop:lb $t0, ($a0)0 x368beq$r0,$t1, done 0 x4050varxdw0 x314159,段式存储管理小结,每个进程都有一份段表,段表的地址保存在段表寄存器当中,进程切换的时候要保存/恢复进程的段表。 存储共享 通过让两个进程的段表的某一段指向相同的基址,可以实现数据和代码的共享 存储保护 段内的位移不可以超出该段的限长 对于各段也应该设置相应的读写权限 代码段应该是只读段 数据段是读/写段 共享段可以是只读,也可以是读/

14、写 存在的问题 外部碎片问题 对换(swap)以段为单位,成本较大,无法进行粒度控制 分页机制可以解决上述问题,页式存储管理,将内存划分成固定大小的块(页框),逻辑地址也划分成相同大小的区(页面),于是也实现了将进程分散存储的目的。 x86/Pentium的页框大小为4KB 进程总是在装载最后一个页面时可能产生碎片,所以碎片大小不会超过一个页框,它属于内部碎片。,页式存储管理的地址转换和保护,逻辑地址的页面号从0开始,每个页面的页内位移范围为0至4K-1 (对x86CPU 32位地址而言)。 每个进程都要记录每个逻辑页面所对应的物理块号,我们称这些值列表为“页表”,同时设置一些标志位用于访问权

15、限:读、写、读/写、有效和无效。 物理地址 = 页框地址(页框号x页框长) + 页内位移 存储保护:检查页号是否越界(为什么不检查页内位移的越界了?),同时检查存取权限。,在一个分页存储管理系统中,逻辑地址长度为16位,页面大小为4KB,现一逻辑地址为0 x2F6A,且第0、1、2页依次存在物理块10、12、14号中,问相应的物理地址是多少? 解:页面大小=4KB 页内位移占12位,页号占4位 0 x2F6A = 0010 1111 0110 1010 页号=0010=2,其所对应的页框号=14 故最后的物理地址为: = 0 xEF6A,习题15.p387,分段与分页的区别,对页表的讨论,页表

16、就是一个页面号到页框号的索引,每个进程都有一个页表保存在内存里,所以导致每次访问一个指令或数据都要访问两次内存。为了解决这个问题,系统使用了一个高速缓冲区TLB缓存页表,称为“快表”。每次仅当在快表中无法找到相应页号时才去访问内存中的页表。 页表是要占用内存空间的,拿Windows 2000和x86为例,页框大小为4KB,逻辑地址空间为4GB,即由1M个页面组成,如果每个页表项占4B,那么一个进程将要占用4MB的连续内存存放页表,开销巨大。 把页框设大点,这样可以减少页表项,但增加了碎片,那设小点呢? 解决方法:对页表空间进行再分页,两级页表,将页表占用的那部分连续内存再分页,实现了页表的分散存储,为了找到页号,先要把该页号所在的页表页找到。于是形成了两级页表,第一级为页目录表(该部分连续),第二级为页表。 一个采用二级页表机制的地址格式如下:,逻辑地址:,1个页表最多被分成1K个页表页,1个页表页最多表示1K个页面,复习:页式存储管理,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号