【操作系统⑪】——存储管理(上)【分区存储管理 分页存储管理+详细样例】


☕️ 重点篇+1



此页非彼页… 📑

上一篇文章地址链接【操作系统⑩】——进程死锁【⭐️银行家算法+详细样例⭐️ 进程死锁的预防机制、避免机制、检测与解决】.
下一篇文章地址链接【操作系统⑫】——存储管理(下)【分段存储管理 虚拟存储管理 段页式存储管理方案 页面置换算法 OPT FIFO LRU】.

期末考试总复习——地址链接《操作系统期末总复习——绝地求生版》.


一、存储管理中的概念与概述

1.1 金字塔体系

在这里插入图片描述

  ● 储存管理是操作系统的重要组成部分,它负责管理计算机系统中的存储器资源。

  ● 存储管理主要是针对内存储器(简称内存、主存)的管理。内存是指中央处理机能够直接存取指令和数据的存储器。

在这里插入图片描述

  ● 内存空间有两部分
    ① 系统区:存放操作系统核心程序以及标准子程序等。
    ② 内存区:存放用户的进程和数据等,供当前正在执行的应用程序使用。

  ● 存储管理又主要是针对内存中的用户区域进行管理。


1.2 存储管理的目的和功能

  ● 目的
    ① 为用户使用存储器提供方便。(用户编程时不用关心程序所在内存空间的物理位置、物理分配)
    ② 充分发挥内存的利用率。(既为每个用户程序提供足够大的内存空间,又让尽可能多的用户程序并行)

  ● 功能
    ① 内存的分配与回收(合理地为多道程序分配内存空间,并在不需要时回收空间)
    ② 地址转换(即将逻辑地址转换成物理地址)
    ③ 信息的共享与保护(若干程序能共享某一内存空间,且防止各程序在执行中相互干扰)
    ④ 内存扩充(在不改变实际内存容量的前提下,借助大容量的外存来解决内存不够用的问题,即采用虚拟存储技术或交换技术)


1.3 存储分配的方式

  ● 存储分配的方式一般有两种:静态分配和动态分配。

  ① 静态分配:用户程序被编译程序加工形成目的程序后,由装配程序对其进行链接装入时,才能确定它在内存中相应的位置。(有点类似于 C 语言里面的数组,在一个作业【数组】装入内存时,必须分配其要求的全部存储量。如果不够,则不能装入。而且,在其运行过程中也不能在内存中移动,也不能再申请存储量。这就是“静态”)

  ② 动态分配:作业在内存中的位置、大小,虽然也是在其装入时确定的,但在其执行的过程中,可以根据需要动态地增加或归还存储空间。(类似于 C 语言里面的指针申请动态数组)现代操作系统常采用这种分配方式。


1.4 地址重定位

  ● 地址重定位(也称地址映射):指将相对地址(逻辑地址)转换为内存中绝对地址(物理地址)的工作。分为静态和动态重定位两种。

  ① 静态重定位:在程序装入内存后,且在运行前,一次将需要转换的逻辑地址转换为物理地址的操作。

在这里插入图片描述
  ◆ 说明:对于每个程序而言,仅在它运行之前做一次静态重定位,在运行期间不再进行重定位,也不允许对它做移动。如上图的例子所示:
    <1> 在地址空间 100 号单元处有一条指令 “LOAD 1, 500” ,它将实现:把 500 号单元中的数据 12345 传送到寄存器 1 中去。
    <2> 如果现在我们准备将该程序装入到内存单元 5000 ~ 5700 的空间。
    <3> 若用的是静态重定位操作,那么原 100 号单元中的指令将会被存放到内存中的 5100 号单元,该指令中的相对地址 500 也会相应地变成 5500。
    <4> 则以后在执行该程序时,CPU 是从绝对地址 5500 号单元中取出数据 12345,然后装入到寄存器 1 中。

  ① 动态重定位:在程序运行期间,每次访问内存之前都要进行的操作,它是考硬件地址变换机制实现的。通常采用一个重定位寄存器,其中存放当前正在执行程序的存储空间的起始地址。举例如下:

