第二章存储管理1第二章存储管理2.1存储管理基础2.2基本存储管理方法2.3可变分区存储管理方法2.4内存扩充技术2.5纯分页的存储管理2.6请求分页系统2.7段式存储管理2.8段页式存储管理2.9Linux存储管理第二章存储管理2存储器可分为:内存储器和外存储器;内存储器:可以被CPU直接访问。外存储器:不可以被CPU直接访问,外存与CPU之间只能够在输入输出控制系统的管理下,进行信息交换。第二章存储管理32.1存储管理基础库链接程序装入模块装入程序编译程序产生的目标模块第一步第二步第三步内存…2.1.1虚拟地址与物理地址第二章存储管理4内存储器是由一个个存储单元组成,一个存储单元可存放若干个二进制的位(bit),8个二进制位被称为一个字节(Byte)。内存中的存储单元按一定顺序进行编号,每个单元所对应的编号,称为该单元的单元地址。物理地址(绝对地址,实地址):内存中存储单元的地址。物理地址可直接寻址。逻辑地址(相对地址,虚地址):用户的程序经过汇编或编译后形成目标代码,目标代码通常采用相对地址的形式。其首地址为0,其余指令中的地址都相对于首地址来编址。不能用逻辑地址在内存中读取信息。第二章存储管理5第二章存储管理6地址重定位•地址重定位(地址映射):将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。•当程序装入内存时,操作系统要为该程序分配一个合适的内存空间,由于程序的逻辑地址与分配到内存物理地址不一致,而CPU执行指令时,是按物理地址进行的,所以要进行地址转换。第二章存储管理72.1.2地址定位方式1.固定定位方式由程序员在编写程序时或由编译连接程序对源程序进行编译连接时,直接指定程序在执行时访问的实际存储器地址的方式称为固定定位方式。此种定位方式一般只适合于单板机或单用户系统。在多道程序环境下,应保证各个作业的地址互不重叠,这就比较困难了。第二章存储管理8第二章存储管理92.静态重定位方式源程序经编译和连接后生成目标代码中的地址是以0为起始地址的相对地址。当需要执行时,由装入程序运行重定位程序模块,根据作业在本次分配到的内存起始地址,将可执行目标代码装到指定内存地址中,并修改所有有关地址部分的值。修改的方式是对每一个逻辑地址的值加上内存区首地址(或称基地址)值。第二章存储管理10第二章存储管理11静态重定位的特点(1)静态重定位是在程序运行之前完成地址重定位工作的;(2)静态重定位由软件实现,无须硬件提供支持;(3)实行静态重定位时,地址重定位工作是在程序装入时被一次集中完成的;(4)绝对地址空间里的目标程序与原相对地址空间里的目标程序面目已不相同,因为前者进行了地址调整;(5)实施静态重定位后,若用户程序在内存中做了移动,那么程序指令中的地址就不再反映所在的存储位置了,除非重新进行地址重定位。第二章存储管理123.动态重定位方式采用动态重定位方式,将程序在装入内存时,不必修改程序的逻辑地址值,程序执行期间在访问内存之前,再实时地将逻辑地址变换成物理地址。动态重定位要靠硬件地址变换机构实现。①当程序开始执行时,系统将程序在内存的起始地址送入地址变换机构中的基地址寄存器BR中。②在执行指令时,若涉及到逻辑地址,则先将该地址送入虚拟地址寄存器VR,再将BR和VR中的值相加后送入地址寄存器MR,并按MR中的值访问内存。(MR)=(BR)+(VR)第二章存储管理13第二章存储管理142.2基本存储管理方法2.2.1单一连续分区存储管理基本思想:内存分为两个区域:系统区,用户区。应用程序装入到用户区,可使用用户区全部空间。最简单,适用于单用户、单任务的OS;单用户系统在一段时间内,只有一个进程在内存。第二章存储管理15特点(1)系统总是把整个用户区分配给一个用户使用。(2)实际上,内存用户区又被分为“使用区”和“空闲区”两部分。在操作系统中,把分配给用户、但又未使用的区域称为“内部碎片”。(3)由于任何时刻内存的用户区中只有一个作业运行,因此这种系统只使用于单用户的情况。(4)进入内存的作业,独享系统中的所有资源,包括内存中的整个用户区。第二章存储管理16特点(5)由于整个用户区都分配给了一个用户使用,因此作业进入用户区后,没有移动的必要。采用这种存储分配策略时,将对用户程序实行静态重定位。(6)实行静态重定位,并不能阻止用户有意无意地通过不恰当地指令闯入操作系统所占用的存储区域,如何阻止对操作系统的侵扰,就是所谓的“存储保护”问题。用于存储保护的专用寄存器-“界限寄存器”第二章存储管理17存储保护过程:在用户态下,对内存的每一次访问,都要在硬件的控制下,与界限寄存器中的内容进行比较。一旦发现该访问的地址小于界限寄存器中的地址,就会产生“地址越界”中断,阻止这次访问的进行。•优点:易于管理,便于用户的了解和使用。•缺点:–由于每次只能有一个作业进入内存,故它不适用于多道程序设计,整个系统的工作效率不高,资源利用率底下。–只要作业比用户区小,那么在用户区里就会形成碎片,造成内存储器资源的浪费。–若用户作业的相对地址空间比用户区大,那么该作业就无法运行。第二章存储管理182.2.2固定分区存储管理•把内存区固定地划分为若干个大小相等(和不等)的连续分区。每个分区装一个且只能装一个作业,分区的划分原则一般由系统操作员或操作系统决定,分区一旦划分结束,在整个执行过程中每个分区的长度和内存的总分区个数将保持不变。•分区大小相等:只适合于多个相同程序的并发执行(处理多个类型相同的对象)。•分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。第二章存储管理198M8M8M8M8MOperatingSystemOperatingSystem8M12M8M8M6M4M2M固定分区(大小相同)固定分区(多种大小)第二章存储管理20内存分配为了便于内存分配,通常将分区按大小进行排队,并为之建立一张分区说明表,其中各表项包括每个分区的起始地址、大小及状态(是否已分配)。当有一用户程序要装入时,由内存分配程序检索该表,从中找出一个能满足要求的、尚未分配的分区,将之分配给该应用程序,然后将该表项中的状态置为“已分配”;若未找到大小足够的分区,则拒绝为该用户程序分配内存。第二章存储管理21第二章存储管理22地址重定位与存储保护•固定分区存储管理中,每个分区只允许装入一个作业,作业在运行期间没有必要移动自己的位置,因此,应该对程序实行静态重定位。•在固定分区存储管理中,不仅要防止用户程序对操作系统形成的侵扰,也要防止用户程序与用户程序之间形成侵扰。因此必须在CPU中设置一对专用的寄存器,用于存储保护。将两个专用寄存器分别起名为“下界寄存器”和“上界寄存器”第二章存储管理23存储保护过程•当进程调度程序调度某个作业进程运行时,就把该作业所在分区的低边界地址装入到低界限寄存器,高边界地址装入到高界限寄存器。作业运行时,对内存的每一次访问,都要在硬件的控制下,与两个界限寄存器中的内容进行比较。一旦发现该访问的地址小于界限寄存器中的地址,就会产生“地址越界”中断,阻止这次访问的进行。第二章存储管理24固定分区存储管理的特点(1)它是最简单的、具有“多道”色彩的存储管理方案。(2)当把一个分区分配给某个作业时,该作业的程序将一次性的全部被装入到分配给它的连续分区里。第二章存储管理25•优点:易于实现,开销小。•缺点:–内碎片造成浪费(小作业不能有效地利用分区空间。–分区总数在系统生成时确定(固定),限制了并发执行的程序数目。–如果到达作业的尺寸比任何一个分区的长度都大,那么它就无法得到运行。固定分区方式的评价第二章存储管理262.3可变分区存储管理•基本思想:内存不是预先划分好的,而是当作业装入时,根据作业的需求和内存空间的使用情况来决定是否分配。–若有足够的空间,则按需要分割一部分分区给该进程–否则令其等待主存空间•优点:没有内碎片。•缺点:有外碎片。第二章存储管理27外部碎片问题操作系统20KB0256KB作业A(16KB)空闲区(236KB)空闲区(220KB)作业B(100KB)空闲区(120KB)作业C(70KB)空闲区(50KB)空闲区(100KB)作业D(75KB)空闲区(25KB)内碎片:占用分区之内未被利用的空间外碎片:占用分区之间难以利用的空闲分区(通常是小空闲分区)。第二章存储管理282.3.1空闲存储区表管理空闲内存区的数据结构可采用链接法和连续线性表格法。下面举一个连续线性表格管理空闲内存的方法,如采用链接法,就需要在表项中增加一个指向下一个空闲区的指针。每一个空闲分区用一个map结构管理:structmap{unsignedm_size;//空闲分区的长度char*m_addr;//空闲分区的起始地址};structmapcoremap[N];各个空闲分区按起始地址由低到高顺次登记在空闲存储区表中,m_size为0的表项是空白表项,它们集中在表的后部第二章存储管理29在系统初始阶段,拥有一块很大的内存空白区,这时空闲存储区表coremap中只需有一项登记该空闲区。其余的coremap表项为空白项,即m_size皆为零。第二章存储管理30以后随着很多作业的不断申请内存和释放内存,整个存储空间将出现许多大小不等的区域,存储区表和实际的内存空间就可能变成如图所示的情况。第二章存储管理312.3.2首次适应算法1.分配算法。采用首次适应法为作业分配大小为size的内存空间时,总是从表的起始端的低地址部分开始查找。当第一次找到大于或等于申请大小的空闲区时,就按所需大小分配给作业。如果分配后原空闲区还有剩余空间,就修改原存储区表项的m_size和m_addr,使它记录余下的“零头”。如果作业所需空间正好等于该空闲区大小,那么该空闲区表项的m_size就成为0。接下来要删除表中这个“空洞”,即将随后的各非零表项依次上移一个位置第二章存储管理32char*malloc(mp,size)structmap*mp;unsignedsize;{registerchar*a;registerstructmap*bp;for(bp=mp;bp-m_size;bp++){if(bp-m_size=size){a=bp-m_addr;bp-m_addr+=size;if((bp-m_size-=size)==0)do{bp++;(bp-1)-m_addr=bp-m_addr;}while((bp-1)-m_size=bp-m_size);return(a);}}return(0);}第二章存储管理332.回收算法当某一作业释放以前所分配到的内存时,就要将该内存区归还给系统,使其成为空闲区而可被其他作业使用。释放区与原空闲区相邻情况可归纳为如图所示的4种情况。第二章存储管理34①仅与前空闲区相连:合并前空闲区和释放区构成一块大的新空闲区,并修改空闲区表项。该空闲区的m_addr不变,仍为原前空闲区的首地址,修改表项的长度域m_size为原m_size与释放区长度之和。②与前空闲区和后空闲区都相连:将三块空闲区合并成一块空闲区。修改空闲区表中前空闲区表项,其起始地址m_addr仍为原前空闲区起始地址,其大小m_size等于三个空闲区长度之和,这块大的空闲区由前空闲区表项登记。接下来还要在空闲区表中删除后项,方法是将后项以下的非空白表项顺次上移一个位置。第二章存储管理35③仅与后空闲区相连:与后空闲区合并,使后空闲区表项的m_addr为释放区的起始地址,m_size为释放区与后空闲区的长度之和。④与前、后空闲区皆不相连:在前、后空闲区表项中间插入一个新的表项,其m_addr为释放区的起始地址,m_size为释放区的长度。为此,先要将后项及以下表项都下移一个位置第二章存储管理36若采用首次适应法,则其分配算法简单且合并相邻空闲区也很容易。该算法的实质是尽可能利用存储区低地址部分的空闲区,而尽量在高地址部分保存较大的空闲区,以便一旦有分配大的空闲区