存储器管理
1. 内存管理
- 存储器按存储层次分可以分为三类,分别是寄存器、主存、辅存。寄存器位于CPU内,主存又称内存,辅存即硬盘。
存储器管理主要是对内存资源的管理,以下内容均围绕“内存管理”来展开。
-
内存管理
虽然内存容量在不断增长,但仍然不可能将所有用户进程和系统所需要的全部全部程序与数据放入主存,因此操作系统必须对内存空间进行合理的划分和有效的动态分配,这就是内存管理的概念。 -
内存管理的功能
内存管理的核心内容实质上就是以下四个方面的功能:
- 内存的分配与回收。完成对主存储器空间的分配和管理;
- 地址映射。提供地址变换的功能,把逻辑地址转换成相应的物理地址;
- 内存保护。保证各道作业在各自的存储空间内运行,互不干扰;保证用户区不向系统区越界;
- 内存扩充。利用虚拟存储技术,从逻辑上扩充内存(并没有真正的在物理上扩充内存)。
2. 一些基本概念
创建进程首先要讲程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
- 编译。由编译程序将用户源程序进行编译,形成若干个目标模块;
- 链接。由链接程序将编译后形成的一组目标模块及所需的库函数链接到一起,形成一个完整的装入模块;
- 装入。由装入程序将装入模块装入内存运行。
2.1 链接
程序的链接有以下三种方式:
- 静态链接。在程序运行前将各目标模块及它们所需的库函数链接成一个完整的不再拆分的可执行程序;(实现简单,但维护困难,可移植性差)
- 装入时动态链接。将目标模块装入内存时采用边装入边链接的方式;
- 运行时动态链接。程序执行中需要该目标模块时才进行对其的链接。(便于修改和更新,实现对目标模块的共享)
程序的动态链接与程序的逻辑结构相关,分段存储管理将程序按照逻辑段进行划分,有利于其动态链接。其他的内存管理方式与逻辑结构无关。
2.2 装入
内存的装入模块(目标模块)在装入内存时,也有以下三种方式:
- 绝对装入。程序中的逻辑地址直接指向内存的绝对地址,在把程序和数据装入内存的时候,不需要做出任何修改。
绝对装入特点:此方式只适用于单道程序环境,避免内存冲突。 - 可重定位装入。也称静态重定位。多道处理机环境下,将程序装入内存的时候,程序地址都相对于内存始址的地址偏移。装入时对目标程序中指令和数据的修改过程称为重定位,地址变换在装入时一次完成的,又称静态重定位。
静态重定位特点:一个作业装入内存时,必须给它分配要求的全部内存空间,内存不够无法装入。作业一旦进入内存,在它整个运行期间内不能移动或再申请内存空间。 - 动态运行时装入。也称动态重定位。程序运行在内存中发生移动时采用此种方式。程序中的相对地址并不在装入时就转换成内存中的绝对地址,而是等到真正运行的时候才会转换。此方式需要重定位寄存器来支持。
动态重定位特点:程序运行期间动态申请分配内存,便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间(实质上是提高内存的利用率)。但不可避免地,开销也会相应增大。
2.3 覆盖与对换
实现对内存的扩充。
- 覆盖
- 把用户空间分成一个固定区和若干覆盖区,将经常活跃的部分放在固定区,即将要访问的段放入覆盖区,其他放入外存,需要调用前将其调入覆盖区替换覆盖区中原有的段。
- 覆盖技术可用于单一连续区分配、固定分区分配中,也常用于虚拟存储技术中。
- 对换
- 把处于等待或被剥夺运行权利的程序从内存移到辅存,称为换出;把准备好竞争CPU的程序从辅存移到内存,称为换入。
- 进程在I/O操作时不可交换出主存,否则旧进程的I/O数据被新进程所使用,出现错误。
3. 连续分配存储管理方式
连续分配:为一个用户程序分配一个连续的内存空间
内碎片:给某进程的内存分区不完全能用到
外碎片:内存中有些空闲分区太小而无法用到
不会同时出现内碎片和外碎片
3.1 单一连续分配
-
概念:
内存在此方式下分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分;用户区给用户使用。用户区内存中只装有一道用户程序。 -
特点:
由于只有一道用户程序,该方式不具有并发性,且不存在多程序的访问越界问题,无需进行内存保护;该方式实现简单、开销小,但只能用于单用户、单任务的操作系统,且存储器利用率极低。 -
碎片:
由于只有一个分区,无外碎片,有内碎片
3.2 固定分区分配
-
概念:
将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业。当有空闲分区时,可从外存的后备作业队列中选择合适大小的作业装入分区。 -
分区方法:
- 分区大小相等。缺乏灵活性;
- 分区大小不等。分区分配表(始址、大小、状态等信息)。
- 特点:
是多道程序最简单的存储分配,可并发,但并发数固定;通过挂机就绪实现对内存的扩充;程序可能过大无法放进任何一个分区来运行;主存利用率低,程序小于内存分区造成主存空间的浪费。 - 固定分区在作业进入内存之后,其位置不再改变,所以在装入时可采用静态重定位方式。
- 碎片:
分区内部会产生内碎片,由于分区已经固定,不会产生外碎片。
3.3 动态分区分配
-
概念:
不预先划分内存,而是在进程装入内存时,根据进程的大小动态地建立分区,使分区大小适合进程的需要。 -
特点:
实现了动态分配内存,但随着时间的推移,会产生越来越多无法利用的小内存碎片,即外部碎片。可用紧凑技术(动态重定位机制)解决外部碎片;需对空闲空间进行记录方便进程使用。 -
空闲空间记录:
- 空闲分区表(始址、大小)
- 空闲分区链(内部有指向下一个空闲分区的指针)
-
碎片:
无内碎片,有外碎片 -
动态分区分配策略:
- 首次适应算法。空闲分区以地址递增的次序链接,分配内存时按顺序查找,找到大小能满足要求的第一个空闲分区。
- 最佳适应算法。空闲分区按容量递增的方式形成分区链,找第一个能满足的空闲分区。(缺点:导致更多的外碎片)
- 最坏适应算法。也称最大适应算法,空闲分区按容量递增的方式形成分区链,找第一个能满足的空闲分区,即最大的分区。(缺点:经过一段时间后无大分区可用)
- 邻近适应算法。也称循环首次适应算法,分配内存时从上次查找结束的位置开始继续查找。
3.4 伙伴系统(buddy)
整个可分配分区大小为2的幂次方,当需要的内存空间大于当前块的一半的时候就将整个分区分配给进程,如果小于当前分区的一半,就将当前分区对半分开,将其中一半继续与需要的内存大小进行比较,递归进行下去,直到满足所需内存大小大于分区一半。可以看到这种分配方式内部碎片最大为分区大小的一半减一。
x | buddy(x) |
---|---|
x%2^(k+1)=0 | x+2^k |
x%2^(k+1)≠0 | x-2^k |
4. 非连续分配存储管理方式
- 分页管理方式目的是提高内存的利用率,提升计算机的性能;
- 分段是为了用户和程序员,以满足方便编程、信息保护与共享、动态增长及动态链接等多方面的需要。
4.1 分页存储管理
-
分页:把主存空间划分为大小相等且固定的块,作为主存的基本单位;每个进程也以块为单位进行划分,进程在执行时以块为单位逐个申请主存中的块空间。
-
内存利用率:分页管理不会产生外部碎片,每个进程平均产生半个块大小的内部碎片,也称页内碎片。
-
一些基本概念
- 页面和页面大小:进程中的块称为“页”,内存中的块称为“页框”;页面大小为2的整数幂,页和页框的大小相同。
- 逻辑地址结构
如图所示,每页大小为4KB,地址空间最多允许2^20页 - 根据页面的地址结构可以发现,对主存进行访问,是以字或字节为单位进行访问的,如页号(块号)、页内偏移等,都是以字或字节为单位的。
- 页表:
- 系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表大都驻留在内存中。
- 在内存中查找页表时,对比页表项的状态位,看该页是否调入了内存,若没有调入内存则产生一个缺页中断,请求外存把该页调入内存。
- 基本地址变换机构
- 地址变换机构的任务是将逻辑地址转换为内存中的物理地址。
- 在系统中设置一个页表寄存器PTR,存放页表在内存的始址和页表长度,以减少访存的消耗,提高利用率。
- 每次访存操作都需要进行逻辑地址到物理地址的转换
- 进程未执行时,页表的始址和长度存放在本进程的PCB中,当程序调度某进程时才将这两项信息装入到PTR中。
- 存取一个数据需要进行两次访存:①访问页表,确定所存取数据的物理地址;②根据该地址存取数据。
- 具有快表的地址变换机构
- 快表:具有并行查找能力的高速缓冲寄存器(TLB),用来存放当前访问的若干页表项。
- 若在快表中找到匹配的块号,即所要访问的页表项在快表中,则直接从中取出该页对应的页框号,与页内偏移量拼接形成物理地址,仅需要一次访存。
- 若未找到,则访问主存中的页表,在读出页表项的同时将其存入快表,以便后续访问;如果快表已满则根据一定的规则进行替换。此过程需要两次访存。
- 多级页表
- 考虑页表的大小,进一步延伸页表的思想,可得到二级或多级分页。
- 若页表划分为N级,则需要访问内存N+1次。若系统有快表,则在快表命中时,只需访问1次内存即可。
- 为查询方便,顶级页表只能有一个页面,单个页表大小不得超过系统最大连续可分配单元,即单个页面的大小。PTR中只有页表的始址、长度,它默认页表是连续的,当页表大于一页时引入2级页表,同样地,2级页表超过单个页面大小,将引入三级页表。
4.2 分段存储管理
- 分段:按照用户进程中的自然段划分逻辑空间,段内必须是连续的,段间不要求连续,其逻辑地址由段号S和业内偏移量W两部分组成。
- 段表:每个进程有一张逻辑空间与内存空间映射的段表,记录段号、段长和本段在主存中的地址。
- 地址变换机构
- 为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度
- 与基本页式存储相同,进行一次数据的存取需要进行两次访存。
- 由于自然分段,段内连续段间不连续,所以会产生外部碎片,不会产生内部碎片。
- 信息共享与保护:
- 段的共享通过两个作业的段表中相应表项指向被共享的段的同一个物理副本来实现。
- 段的保护方法主要包括存取控制保护和地址越界保护。
4.3 段页式存储管理
- 分页和分段的主要区别:
- 页是信息的物理单位,是为实现离散的分配方式目的是提高内存的利用率,仅仅是系统管理上的需要;段是信息的逻辑单位,通常包含一组意义相对完整的信息,目的一般是满足用户的需要。
- 页的大小固定且由系统决定,直接由硬件实现;段的长度却不固定,它决定于用户编写的程序,通常根据信息的性质划分。
- 分页的用户程序地址空间是一维的,分页是系统的行为,用户程序的地址是属于单一的线性地址空间,只需用一个记忆符表示一个地址;分段的用户程序地址空间是二维的,既需得到段名,又需得到段内地址.
-
在段页式系统中,其地址结构由段号、段内页号及页内地址三部分所组成
-
在段页式系统中,为了获得一条指令或数据,须三次访存。①访问内存中的段表查到页表的起始地址;②访问内存中的页表找到页帧号,形成物理地址;③得到物理地址后,再一次访问内存,存取指令或者数据。
-
段页式系统的固定分配模式决定了它会产生外碎片。