操作系统——内存管理基础

1.内存管理概念

实现虚拟内存管理都要有操作系统和相应的硬件支持。

1.1内存管理的主要功能有:

①内存空间的分配与回收。

②地址转换。(把逻辑地址转换为相应的物理地址)

③内存空间的扩充。(利用虚拟空间技术或者自动覆盖技术,从逻辑上扩充内存)

④内存共享。

⑤存储保护。

1.2运行内存基本原理和要求

1)程序的链接与装入

将程序和数据装入内存,要有以下步骤:

①编译。由编译程序将用户源代码编译成若干目标模块。

②链接。由链接程序程序将编译后的目标模块以及所需的库函数链接一起,形成完整的装入模块。

③装入。由装入程序将装入模块装入内存。


程序链接的三种方式:

①静态链接。

在程序运行之前,先将各目标模块及所需的库函数链接一起,以后不再拆开。

②装入时动态链接。

将用户源程序编译后得到一组目标模块,在装入内存时,采用边装入边链接的方式。

优点:便于修改和更新,便于实现对目标模块的共享。

③运行时动态链接。

对于某些目标模块的链接,是在程序执行中需要该目标模块时才进行。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上。

优点:能加快程序的装入过程,还可节省大量的内存空间。

2)内存的装入模块在装入内存时,同样可用以下三种方式:

①绝对装入。

只适用于单道程序环境。在编译时,若知道程序将驻留在内核的某个位置,则编译程序时将产生绝对地址的目标代码。

②可重定位装入。

在多道环境下,多个目标模块的起始地址通常是从0开始,程序中其他地址都是相对于起始地址的,此时应采用可重定位装入方式。

在装入时对目标程序中的指令和数据地址的修改过程称为重定位,又因为地址变换通常时在进程装入时一次完成的,故称为静态重定位

当一个作业装入内存时,必须给他分配要求的全部内存空间,若没有足够的内存,则无法装入。

作业一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请内存空间。

③动态运行时装入。

也称动态重定位。程序再内存中若发生移动,则需要采用动态装入方式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此装入内存后所有地址均为相对地址。这种方式需要一个重定位寄存器支持。

优点:可以将程序分配到不连续的存储空间,再程序运行之前可以只装入部分代码投入运行,然后再程序运行期间,根据需要动态分配内存,便于程序段的共享。

2)逻辑地址与物理地址

逻辑地址:编译后,每个目标模块都从0号开始编址,这称该目标模块的相对地址(逻辑地址)。

物理地址:物理地址空间时内存中物理单元集合,它是地址转换的最终地址,主存中存取的地址。

当装入程序将可执行的代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位

3)进程的内存映像

当一个程序调入内存时,就构成了进程的内存映像。一般有几个要素:

①代码段:程序的二进制代码,只读,可被多个程序共享。

②数据段:程序运行加工处理对象,包括全局变量和静态变量。

③进程控制块(PCB):放在系统区,系统通过PCB来控制和管理进程。

④堆:用来存放动态分配的变量。

⑤栈:用来实现函数调用。

4)内存保护

确保每个进程都有一个单独的空间,内存分配之前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程影响。内存保护采取两种方法:

1)在CPU设置一对上、下限寄存器,存放用户作业在主存中的上、下限地址,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断是否越界。

2)采用重定位寄存器(基地址寄存器)和界地址寄存器(限长寄存器)来实现这种保护。

重定位寄存器含最小的物理地址,界地址寄存器含逻辑地址的最大值。

内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。(在内核中进行)

5)内存共享

只有只读区域的内存空间才能共享。

可重入代码(纯代码),允许多个进程同时访问但不允许被任何进程修改的代码。

2.覆盖与交换

 是多道程序环境下用来扩充内存的两种方法:

1)覆盖

由于程序运行时不是任意时刻都要访问程序和数据各个部分,所以把用户空间分成一个固定区和若干覆盖区。将经常活跃部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区原来的段。

固定区的段会常驻内存,而内存更新地方只有覆盖区。

2)交换

把处于等待状态的程序从内存移到辅存,把内存空间腾出来,这过程叫换出。

把准备好竞争CPU运行的程序从辅存移到内存,这一过程叫换入。(中级调度)

3.连续分配管理

连续分配主要方式包括单一连续分配、固定分区分配和动态分区分配。

1)单一连续分配

内存在此方式下分为系统区和用户区,系统区供操作系统使用,用户区仅有一道用户程序,即独占内存。

优点:简单,无外部碎片,无需保护内存

缺点:只能用于单用户,单任务的操作系统,有内部碎片,存储器利用率低

2)固定分区分配

简单的多道程序存储管理方式,将用户空间划分为若干固定大小的区域,每个分区只装入一道作业。分区有 分区大小相等和分区大小不等 两种划分。

为了便于分配,建立一张分区使用表,在分配内存时,可以检索该表找到一个能满足的要求且尚未分配的分区装入程序。

缺点:程序可能太大,放不进任意分区,这时需采用覆盖技术来使用内存空间。

