操作系统之内存管理

330 阅读17分钟

内存管理

image-20210603095548207

非空闲内存管理

知识点

地址空间

地址空间是进程可以用来寻址内存的地址集。

每个进程都有自己的地址空间,但是某些进程会希望可以共享地址空间。

基址寄存器和变址寄存器

当使用基址寄存器和变址寄存器时,程序会装载到内存中的连续位置并且在装载期间无需重定位。当一个进程运行时,程序的起始物理地址装载到基址寄存器中,程序的长度则装载到变址寄存器中。

基址寄存器:存储数据内存的起始位置

变址寄存器:存储应用程序的长度

image-20210603104238706

用户源程序变为一个可在内存中执行的程序需经过哪些步骤?
  • 编译(由编译程序对源程序进行编译,形成目标模块),
  • 连接(由链接程序将编译后的模块和库函数链接),
  • 装入(由装入程序装入内存
程序装入的方式
  • 绝对装入: 给出绝对地址,将装入模块直接装入指定内存即可,其逻辑地址和实际内存地址完全相同,无需进行地址变换。只适用于单道程序环境。
  • 可重定位装入方式:在装入时逻辑地址和实际地址不同,需要对逻辑地址进行改变,其地址变换在装入时一次性完成,之后不在变换。
  • 动态装入:在装入模块到内存后,不立即把模块中的逻辑地址转换为物理地址,将转换推迟到程序运行时才进行,其装入地址都是逻辑地址,需要重定位寄存器的支持。
重定位、静态重定位、动态重定位
  • 重定位:装入时对目标程序中指令和数据地址的修改过程
  • 静态重定位:地址变换在装入时一次性完成,之后不在变换
  • 动态重定位:将地址转换推迟到程序真正要运行时才进行
内存的连续分配方式有哪些?
  • 单一连续分配:整个内存的用户空间由该程序独占
  • 固定分区分配:将整个用户空间划分为多个固定大小(分区大小可等可不等)的区域,每个区域中只装入一道作业
  • 动态分区分配:根据进程的实际需要,动态分配内存空间
  • 动态可重定位分区分配:根据进程的实际需要,动态分配内存空间,并且一个程序必须被装入连续内存空间中
基于顺序搜索的动态分区分配算法有哪些,算法的主要思想是什么?
  • FF,首次适应算法,要求空闲分区链按照地址递增次序链接,从首地址开始查找,直到找到一个大小可满足的空闲分区
  • NF,循环首次算法,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个大小可满足的空闲分区
  • BF,最佳适应算法,找到满足要求且是最小的空闲分区分配,为了加快查找,要求空闲分区按照容量递增排序
  • WF,最坏适应算法,找到满足要求并且是最大的空闲分区分配,要求空闲分区按照容量递减顺序排序,查找时只看第一个分区是否满足
对换
定义:

将内存中暂时不能运行的程序调到磁盘的对换区,同时将磁盘上能运行的程序调入内存

对换类型:

整体对换(进程对换),以进程为单位,需要系统支持功能对对换空间的管理进程的换入进程的换出

页面(分段)对换,以进程的一个页面或者分段为单位,有称部分对换,其目的是支持虚拟存储系统

对换空间的管理

文件区用于存放各类文件,对换区用于存放从进程换出的进程

  • 目标
    • 对文件区的目标--提高文件存储空间的利用率,然后才是提高对文件的访问速度
    • 对对换空间管理的目标--提高进程换入换出的速度,然后才是文件存储空间的利用率
  • 数据结构
    • 空闲分区链,每个表目中包含对换区的首地址和大小,分别用盘块号和盘块数目表示

image-20210603104746087

image-20210603105904816.png

image-20210603105926249.png

image-20210603105951758.png

image-20210603110230979 image-20210603110627325

基本分页管理原理、地址变换过程
1.原理
  • 将用户程序的地址空间分为若干个固定大小的区域,称为“页面”或者“页”
  • 页内碎片:进程的页面没有装满,形成的不可用碎片
  • 页面大小:通常为1KB~8KB
  • 地址结构:页面号P+位移量W(即为页内地址),P可算地址空间的页面数目,W可算每页的大小
    • (P=INT[ \frac{A}{L}]),(d=[A] MOD L)
    • 其中P为页面号,L为页面大小,d为页内地址,A为逻辑地址
  • 页表:分页系统中允许将进程的各个页离散地存储在内存的任一物理块中,为每个进程建立一张页面映像表,简称页表,实现从页面号到物理块号的地址映射
2.地址变换机构

实现从逻辑地址到物理地址的变换,借助页表来完成

  • 基本地址变化机构
    • 只设置一个页表寄存器(PTR,Page-Table Register),存放页表在内存中的起始地址和长度
    • 访问数据时,将有效地址(相对地址)分为页号和页内地址,用页号检索页表,检索之前页号和页表长度比较,防止地址越界。如果没有越界,则将页表起始地址转换为该表项在页表中的位置,得到物理块号,装入物理地址寄存器,同时,将页内地址送入物理地址寄存器的块内地址字段中。
    • 页表在内存中,CPU存取一个数据时候需要两次访存,第一次是访问内存中的页表,找到对应页的物理块号,将块号和页内偏移量拼接形成物理地址。第二次访问是从第一次所得地址中获得所需要的数据(或者向其中写入数据)
  • 具有快表的地址变换机构
    • 提高访问速度,设置相联寄存器(Associative Memory),也就是快表,用于存放当前访问的页表项。这样可以直接从快表中读出该页所对应的物理块号。如果快表已满,则OS必须找到不再需要的页表项将其换出。
3.访问内存的有效时间

从进程发出指定逻辑地址的访问请求,经过地址变换,到内存中找到对应的实际物理单元取出数据的总时间。

image-20210603150411499

image-20210603153121298.png

image-20210603154225229.png

任何带有分页的系统都会面临两个主要问题:

  • 虚拟地址到物理地址的映射速度必须要快
  • 如果虚拟地址空间足够大,那么页表也会足够大
加速分页机制

image-20210603162216056.png

image-20210603162311836.png

image-20210603162558891.png

image-20210603163524156.png

image.png

image-20210603164335509.png

image-20210603164906375.png

大内存的页表

多级页表

image-20210603165141104.png

image-20210603165248208.png

image-20210603165430757.png

image-20210603170353776.png

分段系统的基本原理、地址变换过程
1.段存储管理方式的引入原因

主要满足用户和程序员以下需求:

[1]、方便编程

用户把自己的作业按照逻辑管理划分为若干段,每个段都是从0开始编址,并有自己的名字和长度。因此,希望要访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定的。

[2]、信息共享

在实现对程序和数据的共享时,是以信息的逻辑单位为基础的。分页系统中的页只是存放信息的物理单位(块),并无完整的意义,段却是信息的逻辑单位。为了实现段的共享,希望存储管理能与用户程序分段的组织方式相适应。

[3]、信息保护

[4]、动态增长

有些段,会随着程序的使用不断增长。而事先又无法确切地知道数据段会增长到多大。

[5]、动态链接

动态链接是指在作业运行前,并不把几个目标程序段链接起来。要运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过程中有需要调用某段时,才将该段调入内存并进行链接。可见动态链接也要求以段作为管理的单位。

2.分段系统的基本原理

段号+段内地址

段号可算一个作业最长有多少个段,段内地址可算每个段的最大长度

在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息

3.段表

在系统中为每个进程建立一段映射表,简称“段表”。每个段在表中占有一个表项。其中记录了该段在内存中的起始地址(基址)和段的长度。段表可以存放在一组寄存器中,以提高访问速度,但更常见的是将段表放在内存中。

在配置了段表后,执行中的进程可通过查找段表找到每个段所对应的内存区。

段表是用于实现从逻辑段到物理内存区的映射。

4.地址变换机构

为了实现进程逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表起始地址段表长度TL。在进行地址变换时,系统将逻辑地址中的段号S与段表长度TL进行比较。若S>TL,表示段号太大。访问越界,于是产生越界中断信号;若未越界,则根据段表的起始地址和该段的段号+段内地址从而到的要访问的内存物理地址。

段表放在内存中时,每次访问一个数据都要两次访存,解决方法和分页系统类似,设置一个相联寄存器,来保存最近常用的段表项。

分页与分段的主要区别

a)、页是信息的物理单位,分页是为实现离散分配方式,其目的是消减内存的外零头,提高内存的利用率;分段中的段则是信息的逻辑单位,它含有一组其意义相对完整的信息,分段的目的是为了能更好地满足用户的需要。

