内存管理章节围绕分页机制展开,通过分页管理方式在物理内存大小基础上提高内存的利用率。再进一步引入请求分页管理方式(虚拟内存),使得内存脱离物理大小的限制,从而提高处理器的利用率。
需要思考以下问题:
为什么要进行内存管理?
页式管理中每个页表项大小的下限怎么决定
多级页表解决了什么问题,又会带来什么问题?
在学习经典的管理方法时,注意比较,本节给出的内存管理是循序渐进的,后一种方法会解决前一种方法的不足,着重掌握页式管理。
内存管理的基本原理和要求
操作系统必须对内存空间进行合理的划分和有效的动态分配。
有效的内存管理不仅方便用户使用存储器,提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器。
在进行具体的内存管理之前,需要了解一下进程运行的原理
1.程序装入和链接
创建进程首先需要把程序和数据装入内存,将用户的源程序变为可在内存中执行的程序,通常需要以下的步骤
1编译
2链接
3装入
程序的链接有以下的三种方式
静态链接:在程序运行前,先将各目标模块及它需要的库函数链接成一个完整的可执行程序,以后不再拆开
装入时动态链接
将用户源程序编译后得到的一组目标模块,在装入内存时,采用边装入边链接的方式。
运行时动态链接:
对某些目标模块的链接,是在程序执行中需要该目标模块时才进行。优点是便于修改和更新,便于实现目标模块的共享
内存的装入模块装入内存同样有以下三种方式
1绝对装入
在编译时,若知道程序驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。
2可重定位装入
在多道程序环境下,多个目标模块的起始地址通常从0开始,程序的其他地址都是相对于始址的。此时应采用可重定位装入方式,根据内存当前情况,将装入模块装入内存的适当位置。
装入时对目标程序中的指令和数据的修改过程叫做重定位。
地址变换通常是装入时一次性完成的,所以又称为静态重定位。
静态重定位的特点是,一个作业装入内存时,必须给它分配要求的全部内存空间,若没有,则不能装入。作业一旦进入内存,整个运行期间都不能在内存中移动,也不能在申请内存空间。
3动态运行时装入
程序在内存中若发生移动,则需要采取动态的装入地址。装入程序把装入模块装入内存后,并不立即把装入模块的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行,因此装入内存后的所有地址均为相对地址。需要一个重定位寄存器的(放一个物理始址)支持。
特点如下:可以吧程序分配到不连续的存储区,在程序运行前只装入它的部分代码即可投入运行【与虚拟存储技术有关】在程序运行期间,根据需要动态申请分配内存,便于程序段的共享,可以给用户提供一个比存储空间大得多的地址空间。
2逻辑地址空间与物理地址空间
编译后,每一目标模块都从0号单元开始编址,是该目标模块的相对地址。
当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。
不同进程可以有相同的逻辑地址,这些相同的逻辑地址可以映射到主存的不同位置。
物理地址指的是内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最终都是要通过物理地址从主存中存取。
当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换为物理地址,这个过程叫做地址重定位。(工作由地址转换机构完成)
3内存保护
内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。
内存保护可采取以下两种方式
1 CPU中设置一对上下限寄存器,存放用户作业在主存中的下限和上限地址,每当cpu要访问一个地址时,分别和两个寄存器的值相比,判断有无越界
2 采用重定位寄存器和界地址寄存器来实现这种保护。
重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。每个逻辑地址值必须小于界地址寄存器。内存管理机构动态地将逻辑地址和界地址寄存器进行比较,如果没发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。
Cpu调度程序选择进程执行时,派遣程序会初始化重定位寄存器和界地址寄存器。每一个逻辑地址都需要和这两个寄存器进行核对,以保证操作系统和其他用户程序不被该进程运行影响。
注意两个寄存器区别:界地址寄存器是比较,重定位是+
覆盖和交换
这是多道程序环境下用来扩充内存的两种方法
1覆盖
特点:打破了必须将一个进程的全部信息装入内存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行,内存中能更新 的地方只有覆盖区的段,不在覆盖区的段会常驻内存。
基本思想是:由于程序运行时并非任何时候都要访问程序和数据的各个部分(尤其是大程序)因此把用户空间分成一个固定区和几个覆盖区,其他段放在外存。在需要调用前系统再将其调入覆盖区,替换覆盖区原有的段
2交换
基本思想是把处于等待状态的(或在cpu调度原则下被剥夺运行权利的)程序从内存移到辅存,把内存空间腾出来
把准备好竞争cpu运行的程序从辅存移到内存
第二章的中级调度技术就是交换技术
有关交换,需要注意以下几个问题
1交换需要备份存储,通常是快速磁盘
2为了有效的使用cpu,通常每个进程执行时间比交换时间长
3若换出进程,必须确保该进程完全处于空闲状态
交换空间通常作为磁盘的一整块,且独立于文件系统,因此用起来很快
4交换通常在有许多进程运行且内存空间吃紧时开始启动,而系统负荷降低就暂停
5普通的交换使用不多。但交换策略的某些变体在在许多系统中仍发挥作用。
交换技术主要用在不同进程或作业之中,而覆盖则用于同一个程序或进程中。。
覆盖技术要求给出程序段之间的覆盖结构,使得其对用户和程序员不透明,所以对于主存无法存放用户程序的矛盾现代操作系统通过虚拟内存技术解决,覆盖技术已成为历史。但是交换技术仍很流行
连续分配管理方式
连续分配主要包括单一连续分配,固定分区分配,动态分区分配下面一一介绍
1单一连续分配
内存在此方式下分为系统区和用户区
系统区仅供操作系统使用,通常在低地址部分;
用户区是为用户提供的,除系统区外的内存空间。
这种方式不需要内存保护,因为内存中永远只有一道程序,因此肯定不会因为访问越界而干扰其他程序
2固定分区分配
这是最简单的一种多道程序存储管理方式。
它把用户空间划分为若干固定大小的区域,每一分区只装入一道作业。
当有空闲分区时,便可再从外存后备作业队列中选择适当大小的作业装入该分区,如此循环。
固定分区分配在划分时有两种不同的方法
A分区大小相等
B 分区大小不相等 划分为多个较小的分区,适量的中等分区和少量的大分区,比较前者灵活
B这种分配方式存在两个问题:1 程序可能太大而放不进任何一个分区,这时不得不用覆盖技术来使用空间
二是主存利用效率低,当程序小于固定分区大小时,也占用一个完整的内存分区空间,这样会导致分区内部空间浪费,产生内部碎片。
固定分区可用于多道程序设计中最简单的存储分配,无外部碎片,但不能实现多进程共享一个主存区,(分区比较大,一个进程用一个可能浪费很多)所以存储空间利用率低
3动态分区分配
这是一种动态划分内存的分区方法这种分区方法不预先划分内存,而是在进程装入内存(第三步)时,根据进程的大小动态地建立分区,使得分区的大小正好适合进程的需要,系统中分区的大小和数目是可变的。
会产生外部碎片。
非连续分配管理方式
允许一个程序分散地装入不相邻的内存分区,比如1GB作业分散地分配在内存的各个区域。也需要额外空间存储它们的索引这样使得非连续分配方式的存储密度低于连续分配方式
根据分区大小是否固定,分为分页存储管理和分段存储管理
在分页存储管理中又根据运行作业时是否把作业的所有页面都装入内存才能运行分为基本原理和请求分页。
下面讲下分页存储管理
为了避免碎片的产生引入分页思想,把主存空间划分为大小相等且固定的块,块相对小,作为主存的基本单位。每个进程也以块为单位划分,进程在执行时,以块为单位逐个申请主存的块空间。
分页的方法从形式上看,像分区相等的固定分区技术。分页管理不会产生外部碎片,但它又有着本质的不同点,块的大小相对分区要小很多,而且进程按照块进行划分。进程只会为最后一个不完整的块申请一个主存空间时才会产生主存碎片。尽管会产生内部碎片,但是这个碎片相对于进程来说是很小的,每个进程只产生半个块大小的内部碎片(也叫做页内碎片)
分页存储的几个基本概念
1页面和页面大小
进程中的块叫做页,内存中的块叫做页框。外存以同样的单位进行划分,直接叫做块。
进程执行时为每个页面分配主存中的可用页框,这就产生了页与页框的一一对应。
为了方便地址转换,页面大小应是2的整数幂。同时页面大小应该适中,页面太小会使得进程的页数太多,这样页表过长。占用大量内存。也会增加地址转换的开销,降低页面换入换出的效率。页面过大又会使页内碎片增多,降低内存的利用率。
所以页面的大小应该适中,在空间效率和时间效率之间权衡。
2地址结构(逻辑地址结构)
分为两部分,前一部分是页号,后一部分是页内偏移量。
地址结构决定了虚拟内存的寻址空间有多大。
比如地址长度32位,0-11位是页内地址,即每页2的12次幂,每页4kb。
12-31位为页号,该地址空间最多允许2的20次幂页
3页表
为了便于查表进行地址转换。
在内存中找到进程的每个页面所对应的物理块,系统会为每个进程建立一张页表。它记录了页面在内存中对应的物理块号,页表一般放在内存中
页表由页表项组成页表项和地址都由两部分组成,第一部分是页号,第二部分是页面在物理内存中的块号。
基本地址变换机构
地址变换机构的任务是将逻辑地址转换为内存的物理地址。地址变换是借助页表实现的。
通常设置一个页表寄存器,存放页表在内存的始址和页表长度。进程未执行时,页表的始址和长度存放在进程控制块中。
当进程执行时,才将始址和长度存入页表寄存器。