在这里插入图片描述
  ◆ 说明:该进程经过编译器,逻辑地址都是从 0 开始的。基址寄存器(Base address memory)若存放的1000,则从 1000 这个地址开始算起。绝对地址=(BR)+ VR(relative address)。功能和静态重定位的那个类似。



二、分区存储管理

  ● 分区存储管理的基本思想是给进入内存的用户作业(进程)划分一块连续的存储区域,把作业装入该连续存储区域,并且每道作业只能在其所占据的区域中运行,每一个内存区域称为分区。

  ● 根据划分分区的时机不同,它可分为固定分区和可变分区。

2.1 固定分区(已过时了,但还是要了解一下)

在这里插入图片描述

  ● 固定分区存储管理就是把主存中可分配的用户区域预先划分成若干个连续的分区,每个连续区的大小可以相同,也可以不同【如上图所示】。但是,一旦划分好分区之后,主存中分区的个数就固定了,且每个分区的大小也固定不变。所以叫固定分区,显然这是一种静态分区法。

  ● 每个分区可装入一个作业,由于主存中有多个分区,则可同时在每个分区中装入一个作业。所以,这种存储管理方式是适用于多道程序系统。

在这里插入图片描述

  ◆ 说明:显然为了管理主存空间的使用,必须设置一张“主存分配表”(分区说明表),用来说明各分区的分配情况。

在这里插入图片描述

  ◆ 说明:当作业队列中有作业要装入主存时,存储管理可采用 “顺序分配算法” 进行主存空间的分配。顺序查看主存分配表,找到一个标志为 “0” 的并且长度 ≥ 欲装入作业的地址空间长度 的分区就可以了。

在这里插入图片描述

  ◆ 说明:这种固定分区模式的地址转换一般采用静态重定位技术(如上图所示。当一个进程占有 CPU 执行时,操作系统就从内存分配表中取出其相应的地址和长度,换算后放入上限/下限寄存器)。如果内存需要扩充则采用覆盖技术 。

  ● 固定分区的优缺点也很明显。优点:实现简单,无外部碎片。缺点:a.当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采用覆盖技术解决,但这又会降低性能。b.会产生内部碎片,碎片多,导致大作业无法“塞”进来,内存利用率低。(目前已经基本上没有什么场合使用固定分区模式了)

2.2 可变分区

  ● 它与固定分区的区别就是:动态的划分分区。 具体地说就是这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要,因此系统分区的大小和数目是可变的。

  ● 在可变分区模式下,系统初启后,整个用户区是一个大的空闲分区。随着作业的装入、撤离,内存空间被分为许多个分区,有的分区被作业占用,而有的是空闲的。
    ① 当一个新的作业要求装入内存时,必须找一个足够大的空闲区来装它。如果找到的空闲区大于该作业需要的内存空间,则在作业装入前,系统会把空闲区分为两个部分,一部分分配给作业使用,另一部分又被分割成更小的一块空闲区。
    ② 当一个作业运行结束撤离时,它将归还自己先前占用的那部分内存空间,如果它归还的区域上下与其它空闲区域相邻,这会将它们一起合并成一个较大的空闲区。

  ● 举一个栗子:【在一个 256KB 的内存空间里进行如下操作】

在这里插入图片描述
  ◆ 说明:为了方便内存的分配和释放,内存分配表一般由两张表格组成,一张是已分配区表,另一张是未分配区表,如下图所示。两张表都对应上图中的(a)情况。

在这里插入图片描述

  ● 在分区管理中,空闲区可采用空闲区链表来进行管理。(当然也有其他管理方法)
    ① 每个内存空闲区的开头单元存放了本空闲区的长度以及下一空闲区的起始地址指针。
    ② 系统设置了一个指向第一块空闲区的地址指针。使用时,沿着链表查找即可。

