6 存储管理
6.1 存储管理的概念
6.1.1 和地址有关的几个概念
1. 物理地址
物理内存,真实存在的插在主板内存槽上的内存条的容量的大小。内存是由若干个存储单元组成的,每个存储单元有一个编号,这种编号可唯一标识一个存储单元,称为内存地址(或物理地址)。我们可以把内存看成一个从0字节一直到内存最大容量逐字节编号的存储单元数组,即每个存储单元与内存地址的编号相对应。
2. 逻辑地址
源程序经过汇编或编译后,形成目标代码,每个目标代码都是以0为基址顺序进行编址的,原来用符号名访问的单元用具体的数据—单元号取代。这样生成的目标程序占据一定的地址空间,称为作业的逻辑地址空间,简称逻辑空间。
在逻辑空间中每条指令的地址和指令中要访问的操作数地址统称为逻辑地址。即应用程序中使用的地址。要经过寻址方式的计算或变换才得到内存中的物理地址。
逻辑地址是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。
6.1.2 程序装入与连接
在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在内存中执行的程序,通常都要经过以下几个步骤:
首先是要编译,由编译程序(Compiler)将用户源代码编译成cpu可执行的目标代码,产生了若干个目标模块(Object Module)(即若干程序段);
其次是链接,由链接程序(Linker)将编译后形成的一组目标模块(程序段),以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module);
最后是装入,由装入程序(Loader)将装入模块装入内存。
程序的装入内存的方式有以下3种:
1)绝对装入方式
在单道程序环境中编译时,如果知道程序将驻留在内存的什么位置,那么,编译程序将产生绝对地址的目标代码。即按照物理内存的位置赋予实际的物理地址。
2)可重定位装入方式
在多道程序环境中,编译所得到的目标模块的起始地址通常是从 0 开始的,程序中的其它地址也都是相对于起始地址计算的。此时应采用可重定位装入方式,根据内存的当前情况,将装入模块装入到内存的适当位置。
为了保证CPU执行指令时可正确访问内存单元, 需 要将用户程序中的逻辑地址转换为运行时可由机器 直接寻址的物理地址,这一过程称为地址重定位。
3)动态运行时装入方式
在程序运行的过程中,装入内存的程序可能经常要进行换入换出操作,即执行一段时间后将其换出磁盘上,以后再装入到内存中,但对换前后在内存中的位置不同。这种允许进程的内存映像在不同时候处于不同的位置的方式就称为动态运行时装入方式。
6.1.3 重定位
1. 静态地址重定位
当用户程序加载到内存时,一次性实现逻辑地址到物理地址的转换。
静态地址重定位的优点是不需要硬件支持,仅由软件实现。但缺点是程序必须装入连续的地址空间、需要将涉及地址的所有指令和数据进行相应的修改,并且装入内存后不能移动,这就使得系统内存空间利用率非常低。
2. 动态地址重定位
在进程执行过程中将逻辑地址转成物理地址。
动态地址重定位的优点是目标模块装入内存时指令本身不需要做任何修改,而且不要求占用一个连续的存储区域。缺点是需要硬件支持。
6.2 内存管理
6.2.1 固定分区
固定式分区是把内存划分为若干个固定大小的连续分区。分区大小可以相等也可以不等。每个分区只能装一个进程。
优点:易于实现,开销小
缺点:内碎片造成浪费;分区总数固定,限制了并发执行的程序数目。
6.2.2 动态分区
动态分区的是动态创建分区:在装入程序时按其初始要求分配,或在其执行过程中通过系统调用进行分配或改变分区大小。与固定分区相比较其优点是:没有内碎片。但它却引入了另一种碎片——外碎片。态分区的分区分配就是寻找某个空闲分区,其大小需大于或等于程序的要求。若是大于要求,则将该分区分割成两个分区,其中一个分区为要求的大小并标记为“占用”,而另一个分区为余下部分并标记为“空闲”。分区分配的先后次序通常是从内存低端到高端。动态分区的分区释放过程中有一个要注意的问题是,将相邻的空闲分区合并成一个大的空闲分区。
下面列出了几种常用的空闲分区分配算法:
1)最先适配法(nrst-fit):按分区在内存的先后次序从头查找,找到符合要求的第一个分区进行分配。该算法的分配和释放的时间性能较好,较大的空闲分区可以被保留在内存高端。但随着低端分区不断划分会产生较多小分区,每次分配时查找时间开销便会增大。
2)下次适配法(循环首次适应算法 next fit):按分区在内存的先后次序,从上次分配的分区起查找(到最后{区时再从头开始},找到符合要求的第一个分区进行分配。该算法的分配和释放的时间性能较好,使空闲分区分布得更均匀,但较大空闲分区不易保留。
3)最佳适配法(best-fit):按分区在内存的先后次序从头查找,找到其大小与要求相差最小的空闲分区进行分配。从个别来看,外碎片较小;但从整体来看,会形成较多外碎片优点是较大的空闲分区可以被保留。
4)最坏适配法(worst- fit):按分区在内存的先后次序从头查找,找到最大的空闲分区进行分配。基本不留下小空闲分区,不易形成外碎片。但由于较大的空闲分区不被保留,当对内存需求较大的进程需要运行时,其要求不易被满足。
紧缩技术
未解决碎片问题,可以在内存移动程序,将所有小的空闲区合并为较大的空闲区。又称:压缩技术,紧致技术,搬家技术。需要注意以下几点:
1)合并会增加系统的时间开销
2)合并是有条件的,正在进行 I/O 的进程不能移动
3)合并时尽量减少信息的移动量
6.2.3 页式存储
将程序的逻辑地址空间划分为固定大小的页(page),而物理内存划分为同样大小的页框(page frame)。程序加载时,可将任意一页放人内存中任意一个页框,这些页框不必连续,从而实现了离散分配。该方法需要CPU的硬件支持,来实现逻辑地址和物理地址之间的映射。在页式存储管理方式中地址结构由两部构成,前一部分是页号,后一部分为页内地址w(位移量),如图所示:
1. 页式管理的数据结构
1)进程页表
系统为每个进程建立一个页表,该表主要描述该进程占用的物理块以及物理块与逻辑页之间的对应关系。
2)请求表
系统为每个进程建立一个请求表,该表主要描述系统内各个进程的逻辑地址空间页表个数及他们在物理地址空间中位置。进程请求·
3)存储块表
存储块表主要描述每个物理块是否被分配,还有多少未被分配。存储块表通常采用位示图或空闲链方式实现。
2. 页式管理地址变换
在页式系统中,指令所给出的地址分为两部分:逻辑页号和页内地址。
原理:CPU中的内存管理单元(MMU)按逻辑页号通过查进程页表得到物理页框号,将物理页框号与页内地址相加形成物理地址。
逻辑页号,页内偏移地址-->查进程页表,得物理页号-->物理地址
6.2.4 段式存储
一个程序有若干相对独立的部分组成,它们各自完成不同的功能。按程序自身的逻辑关系划分为若干个程序段,每个程序段都有一个段名。同时内存空间被动态划分为若干长度不相同的区域, 称为物理段。分配时,以段为单位进行分配, 每段 在内存中占据连续空间,但各段之间可以不相邻。
1. 段式管理的数据结构
1)进程段表
描述组成进程地址空间的各段,可以是指向系统段表中表项的索引。每段有段基址(baseaddress),即段内地址。
2)系统段表
系统所有占用段(已经分配的段)。
3)空闲段表
内存中所有空闲段,可以结合到系统段表中。
2. 段式管理地址变换
在段式 管理系统中,整个进程的地址空间是二维的,即其逻辑地址由段号和段内地址两部分组成。为了完成进程逻辑地址到物理地址的映射,处理器会查找内存中的段表,由段号得到段的首地址,加上段内地址,得到实际的物理地址。这个过程也是由处理器的硬件直接完成的,操作系统只需在进程切换时,将进程段表的首地址装入处理器的特定寄存器当中。这个寄存器一般被称作段表地址寄存器。
6.2.5 段页式存储
综合页式、段式方案的优点,克服二者的缺点。用户进程划分时先按段划分,每一段再按页面划分。
内存划分:同页式存储管理方案
内存分配:以页为单位进行分配
6.2.6 覆盖和交换技术
1. 覆盖技术
由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可以把用户空间分成一个固定区和若干个覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。
覆盖技术的特点是打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行。
覆盖技术实例:
2. 交换技术
把处于等待状态(或在CPU调度原则下被剥夺运行权利) 的程序从内存移到辅存,把内存空间腾出来,这一过程又叫换出;把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称为换入。
有关交换需要注意以下几个问题:
1)交换需要备份存储,通常是快速磁盘。它必须足够大,并且提供对这些内存映像的直接访问。
2)为了有效使用CPU,需要每个进程的执行时间比交换时间长,而影响交换时间的主要是转移时间。转移时间与所交换的内存空间成正比。
3)如果换出进程,必须确保该进程是完全处于空闲状态。
4)交换空间通常作为磁盘的一整块,且独立于文件系统,因此使用就可能很快。
5)交换通常在有许多进程运行且内存空间吃紧时开始启动,而系统负荷降低就暂停。
6)普通的交换使用不多,但交换策略的某些变种在许多系统中(如UNIX系统)仍发挥作用。
交换技术主要是在不同进程(或作业)之间进行,而覆盖则用于同一个程序或进程中。由于覆盖技术要求给出程序段之间的覆盖结构,使得其对用户和程序员不透明,所以对于主存无法存放用户程序的矛盾,现代操作系统是通过虚拟内存技术来解决的,覆盖技术则已成为历史;而交换技术在现代操作系统中仍具有较强的生命力。
6.3 虚拟存储管理
6.3.1 虚拟存储的概念
1. 局部性原理
局部性原理:程序在执行时将呈现出局部性规律,即在一较短时间内,程序的执行仅限于某个部分;相应地,它所访问的存储空间也局限于某个区域。
2. 虚拟存储
虚拟存储的基本原理:
1)在程序装入时,不必将其全部读入到内存,而只需将当前需要执行的部分页或段读入到内存,就可让程序开始执行。
2)在程序执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页或段调入到内存,然后继续执行程序。(请求调入)
3)另一方面,操作系统将内存中暂时不使用的页或段调出,保存在外存上,从而腾出空间存放将要装入的程序以及将要调入的页或段。(对换/置换)
6.3.2 虚拟存储的实现方式
1. 虚拟页式存储
在简单页式存储管理的基础上,增加请求调页和页面置换功能。
1)
2)
2. 虚拟段式存储
1503



被折叠的 条评论
为什么被折叠?



