3.1 内存管理概念

一、内存管理的基本原理和要求
	操作系统对内存的划分和动态分配,就是内存管理的概念。	
	内存管理的功能有:
	a.内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分
配的麻烦,提高编程效率。
	b.地址转换。在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存
储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
	c.内存空间的扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
	d.存储保护。保证各道作业在各自的存储空间内运行,互不干扰。

1.程序装入和链接
	创建进程首先要将程序和数据装入内存,将用户源程序变为可在内存中执行的程序,通常需要
以下几个步骤:
	编译。由编译程序将用户源代码编译成若干目标模块。	
	链接。由链接程序将编译后形成的一组目标模块及所需的库函数链接在一起,形成一个完整的
	装入模块。
	装入。由装入程序将装入模块装入内存运行。

	程序的链接有以下三种方式。
	a.静态链接。在程序运行之前,先将目标模块及它们所需的库函数链接成一个完整的可执行程
	序,以后不再拆开。
	b.装入时动态链接。将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入
	边链接的方式。
	c.运行时动态链接。对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。其
	优点是便于修改和更新,便于实现对目标模块的共享。

	内存的装入模块在装入内存时,同样有以下三种方式:
	(1)绝对装入。在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的
目标代码。绝对装入程序按照装入模块的地址,将程序和数据装入内存。由于程序中的逻辑地址与
实际内存地址完全相同,因此不需要对程序和数据的地址进行修改。绝对装入方式只适用于单道程
序环境。
	(2)可重定位装入。在多道程序环境下,多个目标模块的起始地址通常都从0开始,程序中的其
他地址都是相对于起始地址的。根据内存的当前情况,将装入模块装入内存的适当位置。装入时对
目标程序中指令和数据的修改过程称为重定位,地址变换通常是在装入时一次完成的,所以又称静态
重定位。
	特点是,一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够的内存,则不能
装入该作业。此外,作业一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请空间。
	(3)动态运行时装入。也称动态重定位。程序在内存中若发生移动,则需要采用动态的装入方
式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把
这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种
方式需要一个重定位寄存器的支持。特点是,可以将程序分配到不连续的存储区中;在程序运行之前
可以只装入它的部分代码即可投入运行,然后再程序运行期间,根据需要动态申请分配内存;便于程
序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

2.逻辑地址空间与物理地址空间
	编译后,每个目标模块都从0号单元开始编址,这称为该目标模块的相对地址(逻辑地址)。当链
接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址
构成统一的从0号单元开始编址的逻辑地址空间。不同进程可以有相同的逻辑地址,因为这些相同的
逻辑地址可以映射到主存中的不同位置。
	物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令
和访问数据,最后都要通过物理地址从主存中存取。当装入存续将可执行代码装入内存时,必须通过
地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。

3,内存保护
	内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的
影响。内存保护可采取两种方法:
	(1)在CPU中设置一队上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU要
访问一个地址时,分别和两个寄存器的值相比,判读有无越界。

	(2)采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)来实现这种保护。重定位
寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。每个逻辑地址必须小于界地址寄
存器;内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生越界,则加上重定位寄存
器的值后映射成物理地址,再送交内存单元。

二、覆盖与交换
	覆盖与交换技术是在多道程序环境下用来扩充内存的两种方法
	1.覆盖
	早期的计算机系统中,主存容量很小,虽然主存中仅存放一道用户程序,但存储空间放不下用户
进程的现象也经常发生,这一矛盾可以用覆盖技术来解决。
	基本思想:由于程序运行时并非任何时候都要访问程序及数据的各个部分,因此可以把用户空
间分成一个固定区和若干覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先
将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替
换覆盖区中原有的段。

	2.交换
	基本思想:把处于等待状态(或在CPU调度原则下被剥夺运行权力)的程序从内存移到辅存,把内
存空间腾出来,这一过程又称换出;把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称换
入。
	有关交换,需要注意以下几个问题:
	(1)交换需要备份存储,通常是快速磁盘。它必须足够大,并提供对这些内存映像的直接访问。
	(2)为了有些使用CPU,需要使每个进程的执行时间比较换时间长,而影响交换时间的主要是
转移时间。转移时间与交换的内存空间成正比。
	(3)若换出进程,则必须确保该进程完全处于空闲状态。
	(4)交换空间通常作为磁盘的一整块,且独立于文件系统,因此使用起来可能会很快。
	(5)交换通常在有许多进程运行且内存空间吃紧时开始启动,而在系统负荷降低时就暂停。
	交换技术主要在不同进程(或作业)之间进行,而覆盖则用于同一个进程或程序中。由于覆盖技