在这里插入图片描述

  ● 可变分区模式一般采用动态重定位的方式来装入作业。当作业占用 CPU 运行时,操作系统可把该区域的开始地址和长度送入基址寄存器和限长寄存器。启动作业执行时,可由硬件根据基址寄存器进行地址转换得到绝对地址,如下图所示:

在这里插入图片描述


2.3 分配算法(也称分区算法)

  ● 由于在实施内存分配时,内存空间中的空闲区不止一个,所以在作业申请内情内存空间时,需要在其中选择一个来实施分配。选哪一个?怎么选好一点?就取决于分配算法。

2.3.1 首次适应算法(first fit)

  ● 算法原理:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
  ▲优点:实现简单,
  ▼缺点:可能将低地址处大的空闲区分割成许多小的空闲区,形成许多不连续的“碎片”。碎片长度可能不能满足作业要求,降低了内存利用率。

2.3.2 循环首次适应算法(next fit)

  ● 算法原理:在首次适应算法的基础上进行了点改进。该算法不再每次都从开始位置找查,而是在上一次找到的位置接着往下找。
  ▲优点:使存储空间的利用更加均衡,不致使小的空闲区集中在存储区的一端。
  ▼缺点:这会导致系统缺乏大的空闲区。


2.3.3 最佳适应算法(best fit)

  ● 算法原理:空闲分区按容量递增次序连接接。每次分配内存时顺序查找空闲分区表,找到大小能够满足要求的第一个空闲分区。
  ▲优点:尽可能地选择了最适合的分区空间。
  ▼缺点:但也因此产生大量的不能被使用的很小的空闲区。因此这种方法会产生很多的外部碎片。所以该算法分配效果不一定是最佳的。


2.3.4 最坏适应算法(worst fit)

  ● 算法原理:和最佳适应算法类似,只不是将空闲分区按容量递减的次序连接。每次分配内存时顺序查找空闲分区表,找到大小能够满足要求的第一个空闲分区。
  ▲优点:与最佳适应算法的缺点相比,该算法优先使用最大的连续空闲区,这样分配后的空闲区就不会太小,更方便使用。
  ▼缺点:当有大作业来临时,其对存储空间的申请往往得不到满足。


2.4 释放算法

  ● 当作业执行结束时,应回收已使用完毕的分区。一般有 4 种情况,如下图(a)所示【对于回收作业 A 而言】
在这里插入图片描述
  ◆ 说明:回收倒好说,主要是回收后,要进行相应的地址转换。比如说:
    ① 对于图(a)的第一种情况:回收后,合并分区(两个空闲分区组成的)的首地址将为上邻接空闲区的首地址,分区大小为二者之和。
    ② 对于图(a)的第四种情况: 回收后,回收分区应单独建立一张新表项,将回收分区的起始地址及大小填入表项中,并将其加入到未分配区表(或空闲分区链)中。因为这不像第一种情况,第一种情况回收前就有一个“空闲区”,而这种情况没有。


2.5 分区移动技术(也称紧凑技术)

  ● 若一个大作业申请装入,而系统中存在若干个较小的空闲分区,其总空闲分区的容量大于该作业的请求空间,但没有一个较小的空闲区大于这个空间时,系统不能将该作业装入内存。

  ● 为了解决这一问题,可采用移动技术(紧凑技术)来吧内存中的作业改变存放位置,同时修改它们的基址值和限长值等等,使分散的空闲区汇集成一个大空闲分区即可。

  ● 若运行作业在运行过程中在内存中移动,这必须采用动态重定位的方式。因为程序(和数据)的地址发生了修改。

在这里插入图片描述


2.6 覆盖与交换技术

  ● 覆盖与交换技术是在多道环境下,用以扩充内存的两种方法。

  ● 任何时刻,进程运行所必需的指令和数据都要保存在内存中。为了 “扩充” 内存,把进程的地址空间中的程序和数据放在外存中,而把当前需要执行的程序和数据放在内存里。这样,在内存和外存之间必然有一个数据交换的问题。

  ● 解决交换问题的一种方法是:用户程序自己附加信息进行控制。(覆盖技术)

  ● 解决交换问题的另一种方法是:由操作系统来控制完成。(交换技术)


