操作系统教程-Linux实例分析孟庆昌第4章存储器管理.ppt
《操作系统教程-Linux实例分析孟庆昌第4章存储器管理.ppt》由会员分享,可在线阅读,更多相关《操作系统教程-Linux实例分析孟庆昌第4章存储器管理.ppt(176页珍藏版)》请在三一办公上搜索。
1、第4章 存储器管理,4.1 引言 4.2 基本的内存管理技术 4.3 对换技术 4.4 分页技术 4.5 分段技术 4.6 虚拟存储器 4.7 请求分页技术,4.8 页面置换算法 4.9 内存块分配算法和抖动问题 4.10 段式虚拟存储器 4.11 段页式结合系统 4.12 Linux系统的存储管理 习题,4.1 引 言,内存(Main Memory或Primary Memory或Real Memory)也称主存,是指CPU能直接存取指令和数据的存储器。磁盘、磁鼓和磁带等存储器,一般称为外存或辅存(Secondary Storage)。内存是现代计算机系统进行操作的中心,如图4-1所示,CPU
2、和I/O系统都要和内存打交道。,图4-1 内存在计算机系统中的地位,4.1.1 用户程序的主要处理阶段 我们用高级语言编程解决某个特定的任务时,通常先对它进行数学抽象,确定相应的数据结构和算法,然后用高级程序设计语言(如PASCAL、C语言等)或者汇编语言进行程序设计。这种用高级语言或汇编语言编写的程序就称为源程序。从用户的源程序进入系统到相应程序在机器上运行,要经历一系列步骤,主要处理阶段有:编辑、编译、连接、装入和运行。如图4-2所示。,图4-2 用户程序的主要处理阶段,1.编辑阶段 用户键入编辑命令,如vi,进入编辑方式。在编辑方式下用户将所编写的源程序输入到机器内,存放在相应的文件(如
3、filel.c)中。这种存放源程序的文件叫做源文件。2.编译阶段 源程序并不能直接在机器上运行,因为CPU不能识别源程序,它仅仅认识由规定范围内的一系列二进制代码所组成的指令和数据,并按预定含义执行一系列动作。,3.连接阶段 用户程序可以分别进行编译,从而得到不同的目标模块。而且用户程序中往往要调用系统库程序和应用程序,这些程序是预先就编译好的。这些目标代码不能简单地合并在一起,因为各自分配的内存地址可能有冲突,并且调用者还不知道被调用模块放在什么地方,仅知道它的符号名称。,4.装入阶段 程序必须装到内存才能运行。这就需要装入程序根据内存的使用情况和分配策略,将上述装入模块放入分到的内存区中。
4、,5.运行阶段 为了运行装入内存中的程序,需要键入运行命令。在UNIX/Linux环境中,可直接键入可执行文件的名称。此时,终端进程创建一个子进程。当这个进程被调度程序选中后,CPU就去执行该进程的可执行代码。就是说,该用户程序被执行了。,4.1.2 重定位 由于内存地址是从统一的一个基址0开始按序编号的,就像是一个大数组那样,因此,内存空间是一维的线性空间。用户程序和数据装入内存时,需要进行重定位。例如,图4-3表示程序A装入内存前后的情况。在地址空间100号单元处有一条指令“LOAD 1,500”,它实现把500号单元中的数据12345装到寄存器1中去。,图4-3 程序装入内存时的情况,1
5、.静态重定位 静态重定位是在目标程序装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址都改成实际的内存地址。对每个程序来说,这种地址变换只是在装入时一次完成,在程序运行期间不再进行重定位。按照静态重定位方式,图4-3所示的程序A装入内存时的情况就变成如图4-4所示的样子。,图4-4 静态重定位示意图,它的主要缺点是:(1)程序的存储空间只能是连续的一片区域,而且在重定位之后就不能再移动。这不利于内存空间的有效使用。(2)各个用户进程很难共享内存中的同一程序的副本。,2.动态重定位 动态重定位是在程序执行期间每次访问内存之前进行重定位。这种变换是靠硬件地址变换机构实
6、现的。通常采用一个重定位寄存器,其中放有当前正在执行的程序在内存空间中的起始地址,而地址空间中的代码在装入过程中不发生变化。动态重定位的过程如图4-5所示。,图4-5 动态重定位示意图,如果用(BR)表示重定位寄存器中的内容,用addr表示操作对象的相对地址,则操作对象的绝对地址就是(BR)+addr的值。动态重定位的主要优点是:(1)程序占用的内存空间动态可变,不必连续存放在一处。(2)比较容易实现几个进程对同一程序副本的共享使用。,4.2 基本的内存管理技术,内存的一部分是固定分配给操作系统的,可以位于内存最低端的RAM(随机存取存储器)中,如图4-6(a)所示;也可位于内存最高端的ROM
7、(只读存储器)中,如图4-6(b)所示;还可以让设备驱动程序位于内存高端的ROM中,而让操作系统的其他部分位于低端的RAM中,如图4-6(c)中所示。,图4-6 单一连续分配,4.2.2 分区法 分区分配是为支持多道程序开发、运行的一种最简单的存储管理方式。在这种方式下,要把内存划分成若干分区,每个分区里容纳一个作业。按照分区的划分方式,可归纳为两种常见的分配方法:固定分区法和可变分区法。,图4-7 固定分区,1.固定分区法“固定”包含两个意思:一个是内存中分区的个数固定,不能随机变动;另一个是各分区的大小固定。当然各个分区的大小可以不同。但是,一旦在系统启动时把内存的分区划分好,以后在使用过
8、程中就不能更改了。所以,固定分区法是对内存的静态划分。固定分区的管理方法如图4-7所示。,图4-8 分区说明表,2.可变分区法 由于用户作业大小不可能预先规定好,作业到来的分布也无法确定,所以分区的大小不会总与作业大小相符。为了解决内存浪费问题,可以把分区大小改成可变的,就是说,各个分区是在相应作业处理过程中建立的,使其大小恰好适应作业的大小。这种技术称为可变分区法。IBM的OS/360 MVT(具有可变任务数的多道程序设计)操作系统就是采用这种技术:操作系统掌管一个表格,登记每个空闲区和已分配区,指出其大小、位置和对各个区的存取限制等。图4-9表示了MVT的内存分配和作业调度示例。,图4-9
9、 MVT的内存分配和作业调度(a)内存初始情况和作业队列;(b)内存分配和作业调度,图4-9 MVT的内存分配和作业调度(a)内存初始情况和作业队列;(b)内存分配和作业调度,1)最先适应算法 最先适应算法也称为首次适配算法。在这种算法中,空闲表是按位置排列的(即空闲块地址小的,在表中的序号也小)。2)循环适应算法 循环适应算法也称作下次适配算法。它是对最先适应算法的修改:当每次找到合适的空闲块时,就同时记下当时的位置,下次查找空闭块时就从下一个空闲分区开始查找,而不是每次都从头开始查找。,3)最佳适应算法 最佳适应算法是在满足需要的前提下分配最小的那块。这种算法的空闲表是以空闲块的大小为序、
10、按增量形式排列的,即小块在前,大块在后。这种算法的优点是:产生的剩余块是最小的,平均而言,只要查一半空闲表就能找到最佳适应的空闲块。但是其缺点是:不便于释放内存时与邻接区的合并,而且分割后所剩余的空闲区往往很小,几乎无法使用。,4)最坏适应算法 最坏适应算法是最佳适应算法的“逆”,即空闲表是以空闲块的大小为序,但大块在前、小块在后。,3.硬件支持 采用分区技术需要有硬件保护机构。通常用一对寄存器分别表示用户程序在内存中的上界地址值和下界地址值,如图4-10所示。,图4-10 分区的硬件保护,这一对寄存器也可用另一种方式设置值,一个表示用户程序的最小物理地址,称为基址寄存器;另一个表示用户程序逻
11、辑地址的范围,称为限长寄存器。虽然这两种方式都用一对寄存器进行保护,但两者的重定位方式是不同的。前者采用静态重定位,在汇编或装入时进行,程序中的每个有效地址必须大于或等于下界值而小于上界值。而后者需采用动态重定位,每个有效地址必须小于限长寄存器值,而相应物理地址是有效地址加上基址寄存器的值,如图4-11所示。CDC 6600及其以后的机器都用这种方式。,图4-11 基址/限长寄存器的使用,4.分区分配的优点和缺点 总体来说,分区分配的优点主要是:有利于多道程序设计;所需硬件支持很少;管理算法简单,易于实现。但分区分配也存在很多缺点,主要有:碎片问题严重,有些作业序列可能使内存的利用率低于10%
12、;不利于大作业运行,当空闲块只有一个,但装不下后面的作业时,内存仍造成浪费;为容纳多个作业,需要的内存容量更大;已被占用的分区中可能包括从未使用过的信息,且作业分区大小受到内存总量的限制。,虽然可变分区比固定分区的内存利用率要高一些,但是二者都存在碎片问题。怎样使这些分散的、较小的空闲区得到合理使用呢?最简单的办法是定时或在分配内存时把所有的碎片合并为一个连续区,如图4-12所示。,图4-12 可重定位分区的紧缩(a)初始状态;(b)移动之后;(c)分配作业5之后,图4-13“占两头、空中间”的分区方式,4.3 对 换 技 术,4.3.1 早期对换技术 对换技术是在早期分时系统中(如CTSS和
13、Q-32)采用的基本内存管理方式。它的实现思想是:除操作系统空间之外剩余的全部内存都分给当前正在执行的用户进程使用,当调度转向下一个用户进程时,当前进程内存区中的内容要写到外存(如磁盘)中去,被选中用户进程的信息读到内存中来,如图4-14所示。,图4-14 利用磁盘对换两个进程,4.3.2 多道程序环境下的对换 图4-15示出多道程序环境下对换系统的工作情况。最初只有进程A在内存,随后创建进程B和C(或者二者从盘上换入内存)。在图4-15(d)中A换出。然后,D换入,B完成,最后A再次换入。由于A现在的位置不同于先前,因此必须重定位或者在换入时由软件完成,或者在程序执行时由硬件实现(这是常用方
14、式)。,图4-15 进程对换时内存分配情况,4.4 分 页 技 术,4.4.1 分页存储管理的基本概念 分页存储管理的基本方法是:(1)逻辑空间分页:将一个进程的逻辑地址空间划分成若干个大小相等的部分,每一部分称为页面或页。每页都有一个编号,叫做页号,页号从0开始依次编排,如0,1,2,。,(2)内存空间分块:把内存也划分成与页面相同大小的若干个存储块,称为内存块或页框。(3)逻辑地址表示:在分页存储管理方式中,表示地址的结构如图4-16所示。,图4-16 分页技术的地址结构,31 12 11 0,它由两个部分组成:前一部分表示该地址所在页面的页号p;后一部分表示页内位移d,即页内地址。图4-
15、16中所示两部分构成的地址长度为32位。其中011为页内地址,即每页的大小为4 KB;1231位为页号,表示地址空间中最多可容纳1 MB个页面。,对于特定机器来说,其地址结构是一定的。如果给定的逻辑地址是A,页面的大小为L,则页号p和页内地址d可按下式求得:p=INTA/L d=A MOD L,(4)内存分配原则:在分页情况下,系统以块为单位把内存分给进程,并且一个进程的若干页可分别装入物理上不相邻的内存块中。进程的每个页面对应一个内存块,如图4-17所示。,图4-17 分页存储管理系统,(5)页表:在分页系统中允许将进程的各页面离散地装入内存的任何空闲块中,这样一来就出现进程的页号连续、而块
16、号不连续的情况。怎样找到每个页面在内存中对应的物理块呢?为此,系统又为每个进程设立一张页面映像表,简称页表。如图4-17中所示。从图4-17中的页表可知,页号3对应内存的10#块。(6)内存块表:操作系统管理整个内存,它必须知道物理存储的情况,即哪些块已经分出去了,哪些块还是空闲的,总共有多少块,等等。,4.4.2 分页系统中的地址映射 通常,页表都放在内存中。当进程要访问某个逻辑地址中的数据时,分页地址映像硬件自动按页面大小将CPU得到的有效地址(相对地址)分成两部分:页号和页内地址(p,d)。如图4-16所示。分页系统的地址转换机构如图4-18所示。,图4-18 分页中的地址转换过程,4.
17、4.3 快表和页表构造 1.快表 在内存中放置页表也带来存取速度下降的矛盾。因为存取一个数据(或一条指令)至少要访问两次内存:一次是访问页表,确定存取对象的物理地址;另一次是根据这个物理地址存取数据(或指令)。,解决这个问题的常用办法是使用专用的、高速小容量的联想存储器(TLB,Translation Lookaside Buffer),每个联想存储器包括两个部分:键号和值,键号是当前进程正在使用的某个页面号,值是该页面所对应的物理块号。图4-19示出带有快表的分页系统中地址转换过程。,图4-19 利用快表实现地址转换,2.页表构造 1)多级页表 在上面介绍中每个进程只用一个页表来实现从逻辑地
18、址到物理地址的转换。在逻辑地址空间较小的情况下这是可行的。但现代大多数计算机系统都支持非常大的地址空间,如232264,此时若只用一级页表的话,就使得页表很大。两级页表方式下逻辑地址结构如图4-20所示。,图4-20 两级页表的地址结构,具有两级页表结构的系统中地址转换的方法是:利用外层页号p1检索外层页表,从中找到相应内层页表的基址;再利用p2作为该内层页表的索引,找到该页面在内存的块号;用该块号和页内地址d拼接起来就形成访问内存的物理地址了,如图4-21所示。,图4-21 具有两级页表的地址转换机构,外层页表要有242项,即244字节。为此,把外层页表再分页,于是得到三级页表结构。三级页表
19、的地址结构如图4-22所示。,图4-22 三级页表的地址结构,2)倒置页表 上述进程的页表都是以页号为索引去搜索页表,即页表是按虚拟地址排序的。随着64位虚拟地址空间在处理器上的应用,使得内存空间显得很小。在此情况下,按逻辑页号为序构造页表,则页表会非常大。为了减少页表占用过多内存空间,可以采用倒置页表(Inverted Page Table)。倒置页表的构造恰与普通页表相反,它是按内存块号排序,每个内存块占有一个表项。每个表项包括存放在该内存块中页面的虚拟页号和拥有该页面的进程标识符。这样,系统中只有一个页表,每个内存块对应惟一的表项。图4-23示出倒置页表的操作过程。,图4-23 倒置页表
20、,4.4.4 页的共享和保护 在多道程序系统中,数据共享很重要。尤其在一个大型分时系统中,往往有若干用户同时运行相同的程序(如编辑程序、编译程序)。很显然,更有效的办法是共享页面,避免同时在内存中有同一页面的两个副本。共享的方法是使这些相关进程的逻辑空间中的页面指向相同的内存块(该块中放有共享程序或数据)。图4-24示出了三个进程共享5#内存块中文本数据的情况。,图4-24 页面的共享,4.5 分 段 技 术,4.5.1 分段存储管理的基本概念 1.分段 通常,一个用户程序是由若干相对独立的部分组成的,各自完成不同的功能。如上所述,为了编程和使用的方便,我们希望把自己的程序按照逻辑关系加以组织
21、,即划分成若干段,并按照这些段来分配内存。所以,段是一组逻辑信息的集合。例如,有主程序段MAIN、子程序段P、数据段D和栈段S等。如图4-25所示。,图4-25 分段地址空间,2.程序的地址结构 由于整个作业的地址空间分成多个段,所以,逻辑地址要用两个成分来表示:段号s和段内地址d。就是说,在分段存储情况下,作业的逻辑地址空间是二维的。分段系统中所用的地址结构如图4-26所示。,图4-26 分段技术的地址结构,3.内存分配 在分段存储管理中内存以段为单位进行分配,每个段单独占用一块连续的内存分区。各分区的大小由对应段的大小决定。这有些类似于动态分区分配方式。但是二者是不同的:在分段存储管理系统
22、中,一个作业或进程可以有多个段,这些段可以离散地放入内存的不同的分区中。,4.段表和段表地址寄存器 同分页一样,为了能找出每个逻辑段所对应的物理内存中分区的位置,系统为每个进程建立了一个段映射表,简称“段表”。每个段在段表中占有一项。段表项中一般应包含以下内容:段号、段的长度、段在内存中的起始地址(又称“基址”)等。,5.分页和分段的主要区别 分页和分段存储管理系统有很多相似之处,例如,二者在内存中都不是整体连续的,都要通过地址映射机构将逻辑地址映射到物理内存中。但二者在概念上完全不同,主要有以下几点:(1)页是信息的物理单位。(2)页的大小是由系统固定的,即由机器硬件把逻辑地址划分成页号和页
23、内地址两部分。,(3)分页的作业地址空间是一维的,地址编号从0开始顺次递增,一直排到末尾。因而只需用一个地址编号(如10000)就可确定地址空间中的惟一地址。,4.5.2 地址转换 段地址转换与分页地址转换的过程基本相同,其大致过程如图4-27所示。(1)CPU计算出来的有效地址分成两个部分:段号s和段内地址d。(2)系统将该进程段表地址寄存器中的内容B(表示段表的内存地址)与段号s相加,得到查找该进程段表中相应表项的索引值。,图4-27 分段地址转换,(3)将段内地址d与段长m进行比较。如果d不小于m,则表示地址越界,系统发出地址越界中断,进而终止程序执行;如果d小于m,则表示地址合法,从而
24、将段内地址d与该段的内存始址s相加,得到所要访问单元的内存地址。,4.5.3 段的共享和保护 分段管理的一个优点是提供了对代码或数据进行有效地共享。为了共享某个段,只需在各个作业的段表中登记一项,使它们的基地址都指向同一个物理单元,如图4-28所示。,图4-28 分段系统中段的共享,段的保护措施有以下几种:(1)存取控制。(2)段表本身可起保护作用。(3)段表地址寄存器中段表长L起保护作用。(4)保护环。,4.6 虚 拟 存 储 器,4.6.1 虚拟存储器概念 作业在执行之前要全部装入内存,这种限制往往是不合理的,会造成内存的浪费。因为:(1)程序中往往含有不会被执行的代码,如对不常见的错误进
25、行处理的代码。,(2)一般为数组、队列、表格等数据结构分配的内存空间要大于它们的实际需要。(3)一个程序的某些任选功能和特殊性能很少被使用,例如把某些行中所有的字符都转换成大写字符的正文编辑命令。,这样做会带来很多好处,起码有以下两点:(1)用户编制程序时可不必考虑内存容量的限制,只要按照实际问题的需要来确定合适的算法和数据结构,从而简化了程序设计的任务。(2)由于每个进程只有一部分装入内存,因而占用的内存空间就较少,在一定容量的内存中就可同时装入更多的进程,也相应地增加了CPU的利用率和系统的吞吐量。,4.6.2 虚拟存储器特征 对于虚拟存储器这一基本概念我们应从以下几个方面进行理解,这些也
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 教程 Linux 实例 分析 孟庆昌第 存储器 管理
链接地址:https://www.31ppt.com/p-6399268.html