术要求给出程序段之间的覆盖结构,使得其对用户和程序员不透明,所以对于主存无法存放用户程序
的矛盾,现代操作系统是通过虚拟内存技术来解决的。

三、连续分配管理方式
	连续分配方式是指为一个用户程序分配一个连续的内存空间。
	1.单一连续分配
	内存在此方式下分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分;用户区是
为用户提供的、除系统区之外的内存空间。这种方式无须进行内存保护。因为内存中永远只有一道
程序,因此肯定不会因为访问越界而干扰其他程序。
	优点:简单、无外部碎片,可以采用覆盖技术,不需要额外的技术支持。
	缺点:只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。

	2.固定分区分配
	固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干固定大小
的区域,每个分区只装入一道作业。当有空闲分区时,便可再从外存的后背作业队列中选择适当大小
的作业装入该分区,如此循环。
	固定分区分配在划分分区时有两种不同的方法
	(1)分区大小相等。用于利用一台计算机去控制多个相同对象的场合,缺乏灵活性。
	(2)分区大小不等。划分为多个较小的分区、适量的中等分区和少量大分区。
	为便于内存分配,通常将分区按大小排队,并为之建立一张分区说明表,其中各表项包括每个分
区的始址、大小及状态(是否已分配),当有用户程序要装入时,便检索该表,以找到合适的分区给予
分配并将其状态置为已分配;未找到合适分区时,则拒绝未该用户程序分配内存。

	这种分区方式存在两个问题:一是程序可能太大而放不进任何一个分区中,这时用户不得不使
用覆盖技术来使用内存空间;二是主存利用率低,当程序小于固定分区大小时,也占用一个完整的内
存分区空间,这样分区内部就存在空间浪费,这种现象成为额内部碎片。
	
	固定分区无外部碎片,但不能实现多进程共享一个主存区,所以存储空间利用率低。固定分区
分配很少用于现在通用的操作系统中,但在某些用于控制多个相同对象的控制系统中仍发挥着一定
的作用。

	3.动态分区分配
	动态分区分配又称可变分区分配,是一种动态划分内存的分区方法。这种分区方法不预先划分
内存,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好合适进程的需
要。因此,系统中分区的大小和数目是可变的。
	
	动态分区在开始分配时是很好的,但之后会导致内存中出现许多较小的内存块。随着时间的推
移,内存中会产生越来越多的碎片,内存的利用率随之下降。这些小的内存块称为外部碎片,指在所
有分区外的存储空间会变成越来越多的碎片,这与固定分区的内部碎片正好相对。克服外部碎片可
以通过紧凑技术来解决,即操作系统不时地对进程进行移动和整理。但这需要动态重定位寄存器的
支持,且相对费时。紧凑的过程实际上类似于Windows系统中的磁盘整理程序,只不过后者是对外存
空间的紧凑。

	在进程装入或放入主存时,若内存中有多个足够大的空闲块,则操作系统必须确定分配那个内
存块给进程使用,这就是动态分区的分配策略。考虑以下几种算法。
	(1)首次适应算法。空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足
要求的第一个空闲分区。
	(2)最佳适应算法。空闲分区按容量递增的方式形成分区链,找到第一个能满足要求的空闲分
区。
	(3)最坏适应算法。又称最大适应算法,空闲分区以容量递减的次序链接,找到第一个能满足要
求的要求的空闲分区,即挑选出最大的分区。
	(4)邻近适应算法。又称循环首次适应算法,由首次适应算法演变而成。不同之处是,分配内存
时从上次查找结束的位置开始继续查找。

	在这几种方法中,首次适应算法不仅是最简单的,而且通常也是最好和最快的。不过首次适应
算法会使得内存的低地址部分出现很多很小的空闲分区,而每次分配查找时,都要经过这些分区,因
此增加了查找的开销。
	
	邻近适应算法试图解决这个问题。但实际上,它常常导致在内存的末尾分配空间分裂成小碎片
它通常比首次适应算法的结果要差。

	最佳适应算法性能通常很差,因为每次从最佳的分配会留下很小的难以利用的内存块,会产生
最多的外部碎片。

	最坏适应算法与最佳适应算法相反,它选择最大的可用块,这看起来最不容易产生碎片,但是却
把最大的连续内存分开,会很快导致没有可用的大内存块,因此性能也很差。

