《存储器管理》课件.ppt
《《存储器管理》课件.ppt》由会员分享,可在线阅读,更多相关《《存储器管理》课件.ppt(137页珍藏版)》请在三一办公上搜索。
1、1,第四章存储器管理,4.1 存储器的层次结构 4.2程序的装入和链接 4.3连续分配方式4.4基本分页存储管理方式4.5基本分段存储管理方式4.6虚拟存储器的基本概念4.7请求分页存储管理方式4.8页面置换算法4.9请求分段存储管理方式,2,4.1 存储器的层次结构,4.1.1 多级存储器结构1.存储器功能合理、安全、有效地保存数据2.存储器发展方向接口更新以硬盘为例:ESDI;IDE/EIDE;ATA;SATA/SATA2;SCSI;IEEE1394;USB高速性以USB为例:USB1.1是12Mbps,USB2.0是480Mbps,USB3.0理论上是5Gbps存储密度越来越高,体积越来
2、越小1.7Mb/平方英寸;20Mb/平方英寸;1.43Gb/平方英寸;135Gb/平方英寸;620Gb/平方英寸;1Tb/平方英寸,3,4,容量越来越大,价格越来越低以下是近年来关于硬盘价格的趣味数字1995年 200MB400MB 大于4000元/GB1996年 1.2GB2.1GB 1500元2000/GB1998年 1.2GB2.1GB 200元250元/GB2000年 4.3GB6.4GB 40元/GB2002年 10GB20GB 20元/GB2004年 40GB80GB 6.9元/GB2005年 80GB160GB 4.5元/GB2006年 80GB250GB 3.8元/GB2008
3、年 160GB1TB 1.6元/GB 2009年 500GB2TB 0.8元/GB 2010年 500GB2TB 0.6元/GB,5,3.存储器层次结构,6,4.存储管理功能存储分配与回收本章主要内容,讨论其算法和数据结构地址变换可执行文件生成中的链接技术;程序装入时的重定位技术;进程运行时的地址变换技术和机构(软件、硬件)存储共享和保护代码和数据共享;对地址空间的访问权限(读、写、执行)存储器扩充由用户应用程序控制:覆盖Overlay由OS控制:交换Swapping;请求调入和预调入On Demand&On Prefetch,7,4.1.2 主存储器与寄存器1主存储器主存储器(简称内存或主存
4、)是计算机系统中一个主要部件,用于保存进程运行时的程序和数据,也称可执行存储器,材质以DRAM为主。由于主存储器的访问速度远低于CPU执行指令的速度,为缓和这一矛盾,在计算机系统中引入了寄存器和高速缓存。,8,2寄存器寄存器访问速度最快,完全能与CPU协调工作,但价格却十分昂贵,因此容量不可能做得很大。寄存器的长度一般以字(word)为单位。寄存器的数目,对于当前的微机系统和大中型机,可能有几十个甚至上百个;而嵌入式计算机系统一般仅有几个到几十个。寄存器通常用于加速存储器的访问速度,如用寄存器存放操作数,或用作地址寄存器加快地址转换速度等。,9,4.1.3 高速缓存和磁盘缓存1高速缓存高速缓存
5、是现代计算机结构中的一个重要部件,其容量大于或远大于寄存器,而比内存约小两到三个数量级左右,从几十KB到几MB,访问速度快于主存储器。根据程序执行的局部性原理(即程序在执行时将呈现出局部性规律,在一较短的时间内,程序的执行仅局限于某个部分),将主存中一些经常访问的信息存放在高速缓存中,减少访问主存储器的次数,可大幅度提高程序执行速度。,10,2磁盘缓存由于目前磁盘的I/O速度远低于对主存的访问速度,因此将频繁使用的一部分磁盘数据和信息,暂时存放在磁盘缓存中,可减少访问磁盘的次数。,11,4.2程序的装入和链接,在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序
6、和数据装入内存。如何将一个用户源程序变为一个可在内存中执行的程序,通常都要经过以下几个步骤:首先是要编译,由编译程序(Compiler)将用户源代码编译成若干个目标模块(Object Module);其次是链接,由链接程序(Linker)将编译后形成的一组目标模块,以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module);最后是装入,由装入程序(Loader)将装入模块装入内存。图4-2示出了这样的三步过程。本节将扼要阐述程序(含数据)的链接和装入过程。,12,图4-2对用户程序的处理步骤,编译Compile,若干目标模块.OBJ,源程序.C,链接Link,库函数Li
7、b,装入模块.EXE,装入Load,CPU,13,程序的链接链接:若干目标模块+库函数 可装入模块根据链接时间的不同,可把链接分成如下三种:(1)静态链接。在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块,以后不再拆开。我们把这种事先进行链接的方式称为静态链接方式。(2)装入时动态链接。这是指将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。(3)运行时动态链接。这是指对某些目标模块的链接,是在程序执行中需要该(目标)模块时,才对它进行的链接。,14,1静态链接方式(Static Linking)在生成可装入模块时(也就是在程序装入运行
8、前)完成的链接。见图4-4特点:一次链接,n次运行得到完整的可装入模块,不可再拆不灵活:不管有用与否的模块都将链接到装入模块,同时导致内存利用率较低不利于模块的修改和升级,15,16,2装入时动态链接(Load-time Dynamic Linking)用户源程序经编译后所得的目标模块,是在装入内存时边装入边链接的,即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存,还要按照图4-4所示的方式来修改目标模块中的相对地址。,17,3运行时动态链接(Run-time Dynamic Linking)装入时动态链接是将所有可能要运行到的模块都全
9、部链接在一起并装入内存,显然这是低效的,因为往往会有些目标模块根本就不运行。比较典型的例子是作为错误处理用的目标模块,如果程序在整个运行过程中都不出现错误,则显然就不会用到该模块。运行时动态链接方式是对装入时链接方式的一种改进。这种链接方式是将对某些模块的链接推迟到程序执行时才进行链接,亦即,在程序执行过程中,当发现一个被调用模块尚未装入内存时,才立即由OS去找到该模块并将之装入内存,把它链接到调用者模块上。凡在本次执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间。,18,4动态链接方式的优点便于共享多个进程可共用一个D
10、LL模块,节省了内存。为部分装入提供了条件(运行时动态链接)一个进程可由若干DLL模块构成,按需装入。便于模块的修改和升级只要被修改模块的接口不变,则该模块的修改不会引发其它模块的重新编译。改善了程序的可移植性可面向不同的应用环境开发同一功能模块的不同版本,根据当前的环境载入匹配的模块版本。,19,5动态链接方式的缺点增加了程序执行时的链接开销。(每次运行都需链接)模块数量众多,增加了模块的管理开销。,20,程序的装入装入:可装入模块(.EXE)内存进程1绝对装入方式(Absolute Loading Mode)在编译后、装入前已产生了绝对地址(内存地址),装入时不再作地址重定位,即:装入内存
11、前的虚拟地址=装入内存后的物理地址。绝对地址的产生:(1)由编译器完成;(2)由程序员编程完成。优点:装入过程简单,无需地址映射。缺点:不适于多道程序系统;过于依赖硬件结构;不易修改、不灵活。,21,2可重定位装入方式(Relocation Loading Mode)可装入模块在被装入到内存中时,由装入程序来完成程序虚拟地址 内存物理地址的变换,22,如果不进行地址变换,那么这条指令将无法取到正确的数值“365”,所以该指令中的地址应该重定位为:LOAD 1,12500,静态地址重定位:指令或数据的内存地址MA=该指令或数据的虚拟地址VA+该程序在内存中的首地址BA,23,可重定位装入的优缺点
12、:优点:适用于多道程序系统,提高了内存利用率;由于地址映射规则简单,故在地址变换过程中无需硬件变换机构的支持。缺点:任何进程都要求连续的内存空间;必须将全部模块都装入且装入后不能再移动位置(因为无法实现动态重定位);不支持虚拟存储器技术;不易实现共享。,24,3动态运行时装入方式(Dynamic Run-time Loading)出于实际情况,程序在运行过程中的内存位置可能经常要改变,此时就应采用动态运行时装入的方式。程序装入内存后并不立即进行地址变换,而是等到真正要执行时才由硬件地址变换机构来完成地址变换,从而得到内存物理地址。,25,动态地址重定位:指令或数据的内存地址MA=该指令或数据的
13、虚拟地址VA+重定位基址寄存器BR,26,动态运行时装入的优缺点:优点OS可将一个进程的不同部分分散存放在不连续的内存空间;可移动进程在内存中的位置(由重定位基址寄存器反映移动情况);提供了实现虚拟存储器技术的基础(可实现部分模块装入);有利于实现模块共享。缺点动态重定位需要硬件变换机构的支持;实现较复杂。,27,4.3连续分配方式,连续分配方式是指一个进程在内存中必须占用连续的存储空间。典型的连续分配方式主要有:单一连续分配、固定分区分配、动态分区分配、动态重定位分区分配等。单一连续分配把内存分为系统区和用户区两部分,系统区仅提供给OS使用;用户区是指除系统区以外的全部内存空间,提供给用户使
14、用。优点:简单,易于管理缺点:只能用于单用户单任务OS;内存利用率低,毫无共享性可言。早已淘汰。,28,引入:分区存储管理原理将内存分为一些大小相等或不等的分区(Partition),每个进程可占用一个分区。适于多道程序系统,支持多个进程并发执行。出现了碎片问题内碎片:被占用分区的尾部未被利用的空间。外碎片:在两个被占用分区之间的难以利用的小空闲分区。分区管理的数据结构:分区表或分区链表。内存紧凑(Compaction):将各个已占用分区向内存某端移动,从而使分散的各个小空闲分区能相邻,进而合并为一个稍大的空闲分区。,29,固定分区分配1把内存划分为若干个固定大小的分区,分区的总数以及各个分区
15、的大小都是恒定值。各分区大小相等不灵活;对于小进程而言,内存利用率低,内碎片严重;对于大进程而言,分区大小可能无法满足需要,导致无法装入。各分区大小不等小分区、中等分区、大分区。适应性较强,可以有效提高内存利用率。,30,2固定分区的内存分配为了便于内存分配,通常将分区按大小进行排队,并为之建立一张分区使用表,其中各表项包括每个分区的起始地址、大小及状态(是否已分配),见图4-5(a)所示。当有一用户程序要装入时,由内存分配程序检索该表,从中找出一个能满足要求的、尚未分配的分区,将之分配给该程序,然后将该表项中的状态置为“已分配”;若未找到大小足够的分区,则拒绝为该用户程序分配内存。存储空间分
16、配情况如图4-5(b)所示。,31,32,3固定分区分配的优缺点优点由于各分区大小固定,故易于实现,管理开销小。缺点内碎片的问题不可避免,较大程序不易装入,故内存利用率较低;分区数目固定也限制了进程的并发度。,33,动态分区分配在动态分区分配方式中,各个分区的大小会在OS的管理下发生改变,分区总数也会相应地发生变化。1分区分配中的数据结构(1)空闲分区表:记录所有空闲分区情况的二维表,34,(2)空闲分区链:将所有的空闲分区链接成一个双向链,如图4-6所示。,图4-6空闲链结构,35,2分区分配算法1)首次适应FF算法(First Fit)空闲分区链以地址递增的次序链接。在每次分配时,都从链首
17、开始顺序查找,直至找到第一个大小能满足要求的空闲分区为止;然后再按照程序的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。特点:简单;高址内存可保留较大的空闲分区;但低址内存会产生很多碎片分区;查找开销大。,36,2)循环首次适应NF算法(Next Fit)该算法是由首次适应FF算法演变而成的:分配空间不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,如果达到链尾则回到链首继续。特点:查找开销小;空闲分区分布更均匀;但较大分区难以保留。,37,3)最佳适应BF算法(
18、Best Fit)空闲分区链表以容量递增为序组织,每次分配时从链首查找,将第一个满足空间要求的分区分配出去。特点:最接近按需分配原则;较大的分区容易保留;但会产生很多难以利用的小碎片分区。4)最坏适应WF算法(Worst Fit)空闲分区链表以容量递减为序组织,每次分配时从链首查找,将第一个满足空间要求的分区分配出去。特点:小碎片分区的问题得到了有效的解决;但大分区也不易保留。最坏适应算法与前面所述的首次适应、循环首次适应、最佳适应算法一起,统称为顺序搜索法。,38,5)快速适应QF算法(Quick Fit)该算法又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所
19、有空闲分区,单独设立一个空闲分区链表,这样,系统中存在多个空闲分区链表,同时在内存中设立一张管理索引表,该表的每一个表项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。空闲分区的分类是根据进程常用的空间大小进行划分。优点:查找效率高;不会对任何分区产生分割,所以能保留大的分区;也不会产生内存碎片。缺点:分区归还主存的算法复杂,系统开销较大;多样化的链表造成管理开销大。,39,3分区分配操作1)分配内存系统应利用某种分配算法,从空闲分区链(表)中找到所需大小的分区。设请求的分区大小为u.size,表中每个空闲分区的大小可表示为m.size。若m.size-u.sizesize(si
20、ze是事先规定的不再切割的剩余分区的大小),说明多余部分太小,可不再切割,将整个分区分配给请求者;否则(即多余部分超过size),从该分区中按请求的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区链(表)中。然后,将分配区的首址返回给调用者。图4-7示出了分配流程。,40,41,2)回收内存(1)回收区与插入点的前一个空闲分区F1相邻接,见图4-8(a)。此时应将回收区与插入点的前一分区合并,不必为回收分区分配新表项,而只需修改其前一分区F1的大小。(2)回收分区与插入点的后一空闲分区F2相邻接,见图4-8(b)。此时也可将两分区合并,也不必分配新表项,用回收区的首址作为新空闲区的首址
21、,大小为两者之和。(3)回收区同时与插入点的前、后两个分区邻接,见图4-8(c)。此时将三个分区合并,使用F1的表项,F1的首址不变,F1的大小为三者之和,删除F2的表项。(4)回收区既不与F1邻接,又不与F2邻接,见图4-8(d)。这时应为回收区单独建立一新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。,42,合并,改F1大小,合并,改F1大小和首址,合并,改F1大小,删除F2表项,建立一新表项,43,例:假设最佳适应法,如果改为首次适应算法?,44,伙伴系统(自学内容)固定分区和动态分区方式都有不足之处。固定分区方式限制了活动进程的数目,当进程大小与空闲分区大小不匹配
22、时,内存空间利用率很低。动态分区方式算法复杂,回收空闲分区时需要进行分区合并等,系统开销较大。伙伴系统方式是对以上两种内存方式的一种折衷方案。伙伴系统规定,无论已分配分区或空闲分区,其大小均为2的k次幂,k为整数,lkm,其中:21表示分配的最小分区的大小,2m表示分配的最大分区的大小,通常2m是整个可分配内存的大小。,45,假设系统的可利用空间容量为2m个字,则系统开始运行时,整个内存区是一个大小为2m的空闲分区。在系统运行过程中,由于不断的划分,可能会形成若干个不连续的空闲分区,将这些空闲分区根据分区的大小进行分类,对于每一类具有相同大小的所有空闲分区,单独设立一个空闲分区双向链表。这样,
23、不同大小的空闲分区形成了k(0km)个空闲分区链表。,46,当需要为进程分配一个长度为n的存储空间时,首先计算一个i值,使2i-1n2i,然后在空闲分区大小为2i的空闲分区链表中查找。若找到,即把该空闲分区分配给进程。否则,表明长度为2i的空闲分区已经耗尽,则在分区大小为2i+1的空闲分区链表中寻找。若存在2i+1的一个空闲分区,则把该空闲分区分为相等的两个分区,这两个分区称为一对伙伴,其中的一个分区用于分配,而把另一个加入分区大小为2i的空闲分区链表中。若大小为2i+1的空闲分区也不存在,则需要查找大小为2i+2的空闲分区,若找到则对其进行两次分割:第一次,将其分割为大小为2i+1的两个分区
24、,一个用于分配,一个加入到大小为2i+1的空闲分区链表中;第二次,将第一次用于分配的空闲区分割为2i的两个分区,一个用于分配,一个加入到大小为2i的空闲分区链表中。若仍然找不到,则继续查找大小为2i+3的空闲分区,以此类推。由此可见,在最坏的情况下,可能需要对2k的空闲分区进行k次分割才能得到所需分区。,47,与一次分配可能要进行多次分割一样,一次回收也可能要进行多次合并,如回收大小为2i的空闲分区时,若事先已存在2i的空闲分区时,则应将其与伙伴分区合并为大小为2i+1的空闲分区,若事先已存在2i+1的空闲分区时,又应继续与其伙伴分区合并为大小为2i+2的空闲分区,依此类推。在伙伴系统中,其分
25、配和回收的时间性能取决于查找空闲分区的位置和分割、合并空闲分区所花费的时间。与前面所述的多种方法相比较,由于该算法在回收空闲分区时,需要对空闲分区进行合并,所以其时间性能比前面所述的分类搜索算法差,但比顺序搜索算法好,而其空间性能则远优于前面所述的分类搜索法,比顺序搜索法略差。,48,4.3.5 哈希算法哈希算法就是利用哈希快速查找的优点,以及空闲分区在可利用空间表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。当进行空闲分区分配时,根据所需空闲分区大小,通过哈希函数计算,即得到在哈希表中的位置,从中得到相应的空闲分区链
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储器管理 存储器 管理 课件

链接地址:https://www.31ppt.com/p-5021957.html