b)、页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。

c)、分页的作业地址空间是一维的,分页完全是系统行为,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,分段是用户行为,程序员在标识一个地址时,既要给出段名,又要给出段内地址。

段页式存储管理的基本原理、地址变换过程
1.基本原理

先将用户程序分段,在段内进行分页,为每一个段赋予一个段名。在段页式系统中,其地址结构由段号、段内页号及页内地址三部分所组成。

2.地址变换过程

配置一个段表寄存器,其中存放段表起始地址和段表长TL。比较段号与TL是否越界,从段表寄存器中获取段表始址找到段表,根据段表内的页表始址找到对应的页表,在根据页表的存储块找到内存中的物理块,从而获取物理地址。

3.访存次数

段页式系统中,为了获得一条指令或数据,须三次访问内存:

① 访问内存中的段表,从中取得页表始址

② 访问内存中的页表,从中取出该页所在的物理块号,并与页内地址形成物理地址

③ 访问真正从第二次访问所得的地址中,取出指令或者数据

多次访问内存,执行速度降低,因此在地址变换机构中增设一个高速缓冲寄存器。每次访问它时,都须同时利用段号和页号去检索高速缓存,若找到匹配的表项,便可以从中得到相应页的物理块号,用来与页内地址一起形成物理地址;若未找到匹配表项,则仍需要再三次访问内存。

空闲内存管理

监控内存的方式

  • 位图(bitmap)
  • 空闲列表(free lists)