四、非连续分配管理方式
	非连续分配允许一个程序分散地装入不相邻的内存分区。非连续分配管理方式根据分区的大
小是否固定,分为分页存储管理方式和分段存储管理方式。
	在分页存储管理方式,有根据运行作业时是否要把作业的所有页面都装入内存才能运行,分为
基本分页存储管理方式和请求分页存储管理方式。

	1.基本分页存储管理方式
	我们是希望内存的使用能尽量避免碎片的产生,这就引入了分页的思想;把主存空间划分为大
小固定且相等的块,块相对较小,作为主存得到基本单位。每个进程也以块为单位进行划分,进程在
执行时,以块为单位逐个申请主存中的块空间。
	
	分页的方法从形式上看,像分区相等的固定分区技术,分页管理不会外部碎片。但它又有本质
的不同点:块的大小相对分区要小很多,而且进程也按照块进行划分,进程运行时按块申请主存可用
空间并执行。这样,进程只会在为最后一个不完整的块申请一个主存块空间时,才产生主存碎片,所
以尽管会产生内部碎片,但这种碎片相对于进程来说也是很小的,每个进程平均只产生半个块大小的
内部碎片(页内碎片)(1)分页存储的几个基本概念
	a.页面和页面大小。进程中的块称为页,内存中的块称为页框(页帧)。外存也以同样的单位进
行划分,直接称为块。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这
就产生了页和页框的一一对应。
	为方便地址转换,页面大小应是2的整数幂。同时页面大小应该适中,页面太小会使进程得到页
面数过多,这样页表就会过长,占用大量内存,而且也会增加硬件地址转换的开销,降低页面换入/换
出的效率;页面过多又会使页内碎片增多,降低内存得到利用率。
	b.地址结构。地址结构包含两部分:前一部分为页号P,后一部分为页内偏移量W。地址长度为
32,其中0~11位为页内地址,即每页大小为4KB;12~31位为页号,地址空间最多允许2^20页。
	c.页表。为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页
表它记录页面在内存中对应的物理块号,页表一般存放在内存中。
	页表是由页表项构成得到,页表项和地址都由两部分构成,而且第一部分都是页号,但页表项的
第二部分是物理内存中的块号,而地址的第二部分是页内偏移;页表项的第二部分与地址的第二部分
共同组成物理地址。
	页表的作用是实现从页号到物理块号的地址映射。

	(2)基本地址变换机构
	地址变换机构的任务是将逻辑地址转换为内存中的物理地址。地址变换是借助于页表实现的
	在系统中通常设置一个页表寄存器(PTR),存放页表在内存的起始地址F和页表长度M。进程未
执行时,页表的始址和长度存放在进程控制块中,当进程执行时,才将页表始址和长度存入页表寄存
器。设页面大小为L,逻辑地址A到物理地址E的变换过程如下:
	a.计算页号P(P=A/L)和页内偏移量W(W=A%L)
	b.比较页号P和页表长度M,若P>=M,则产生越界中断,否则将继续执行
	c.页表中页号P对应的页表项地址=页表始址F+页号P*页表项长度,取出该页表项内容b,即为
	物理块号。页表长度的值是指一共有多少页,页表项长度是指页地址占多大的存储空间。
	d.计算E=b*L+W,用得到的物理地址E去访问内存。

	页表项的作用是找到该页在内存中的位置。
	
	分页管理方式存在的两个主要问题
	A.每次访存操作都需要逻辑地址到物理地址的转换,地址转换过长必须足够快,否则访存速度
	会降低;
	B.每个进程引入页表,用于存储映射机制,页表不能太大,否则内存利用率越降低

	(3)具有快表的地址变换机构
	若页表全部存放在内存中,则存取一个数据或一条指令至少要访问两次内存:第一次是访问页
表,确定所存取的数据或指令的物理地址;第二次是根据该地址存取数据或指令。显然,这种方法比
通常执行指令的速度慢了一半。
	为此,在地址变换机构中增设一个具有并行查找能力的高速缓冲存储器-块表,又称相连存储器
(TLB),用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,主存中的页表通常称
为慢表。
	在具有快表的分页机制中,地址的变换过程如下:
	A.CPU给出逻辑地址后,由硬件进行地址转换,将页号送人告诉缓存寄存器,并将此页号与快表
中的所有页号进行比较
	B.若找到匹配的页号,说明所要访问的页表项在快表中,则直接从中取出该页对应的页框号,与
