操作系统学习笔记之——内存管理

内存管理

1、内存管理概念

内存管理的功能有:

  • 内存空间的分配与回收
  • 地址转换。程序中的逻辑地址与主存储器的物理地址不可能一样,因此存储器必须提供地址转换功能,把逻辑地址转换成物理地址。
  • 内存空间扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
  • 存储保护。保证各道作业在各自的存储空间内运行,互不干扰。

1.1、程序的装入与链接

创建进程首先需要将程序和数据装入内存。用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:

  • 编译。由编译程序将用户源代码编译成若干目标模块;
  • 链接。由链接程序将编译后的形成的一组目标模块及所需的库函数链接在一起,形成一个完整的装入模块;
  • 装入。由装入程序将装入模块装入内存运行。

在这里插入图片描述

程序的链接有以下三种方式:

  • 静态链接。在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后再不分开;
  • 装入时动态链接。在装入内存时,采用边装入边链接的方式;
  • 运行时动态链接。便于对目标模块的共享。

内存的装入模块在装入内存时,同样有三种方式:

  • 绝对装入。编译程序将产生绝对地址的目标代码。
  • 可重定位装入。静态重定位,装入时对目标中指令和数据的修改过程称为重定位,地址变换通常是在装入时一次完成的,所以称为静态重定位。
  • 动态运行时装入。动态重定位。地址转换推迟到程序真正要执行的时候才进行。需要一个重定位寄存器的帮助。

1.2、内存保护

内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程相互之间不受影响。内存保护可采取两种方法:

  1. 在 CPU 中设置一对上、下限寄存器存放用户作业在内存中的上限地址和下限地址
  2. 采用**重定位寄存器(或基址寄存器)界地址寄存器(限长寄存器)**来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值

1.3、覆盖与交换

覆盖与交换是在多道程序环境下用来扩充内存的方法

1.3.1、覆盖

覆盖的基本思想:由于程序运行时并非任何时候都要访问程序及数据的各个部分,因此可把用户空间分成一个固定区和若干个覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区的段。

1.3.2、交换

交换的基本思想:把处于等待状态的程序从内存移到辅存,把内存空间腾出来,这一过程称为换出把准备好竞争 CPU 运行的程序从辅存移到内存,这一过程称为换入

交换技术主要在不同的进程(或作业)之间进行,而覆盖则是用于同一个程序或进程中

1.4、连续分配的管理方式

连续分配是指为一个用户程序分配一个连续的内存空间,主要包括:单一连续分配、固定分区分配和动态分区分配

1.4.1、单一连续分配

内存在此情况下分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。这种方式无需内存保护,因为内存中永远只有一个程序

1.4.2、固定分区分配

它将用户内存空间划分为若干个固定大小的区域,每个区域只装入一道作业。固定分区分配在划分分区时有两种不同的方法:

  • 分区大小相等。
  • 分区大小不等。

为了便于内存分配,通常划分按大小排队,并为之建立一张分区说明表其中各表项包括每个分区的始址、大小及状态(是否分配)

1.4.3、动态分区分配

这种分区方法不预先划分内存,而是在进程装入内存时,根据进程的大小动态地建立分区,并使得分区大小刚好适合进程的需要。因此,系统中分区的大小和数目是可变的。但随着时间的推移,会产生很多的外部碎片。这些外部碎片会通过紧凑技术解决。

在进程装入或换入内存时,若内存中有多个足够大的空闲块,则操作系统必须确定分配哪个内存块给进程使用,这就是动态分配策略。考虑以下几种算法:

  • 首次适应算法。空闲分区以地址递增排序,分配内存时顺序查找,找到大小能够满足要求的第一个分区;
  • 最佳适应算法。空闲分区以容量大小排序;性能最差,会产生最多的外部碎片。
  • 最坏适应算法。空闲分区以容量递减排序;
  • 循环首次适应算法。由首次适应算法演变而来,分配内存时从上次查找结果的位置开始查找。

1.5、非连续分配管理方式

非连续分配允许一个程序分散地装入不相邻的内存分区。非连续分配管理方式根据分区的大小是否固定,分为分页存储管理方式分段存储管理方式

1.5.1、分页存储管理方式

分页的思想:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。会产生页内碎片,但容量会很小。

1.5.1.1、分页存储的几个基本概念:
  1. 页面和页面大小进程中的块称为页,内存中的块称为页框或页帧外存同样也以同样的单位进行划分,直接称为块。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这就产生了页和页框的一一对应。

    为了方便地址转换,页面大小都是 2 的整数幂。

  2. 地址结构。分页存储管理的逻辑地址结构:

    31 … 12 11 … 0
    页号 P 页内偏移量 W

    地址结构决定了虚拟内存的寻址空间有多大

  3. 页表。为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,它记录页面在内存中对应的物理块号,页表一般存在于内存中页表是由页表项组成,有两部分组成,第一部分是页号,第二部分是物理内存中的块号页表项的第二部分与地址的第二部分一起组成了物理地址页表的作用就是实现从页号到物理块号的地址映射