当程序小于固定分区空间,也要占一个空间时,分区内部存在空间浪费,这称为内部碎片

3)动态分区分配

又称可变分区分配。

在装入内存时,根据进程的实际需要,动态地为之分配内存,使分区的大小正好适合进程需要。

随时时间推移,内存中会出现越来越多内存块,内存利用率也随之下降,称为外部碎片。、

克服外部可以通过紧凑技术来解决,即操作系统不是地对进程进行移动和整理。

动态分区分配策略算法:

①首次适应算法。

空闲分区由地址递增次序链接,分配内存时,从链首开始顺序查找,找到大小能满足要求的第一个空闲分区分配给作业。

②邻近适应算法。

又称循环首次适应算法。由首次适应算法演变而成,分配内存时,从上次查找结束位置开始继续查找。

③最佳适应算法。

空闲分区按容量次序递增形成空间分区链,找到第一个满足要求且最小的空闲分区分配作业。

④最坏适应算法。 

空闲分区按容量次序递减形成空间分区链,找到第一个满足要求且最大的分区,从中割一部分存储空间给作业。

4.非连续分配管理

4.1基本分页存储管理

 4.1.1 分页存储管理的基本概念

进程中块称 页 或 页面,内存中的块称 页框 或 页帧,外存中称为 块或 盘块。

进程在执行中需要申请主存空间,即要为每个页面分配主存中可用页框,页与页框一一对应。

分页存储管理逻辑地址分为页号和页内偏移量,页号表示最多允许多少页。

页表:为了方便在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,它记录页面在内存中对应的物理块号,页表一般存放在内存中。实现从页号到物理块号的地址映射。

页表由页表项组成,页表项由页号和块号组成。

由页表项的块号和地址的页内偏移量共同组成物理地址。

4.1.2 基于地址变换机构

主要任务是将逻辑地址转换为内存中的物理地址。借助于页表。

①计算页号P(逻辑地址 / 页面大小) 和 页内偏移量W(逻辑地址 % 页面大小)

②比较P于M,若页号大于等于页内偏移量,则产生越界,否则继续。

③计算物理块号b=页表起始地址+页号P×页表项长度。

④计算物理地址E=物理块号b×页面大小+页内偏移量。

4.1.3基于块表的地址转换

上面介绍的地址转换需要访问两次内存,即第一次访问内存中的页表,根据页表的地址再访问内存中的数据或指令。执行速度较慢,为此,新设一个具有查找能力的高速缓冲存储器——块表,又称相联存储器(TLB)。

块表,用来存放当前访问的若干页表项, 以加速地址变换过程。对应,主存中的页表称为慢表。

地址转变如下:

在CPU给出逻辑地址后,由硬件进行地址转换,将页号与快表中所有页号进行比较。

若在块表中找到对应的页号,则直接取出对应的页框号与页内偏移量组成物理地址(一次访存);

若在快表中找不到,则取主存中的页表找,读出页表项后将其存入快表。

4.1.4两级页表

逻辑地址由一级页号,二级页号和页内偏移组成。

 二级页表是为了压缩页表,在页表之间建立索引,不用浪费主存去存储无用的页表项,也不用盲目地查找页表项。

4.2基于分段存储管理

目的提高内存的利用率,提升计算机性能。

满足方便编程,信息保护和共享,动态增长及动态链接

4.2.1分段

按照用户进程中自然段划分逻辑空间。

分段系统中逻辑地址结构由 段号和段内偏移组成。

段号位数决定了每个进程最多分几段,段内偏移量决定了每段的最大长度是多少。

 在页式系统中逻辑地址的页号和页内偏移量式是对用户透明的,但在段式系统中,段号和段内偏移量是由用户提供的,在高级程序设计语言中,这个工作由编译程序完成。

4.2.2段表

 每个进程都有一张逻辑空间与内存空间的映射表,其中每个段表项对应进程中一段,段表记录该段在内存中的始址和长度。(段号,段长,本段在主存的始址)

4.2.3地址变换机构

系统设置了段表寄存器,用于存放段表始址F和段表长度M。

①从逻辑地址A中取出段号S和段内偏移量W。

②比较段号S和段表长度M,若段号比段表长度长就会产生越界中断。

③段表中段号S对应的段表项地址 = 段表始址F+段号S×段表项长度,取出该段表项前几位得到段长C。若段内偏移量大于等于C,则产生越界。

④取出段表项中该段的始址b,计算物理地址E=b+w。

4.3段页式管理 

分页存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享和保护。将两种存储结合起来,便形成了段页式存储管理方式。

在段页式存储管理中,作业的地址空间首先被分成若干逻辑段,每段有自己的段号,然后每段分成若干大小固定的页。对内存空间管理仍然和分页存储管理一样,将其分成若干和页面大小相同的存储块,对内存的分配以存储块为单位。

段页式逻辑地址结构:段号,页号,页内偏移量

为了实现地址变换,系统为每个进程建立一张段表,每个分段有一张页表。

段表包含段号,页表长度,页表始址。

页表包含页号,块号。

注意:一个进程中,段表只有一个,而页表可有多个。

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值