使用位图的存储管理

image-20210603112615254.png

image-20210603112634600.png

image-20210603112806440.png

使用链表的存储管理

image-20210603113801950.png

image-20210603113916283.png

image-20210603113937067.png

image-20210603114414060.png

虚拟存储器管理

局部性原理

概念

程序在执行时出现的局部性规律,即在一较短时间内,程序的执行仅仅局限于某个部分,相应地,它所访问的存储空间也局限与某个区域。

表现

空间局限性:程序在一段时间内所访问地址可能集中在一定的范围内,其典型情况是程序的顺序执行

时间局限性:程序中的某条指令(数据)被执行(访问),不久后该指令可能再次被执行(访问)。产生的典型原因是在程序中存在大量的循环操作。

虚拟存储器的定义与特征

定义

虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。

特征
1.多次性

程序被允许分成多次装入内存

2.对换性

允许将暂不使用的代码和数据从内存中调至外存的对换区

3.虚拟性

能从逻辑上扩充内存容量,使得用户看到的内存容量远大于实际内存容量

image-20210603144247371.png

image-20210603144305638.png

请求分页存储管理方式的原理与硬件

原理

在分页系统的基础上增加了请求调页功能页面置换功能所形成的页式虚拟存储系统,允许用户程序只装入少数页面的程序和数据即可启动运行,通过上述功能将即将运行的页面调入内存,同时将暂不运行的页面换出到外存。

硬件支持
1.请求分页的页表机制

在纯分页的页表机制上增加其他字段形成的数据结构,用于将逻辑地址转换为物理地址

2.缺页中断机构

每当用户程序需要的页面不再内存中,就产生缺页中断

3.地址变换机构

页面置换算法(Opt,FIFO,LRU),缺页率计算

1-Optimal算法

选择的被淘汰页面是以后永远不使用的,或者是在最长(未来)时间内不再被访问的

2-FIFO

总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰

3-LRU

选择最近最久未使用的页面进行淘汰

0.硬件支持

LRU需要为每个内存页面配置一个移位寄存器,来记录进程在内存中的各个页面使用情况

LRU还需要用一个特殊的栈来保存当前使用的各个页面的页面号

image-20210603171711521.png

image-20210603172153610.png

image-20210603172437301.png

image-20210603172549283.png

image-20210603172715404.png

image-20210603175839525.png

image-20210603180739545.png

image-20210603182713481.png

请求分段存储管理方式的原理与硬件

原理

请求分段系统中,程序在运行之前,只需要调入少数几个分段(不必调入所有的分段)就可以启动运行。当所访问的段不在内存中时,可请求OS将所缺的段调入内存。

硬件支持
1.请求段表机制

在请求分段式管理中所需要的主要数据结构是请求段表

2.缺段中断机构

每当发现程序要访问的断不再内存中,就有缺段中断机构产生一个中断信号,由OS将所需段调入内存。 在一条指令的执行期间产生和处理中断,可能发生多次中断,但不可能出现一条指令被分割在两个段中。

3.地址变换机构

被访问的段不再内存时,需要地址变换。具体做法是先将所缺的段调入内存,并修改段表,然后利用段表进行地址变换。

分段的共享与保护

共享段表

记录了共享段的段号,段长,内存起始地址,状态(存在位),外村起始地址,共享进程计数(count)

共享段的分配与回收
1.共享段的分配

当第一个使用共享段的进程提出请求时,由系统为该共享段分配一物理区,并调入该共享段,同时修改相应的段表(该段的内存地址)和共享段表,把 count 置为 1。当其它进程需要调用此段时,不需再调入,只需修改相应的段表和共享段表,再执行 count :=count+1 操作。

2.共享段的回收

当共享共享段的某进程不再使用该共享段时,修改相应的段表和共享段表,执行 count :=count-1 操作。当最后一共享此段的进程也不再需要此段时,则系统回收此共享段的物理区,同时修改共享段表(删除该表项) 。

分段管理的保护
1.地址越界保护

先利用段表寄存器中的段表长度与逻辑地址中的段号比较,若段号超界则产生越界中断。

再利用段表项中的段长与逻辑地址中的段内位移进行比较,若段内位移大于段长,也会产生越界中断。

注:在允许段动态增长的系统中,允许段内位移大于段长。

2.访问控制保护(存取控制保护)

在段表中设置存取控制字段,用于规定对该段的访问方式。

3.环保护机构

环保护机构是一种功能较完善的保护机制。在该机制中规定:低编号的环具有高优先权。

OS 核心处于 0 环内;某些重要的实用程序和操作系统服务占居中间环;而一般的应用程序则被安排在外环上。

在环系统中,程序的访问和调用应遵循一定的规则:

  • 一个程序可以访问同环或较低特权环的数据
  • 一个程序可以调用同环或较高特权环的服务

产生抖动的原因

同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,使得每个进程在运行时,频繁地出现缺页,必须请求系统调页,这样使得进程大部分时间用于页面置换,处理机效率急剧下降。