2.6.1 覆盖技术

  ● 如下图所示,若某进程的程序正文由 A、B、C、D、E 和 F 这 6 个程序段组成。它们之间的调用关系如图(a)所示。程序段 A 只调用程序段 B 和 C,程序段 B 调用 D,程序 C 调用 E 和 F。因此,程序段 B 和 C 就无需同时在内存中,程序段 E 和 F 也是。因为不会同时运行的模块可以共享同一片区域。(比如说,A 要么是先调用 B 再调用 C,要么是先调用 C 再调用 B)。

  ● 若不进行覆盖,那么该进程的正文段所需要的内存空间为 A+B+C+…+F=200(KB),而采用覆盖技术后,只需要 100KB(10+40+50=100)
在这里插入图片描述

2.6.2 交换技术

  ● 指把内存中暂时不能运行的进程(或程序、数据)换出到外存,以腾出足够的内存空间,来运行需要运行的进程。

  ● 与覆盖技术相比,交换技术不要求编程人员给出程序段之间的覆盖结构。

  ● 交换技术的应用(多个进程之间分时共享内存储空间),可以在较小的存储空间中运行较多的作业或进程。而覆盖技术的应用(一个进程内部子程序之间分时共享内存储空间),可以在较小的存储空间中运行容量大的进程或作业。



三、页式存储管理(也称分页存储管理)⭐️⭐️

  ● 在分区存储管理中,不论采用什么方法都会出现碎片问题,从而降低了内存的利用率。而如果允许将一个作业分散地分配到许多不相邻的分区中,就好了。而页式技术就是其中的一种。

3.1 分页技术的相关名词

  ● (逻辑)页面:是作业逻辑地址空间(虚拟内存空间)的划分,是逻辑地址空间顺序等分而成的一段逻辑空间,并从 0 依次连续编号。页的大小一般为 512B~4MB 。页面也可简称为页。

在这里插入图片描述
  ◆ 说明:该逻辑地址有 32 位,其中高 20 位存储了(逻辑)页号,低 12 位存储了页内地址。

  ● 逻辑地址空间:以相同大小的(逻辑)页面作为基本单位进行组合而成的 “一张表” 称为(进程的)逻辑地址空间。

  ● 逻辑地址:逻辑地址 = 页号 + 偏移量(页面长度/页内地址)

  ● (物理)页框:把内存空间划分成大小相等的若干存储区域,每个区域称为一块,又称页框。从 0 开始连续编号。和上面那张图类似,也是高 … 位存储了(逻辑)页框,低 … 位存储了页内地址。

在这里插入图片描述

  ● 物理地址空间:以相同大小的(物理)页框作为基本单位进行组合而成的 “一张表” 称为(内存的)物理地址空间。

  ● 物理地址:物理地址 = 页框号 + 偏移量(页框长度/页内地址)

  ● 前几者之间的关系
    ① 进程中每个页被称为页面。
    ② 内存中的每个页被称为页框。
    ③ 页面大小 = 页框大小【即一个(物理)页框刚好能装下一个(逻辑)页面。】
    ④ 进程执行时需要占据物理地址空间,就是要为每个页面分配页框,所以页面和页框是一一对应。

  ● 页表:页表是在进程装入内存时,由系统根据内存分配情况自行建立的。系统会为每一个进程建立一张相应的页表。页表中装的是页面号和页框号,是一张“映射表”。如下图所示:

在这里插入图片描述

  ● 请求表:它用来确定进程的地址空间的各页在内存中的实际位置关系。它包含了以下信息,以方便内存分配和地址变换。请求表在整个系统中只有一张。

在这里插入图片描述

  ● 存储页面表:整个系统一张,指出内存各页框是否已被分配出去以及空闲页面的总数。存储页面表构成方法:位示图和空闲页面链表(我们讲位示图:在内存中划分一块固定存储区域,每个 Bit 代表一个页框。如果已被分配,则对应比特位置1,否则置0)
在这里插入图片描述