页内偏移量拼接形成物理地址。这样,存取数据仅一次访存便可实现。
	C.若未找到匹配的页号,则需要访问主存中的页表,在读出页表项后,应同时将其存入快表,以
便后面可能的再次访问。但若快表已满,则必须按照一定的算法对旧的页表项进行替换。

	有些处理机设计为快表和慢表同时查找,若在快表中查找成功则终止慢表的查找。一般快表的
命中率可达90%以上,这样分页带来的速度损失就可降至10%以下。
	
	(4)两级页表
	为了压缩页表,我们进一步延申页表映射的思想,就可得到二级分页,即使用层次结构的页表。
将页表的10页空间也进行地址映射,建立上一级页表,用于存储页表的映射关系。为查询方便,顶级
页面最多只能有1个页面。建立多级页表的目的在于建立索引,以便不用浪费主存空间去存储无用的
页表项,也不用盲目地顺序式查找页表项。

	2.基本存储分段存储管理方式
	分页管理方式的目的是提高内存的利用率,提升计算机的性能,分页通过硬件机制实现,对用户
完全透明。
	(1)分段。段式管理方式按照用户进程中的自然段划分逻辑空间。在页式系统中,逻辑地址的
页号和页内偏移量对用户是透明的,但在段式系统中,段号和偏移量必须由用户显式提供,在高级程
序设计语言中这个工作由编译程序完成。
	(2)段表。每个进程都有一张逻辑空间与内存空间映射得到段表,其中每个段表项对应进程的
一段,段表项记录该段在内存中的始址和长度。段表用于实现从逻辑段到物理内存区的映射。
	(3)地址变换机构。为了实现进程从逻辑地址到物理地址得到变换功能,在系统中设置了段表
寄存器,用于存放段表始址F和段表长度M。从逻辑地址A到物理地址E之间的地址变换过程如下:
	A.从逻辑地址A中取出前几位为段号S,后几位为段内偏移量W
	B.比较段号S和段表长度M,若S>=M,则产生越界中断,否则继续执行
	C.段表中段号S对应的段表项地址=段表始址F+段号S*段表项长度,取出该段表项的前几位得到
段长C.若段内偏移量>=C,则产生越界中断,否则继续执行。
	D.取出段表项中该段的始址b,计算E=b+W,用得到的物理地址E去访问内存
	(4)段的共享与保护。在分段系统中,段的共享是通过两个作业的段表中相应表项指向被共享
的段的同一个物理副本来实现的。当一个作业正在从共享段中读取数据时,必须防止另一个作业修
改此共享段中的数据。不能修改的代码称为纯代码或可重入代码(它不属于临界资源),这样的代码
和不能修改的数据可以共享,而可修改的代码和数据不能共享。

	分段管理的保护方法主要有两种:一种是存取控制保护,另一种是地址越界保护。地址越界保
护将段表寄存器中的段表长度与逻辑地址中的段号比较,若段号大于段表长度,则产生越界中断;再
将段表项中段长和逻辑地址中的段内偏移进行比较,若段内偏移大于段长,也会产生越界中断。分页
管理中的地址越界保护只需要判断页号是否越界,页内偏移是不可能越界的。
	段式管理不能通过给出一个整数便确定对应的物理地址,因为每段的长度是不固定的,无法通
过整数除法得出段号,无法通过求余得出段内偏移,所以段号和段内偏移一定要显示给出,因此分段
管理的地址空间是二维的。

	3.段页式管理方式
	页式存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的
共享。将这两种存储管理方法结合起来,便形成了段页式存储管理方式。
	在段页式系统中,作业的地址空间首先被分成若干逻辑段,每段都有自己的段号,然
后将每段分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其
分成若干和页面大小相同的存储块,对内存的分配以存储块为单位。
	在段页式系统中,作业的逻辑地址分为三部分:段号、页号和页内偏移量
	为了实现地址变换,系统为每个进程建立一张表,每个分段都有一张页表。段表表项中至少包
括段号、页表长度和页表始址,页表表现中至少包括页号和块号。此外,系统中还应有一个段表寄存
器,指出作业的段表始址和段表长度(段表寄存器和页表寄存器的作用都有两个,一是在段表或页表
中寻址,二是判断越界)。
	在一个进程中,段表只有一个,而页表可能有多个。
	在进行地址变换时,首先通过段表查到页表始址,然后通过页表找到帧号,最后形成
物理地址。
	段页式管理的地址空间是二维的。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值