在这里插入图片描述

1.5.1.2、基本的地址转换

地址转换的任务是将逻辑地址转换成内存中的物理地址,地址转换是借助页表实现的。

在这里插入图片描述

在系统中通常设置一个页表寄存器(PTR),存放页表在内存的始址 F 和页表长度 M。进程未执行时,页表的始址和长度存放在进程控制块中,当进程执行时,才将页表始址和长度存入页表寄存器。设页面大小为 L,逻辑地址 A 到物理地址 E 的变换过程如下:

  1. 计算页号 P(P = A/L)页内偏移量 W(W = A%L),一般以十进制给出;
  2. 比较页号 P 和页表长度 M,若 P >= M,则产生越界中断,否则继续执行;
  3. 页表中页号 P 对应的页表项地址 = 页表始址 F + 页号 P * 页表项长度,取出该页表项内容 b,即物理块号。
  4. 计算 E = b * L + W,用得到的 E 去访问内存。

页式管理只需要给出一个整数就能确定对应的物理地址,因为页面大小 L 是固定的。因此,页式管理中地址空间是一维的

页式管理存在的两个主要问题:(1)每次访存操作都需要进行逻辑地址到物理地址的转换,地址转换过程必须足够快,佛否则访存速度就会降低;(2)每个进程引入页表,用于存储映射机制,页表不能太大,否则内存利用率会降低。

1.5.1.3、具有快表的地址转换

若页表全部放在内存,则存取一个数据或一条指令至少要访问两次内存;第一次是访问页表,确定所存取的数据或指令的物理地址;第二次是根据改地址存取数据或指令。为此,在地址变换机构中引入具有并行查找能力的高速缓冲存储器——快表,又称为相联存储器(TLB)用来存放当前访问的若干页表项,以加快地址变换速度

在这里插入图片描述

在具有快表的分页机制中,地址变换过程如下:

  1. CPU 给出逻辑地址后,由硬件进行地址转换,将页号送入高速缓冲寄存器,并将此页号与快表中的所有页号进行比较;
  2. 若找到匹配的页号,说明所要访问的页表在快表中,则直接从中取得该也对应的页框号,与页内偏移量组成物理地址。这样,一次访存便可完成;
  3. 若未找到,则需要访问主存中的页表。

1.5.2、基本分段存储管理方式

分页存储方式是从计算机的角度考虑的,目的是提高内存的利用率,分页通过硬件实现,对用户完全透明。分段存储管理方式的提出则是考虑了用户和程序员,以满足方便编程、信息保护与共享、动态增长及动态链接等需要。

1.5.2.1、分段

段式管理方式按照用户进程中的自然段划分逻辑空间。段内要求连续,段间不要求连续,因此整个作业的地址空间是二维的。

31 … 16 15 … 0
段号 S 段内偏移量 W

段号和段内偏移量必须由用户显式提供

1.5.2.2、段表

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

段号 段长 本段在主存中的始址

在这里插入图片描述

1.5.2.3、地址变换

段表项其实只有两部分:段长 C 和内存始址

在这里插入图片描述

  1. 从逻辑地址 A 中取出前几位为段号 S,后几位为段内偏移量 W,一般以二进制给出;
  2. 比较段号 S 和段表长度 M,若 S >= M,则产生越界中断,否则继续执行;
  3. 段表中的段号 S 对应的段表项地址 = 段表始址 F + 段号 S * 段表项长度,取出该段表项的前几位得到段长 C。若段内偏移量 >= C,则产生越界中断,否则继续执行。
  4. 取出段表项中该段的始址 b,计算 E = b + W,用得到的物理地址 E 去访存。
1.5.2.4、段的保护与共享

在分段系统中,段的共享是通过两个作业的段表中相应的表项指向被共享的段的同一个物理副本来实现的当一个作业正在从共享段中读取数据时,必须防止另一个作业修改此共享段的数据。不能修改的代码称为纯代码或可重入代码(它不属于临界资源),这样的代码和不能修改的数据可以共享。

1.5.3、段页式存储管理

作业的地址空间首先被分成若干个段,段内分页

在这里插入图片描述


2、虚拟内存管理

2.1、虚拟内存管理的概念

基于局部性原理在程序装入时,将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序。在执行程序过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了比实际内存大的存储器,称为虚拟存储器虚拟内存是建立在离散分配的内存管理方式之上的