3.2 分页地址转换机制

  通过页表如何进行逻辑地址到物理地址的转换呢?进程的物理地址空间由连续变成分散后,如何保证程序正确执行呢?采用的办法是动态重定位技术,让程序的指令执行时能动态地进行地址变换。

  ● 系统中设置了一个页表控制寄存器,用来存放当前运行进程的页表起址和页表长度。

在这里插入图片描述

  ● “物理地址 → 逻辑地址”执行的大致流程:【 当一个进程开始运行的时候。注:在运行前它的程序和数据已经在内存中放好了】
    ① 系统首先会在请求表上找到该进程,并将该进程的页表始址和页表长度一起装载入页表控制寄存器中。
    ② 系统此时也会从逻辑地址空间获得一个逻辑地址(临时获取的)。
    ③ 然后系统将首先逻辑地址中的页号拿出来,并和页表寄存器里面的页表长度进行比对。
    ④ 如果页号比页表长度大,那就不行,产生“地址越界”。(即本次所访问的地址已超越进程的地址空间)
    ⑤ 如果该页号合理,则系统接下来会在页表中根据该页号找到相应的页框号。
    ⑥ 然后将 该页框号 和 逻辑地址里面的页内地址 一起拼装成最终的物理地址。

  ● 物理地址计算公式 物 理 地 址 = 页 框 号 × 页 长 + 页 内 地 址 物理地址=页框号\times 页长 + 页内地址 =×+(注:页长即页框大小,也是页面大小)


3.3 举例( 4 道例题来掌握 )

  ● 例题一【基本题】:考虑一个由 8 个页面,每页有 1024 个字节组成的逻辑空间,把它装入到有 32 个物理块的存储器中,问:(1)逻辑地址需要多少二进制位表示?(2)物理地址需要多少二进制位表示?

  ▶

	因为页面数为 8 = 2^3,故需要 3 位二进制数表示页号。每页有 1024 个字节,1024 = 2^10,于是页内地址需要 10 位二进制数表示页内地址;内存中有 32 个物理块,故需要 5 位二进制数表示块号(32 = 2^5)。
	(1)页的逻辑地址由页号和页内地址组成,所以需要 3 + 10 =13 位二进制数表示。
	(2)页的物理地址由块号和页内地址的拼接,所以需要 5 + 10 = 15 位二进制数表示。



  ● 例题二【中等题】:若在一个分页存储管理系统中,某作业的页表如下所示。已知页面大小为 1024 字节,试将逻辑地址 1011,2148,4000,5012 转化为相应的物理地址。

在这里插入图片描述
  ▶

	为了描述方便,设页号为 p ,页内位移为 d,则:
	(1)对于逻辑地址 1011,p=int(1011/1024)=0,d=1011 mod 1024=1011。查页表第 0 页在第 2 块,所以物理地址为1024*2+1011=3059。
	(2)对于逻辑地址 2148,p=int(2148/1024)=2,d=2148 mod 1024=100。查页表第2页在第1块,所以物理地址为1024*1+100=1124。
	(3)对于逻辑地址 4000,p=int(4000/1024)=3,d=4000 mod 1024=928。查页表第3页在第6块,所以物理地址为1024*6+928=7072。
	(4)对于逻辑地址 5012,p=int(5012/1024)=4,d=5012 mod 1024=916。因页号超过页表长度,该逻辑地址非法。


  ● 例题三【十进制形式,较难】:某系统采用分页式存储管理,页大小为 2KB。已知进程 A 的逻辑地址空间为 4 个页,内存分配如下页表所示,求逻辑地址 4832 对应的物理地址。(所有数据都是十进制)

在这里插入图片描述

  ▶

	首先页面大小 2 KB= 2048 B,所以:
	页号 = 逻辑地址 / 页大小 = 4832/2048 = 2【注:向下取整】
	页内地址 = 逻辑地址 % 页大小 = 4832 % 2048 = 736
	根据页表查得 2 号页对应着 25 号物理块
	物理地址 = 物理块号 * 页大小 + 页内地址 = 25 * 2048 + 736 = 51936



  ● 例题四【二进制形式,难】:某用户编程空间共 64 个页面,每页为 1KB,内存为 16KB。假定某时刻一用户页表中已调入内存的页面的页号和物理块号的对照表如下,则逻辑地址 0A5C(H) 所对应的物理地址是什么?
在这里插入图片描述

  ▶

	【这显然是一个十六进制逻辑地址,十六进制转化成二进制最方便】
	[1] 用户编程空间共 64 个页面,2^6=64,所以页号部分占 6 位,由 “每页为1KB”,且 1 K= 2^10,可知页内地址占 10 位。 
	[2] 逻辑地址 0A5C(H) 所对应的二进制表示形式是:0000 1010 0101 1100,后十位 1001011100 是页内地址,那么 000010 即为页号
	[3] 页号化为十进制是2,在对照表中找到页号2对应的物理块号是 9。9 转换二进制是 1001,物理地址 = 物理块号  + 页内地址
	     (+为组合的意思,不是做加法),组合之后即可求出物理地址为 1001 1001011100 ,化成十六进制为 265C(H)
	[4] 也就是逻辑地址 0A5C(H) 所对应的物理地址是 265C(H)


3.4 相联存储器与快表

  ● 在上述基本地址转换过程中,由于页表是存放在内存中的,这就使得 CPU 存取一个数据都需要访问两次内存。第一次查找页表将操作数的逻辑地址转换为物理地址,第二次访问内存才从得到的物理地址存取数据。因此计算机的处理速度降低了近一半。

  ● 为了缩短找查时间,提高地址变换速度,系统在地址转换机构中增设了一组具有并行查寻能力的高速寄存器组,称为相联存储器,构成一张快表。

  ● 快表仅存放当前访问最频繁的少量活动页表项。【根据程序局部性原理】

  ● 详细原理可参见《计算机组成原理》的 Cache 模块【关键字:命中率、LRU替换算法】。

  ● 地址转换机制
    ① 地址变换机构自动将页号与快表中的页号比较
    ② 快表存在所要访问的页表项时,直接读出对应的页框号
    ③ 快表中未找到对应的页表项时,则访问内存中的页表;同时将此页表项存入快表中,修改快表。
    ④ 若快表已满,则系统需替换出某些页表项。

3.5 页面(/页框)分配的宏观策略

在这里插入图片描述

  ◆ 说明:【当一个进程要申请内存空间时】
    ① 首先,计算所需要的页框数 n
    ② 查位示图,是否有 n 个空闲页框
    ③ 如果有足够的空闲页框,则该进程对应的页表长度设为 n,并填入(进程的控制块) PCB 中
    ④ 申请页表区,把页表始址填入请求表
    ⑤ 再分配 n 个空闲页框,将页框号和页号填入页表
    ⑥ 最后修改位示图



四、参考附录:

[1] 《操作系统A》
上课用的慕课
链接: https://www.icourse163.org/course/NJUPT-1003219004?from=searchPage.

[2] 《操作系统教程》
上课用的教材

[3] 《逻辑地址、物理地址、页、页框(帧)、页框号》
链接: https://blog.csdn.net/weixin_44124632/article/details/109640412.

[4] 《操作系统导论》学习笔记(六):逻辑地址空间管理
链接: https://blog.csdn.net/K_Xin/article/details/106463750.

[5] 挑战408——组成原理(15)——Cache块中的替换算法
链接: https://blog.csdn.net/redRnt/article/details/84075255.

上一篇文章地址链接【操作系统⑩】——进程死锁【⭐️银行家算法+详细样例⭐️ 进程死锁的预防机制、避免机制、检测与解决】.

下一篇文章地址链接【操作系统⑫】——存储管理(下)【分段存储管理 虚拟存储管理 段页式存储管理方案 页面置换算法 OPT FIFO LRU】.

期末考试总复习——地址链接《操作系统期末总复习——绝地求生版》.


⭐️ ⭐️

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值