2.2、请求分页存储管理方式

2.2.1、页表机制

页号 物理块号 状态为 P 访问字段 A 修改位 M 外存地址
  • 状态位 P:是否被调入内存;
  • 访问字段 A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供置换算法参考;
  • 修改位 M:标识该页在调入内存后是否被修改过;
  • 外存地址:用于指出该页在外存上的地址,供调入时参考。

2.2.2、缺页中断机制

当所要访问的某页不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。为此将缺页的进程阻塞(调页完成唤醒),若内存中有空闲块,则分配一个块,并修改其页表项;若没有空闲块,则要淘汰某页。

缺页中断作为中断与一般中断不同的是:

  • 在指令执行期间而非一条指令执行完成后产生和处理中断信号,属于内部中断;
  • 一条指令在执行期间,可能产生多次缺页中断。

2.2.3、地址变换机构

在地址变换时,先检索快表:

  • 若找到要访问的页,则修改页表项的访问位,然后利用页表项给出的物理块号和页内地址形成物理地址;
  • 若找不到要访问的页,则应到内存中去查找页表,再对比页表项中的状态位 P,看该页是否已调入内存,未调入则产生缺页中断,请求从外存把该页调入内存。

2.3、页面置换算法

2.3.1、最佳(OPT)置换算法

顺序扫描最后一个出现的页面,在最长时间内不再出现的页面。该算法无法实现。

2.3.2、先进先出(FIFO)置换算法

优先淘汰最早进入内存的页面

2.3.3、最近最久未使用(LRU)置换算法

逆向扫描最后一个出现的页面,选择最近最长时间未访问的页面淘汰。

2.3.4、时钟(CLOCK)置换算法

简单的 CLOCK 置换算法给每帧关联一个附加位,称为使用位。当某页首次被调入内存时,将该帧的使用位置为 1;当该页随后再被访问到,其使用位也被置为 1。当需要替换某一页时,操作系统扫描缓冲区,查找使用位为 0 的一帧调出。若全为 1,则指针在缓冲区循环一周,并将所有的使用位置为 0,替换最初位置上的页。

改进型 CLOCK 置换算法,又增加了一位修改位。置换过程如下:

  1. 找(0,0),即没访问没修改的页
  2. 找(0,1),访问位置为0,没访问修改的页
  3. 找(0,0),访问但没修改的页
  4. 找(0.1),访问且修改的页

2.4、页面分配策略

2.4.1、驻留集大小

  1. 固定分区局部置换。它为每个进程分配一定数目的物理块,在整个运行期间都不改变。若进程发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后调入需要的页。锁定的物理块
  2. 可变分区全局置换。它为系统中每个进程分配一定数目的物理块,操作系统自身还保留一个空闲物理块。当某进程发生缺页时,系统从空闲物理块中取出一个物理块分配给该进程,并将缺的页调入。未锁定的物理块,只要缺页就分配物理块
  3. 可变分区局部置换。它为进程分配一定数目的物理块,当某个进程发生缺页时,只能从该进程的页面中换出;若进程频繁地发生缺页,则系统再为该进程分配若干物理块。半锁定的物理块,根据发生缺页的频率来动态增加或减少物理块

2.4.2、调入页面的时机

  1. 预调页策略运行前一次调入若干相邻的页。
  2. 请求调页策略运行中需要访问时调入。

2.4.3、从何处调入

请求分页系统中的外存分为两个部分:用于存放文件的文件区和用于存放对换页面的对换区对换区通常采用的是连续分配方式,而文件区采用离散分配方式

  1. 系统拥有足够的对换区空间。从对换区调入调出。
  2. 系统缺少足够的对换区空间。凡不会被修改的文件都直接从文件区调入,而可能被修改的部分,在将它们换出时调到对换区,以后需要时从对换区调入。
  3. UNIX 方式。与进程有关的文件都放在文件区,故未运行过的页面都应从文件区调入。曾经运行过但又被换出的页面,由于放在对换区,因此下次调入时应从对换区调入。

2.5、抖动

在页面置换过程中,有一种和糟糕的情况:刚刚换出的页面马上就又要换入内存,刚刚换入的页面又马上要换出内存,这种频繁的页面调度称为抖动或颠簸。抖动的主要原因是:某个进程频繁访问的页面数目高于可用的物理页帧数目

2.6、工作集

工作集指的是某段时间内,进程要访问的页面的集合工作集由时间 t 和工作集窗口大小决定

。与进程有关的文件都放在文件区,故未运行过的页面都应从文件区调入。曾经运行过但又被换出的页面,由于放在对换区,因此下次调入时应从对换区调入。

猜你喜欢

转载自blog.csdn.net/qq_36879493/article/details/107976283