《现代操作系统(中文第四版)》笔记 第三章 内存管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq475703980/article/details/82533901

内存管理

3.1无存储器抽象

最开始并没有对存储器进行抽象,直接简单粗暴的使用物理内存地址,直接从0到某个上限值。每个地址可容纳一定的二进制位存储单元, 通常为8位。这个时期的组织内存的三种方式如下:

3.2 第一种存储器抽象:地址空间

地址空间的概念:是一个进程可以用于寻址的一套内存集合。通俗点讲,就是每个进程内部有自己的虚拟地址空间0-1023,然后这套虚拟内存空间再映射到真实物理空间(比如2048 - 3071)。

为了把内部虚拟地址空间转换为真实物理地址,就需要动态重定位, 典型的办法就是给CPU配置两个特殊寄存器,即基址寄存器界限寄存器。 进程加载到内存后,基址寄存器用来记录进程物理内存的开始位置, 界限寄存器用来保存程序的长度(也可理解为记录进程物理内存的结束位置)。

虚拟内存与交换技术:由于内存空间是有限的,假设内存是100M,运行一个程序内存是 30M,但是实际上我们可以同时打开4个,5个甚至更多程序,这就涉及到虚拟内存和交换技术了。虚拟内存就是假设我们的物理内存只有100M,但是实际的内存地址排到了200M,其中一段就是虚拟的。因为CPU任一时刻其实只能运行一个程序的, 利用这一点,当我们打开5个30M的进程,但是实际正在前台运行的只有其中一两个,那么暂未运行的就存回到硬盘,需要调度的时候再加载进内存。这就是在内存与硬盘间相互交换。 如下是进程加载到内存的示例图:

内存紧缩:如上图, 运行时间长了,进程间的内存就可能有小块未使用的空闲区,把小块合成一大块连续内存,就叫内存紧缩。但是会耗费大量CPU时间。

空闲内存管理

动态分配内存时,操作系统一般有两种方法跟踪内存使用情况:位图和空闲区链表。
原文地址

1.使用位图的存储管理

使用位图时,内存被划分为几个或几千个字节的单元,即位图中的一位,0表示空闲,1表示占用。如下:

其中阴影区表示空闲内存,图b 是一张位图。图a 一共有A/B/C/D/E 五个进程在运行。每个单元的大小很重要,单元越小,则位图越大, 单元越大,则位图越小。

2.使用链表的存储管理

上图c 则是用链表对内存进行管理,内存被划为很多内存段(每一段不不一定相等),连接起来就是一张链表,一共都四个域:1.指示标志(P表示空闲,H表示进程占用), 2、起始地址; 3.长度;4、指向下一个节点的指针。如下图:

刚开始时 A,X,B三个进程在运行,内存被划为为三段,如果X终止了,则内存还是三段,只是X原本占用的这一段就变为了空闲区(如图a)。如果进程X,B都终止了,则内存变为了两段(如图b),如果A,X,B全部终止,则进程就变为了一段,如图d.相对应的,在链表中的三个内存节点就变成了一个新的节点,老的三个节点被删除掉。

3.3 虚拟内存

为了解决程序大于内存本身的问题,提出了这么一种解决办法:把程序分割成很多片段,然后程序执行时,先执行第一块,然后执行第二块,这样,运行时,就只需要把程序的部分加载到内存即可,这个由操作系统动态的在内存和磁盘上换入换出,这个方法就就演变出了虚拟内存

虚拟内存:每个程序有自己的地址空间,把这个空间分割为多块,每一块称为一页或页面(page),每一页都有连续的地址范围,执行时这些页映射到物理内存。当程序执行哪一页时,硬件就去执行,从而不必把所有页都加载到内存。

程序自己的地址称为虚拟地址,它们构成了虚拟地址空间,虚拟地址通过内存管理单元(Memory Management Unit, MMU) 映射到物理内存地址上,从而被执行。示例图如下:

虚拟地址按照固定大小划分为若干个页面, 在物理内存中对应的单元称为页框(page frame),它们大小通常是一样的。可以理解为每个页框可以容纳一个页面。 如上图3-9, 虚拟页面16个,但是实际物理地址只有8个页框,如果程序要访问一个没有映射到物理页框的页面,就会产生缺页中断或称为缺页错误,操作系统就会把选择其中一个使用较少的页框,那上面的内容清除,用来加载需要访问的页面。

在实际硬件中,用一个“在/不在” 位(present/absent bit)来记录页面在内存中的情况,如0表示不再位, 1表示在位。

看示例图:

在有16个虚拟页面的情况下, 页表由16个虚拟页面组成,假如现在要把一个页面加载进物理内存, 高四位代表在页表的位置, 0010换成10进制就是2, 编号2的这个页面时在位的,并且高三位的物理地址就是110,再加上低12位,就组成了一个真实的物理地址 输出。 这就完成了16位虚拟地址到15位物理地址的转换。

页面的构成:页框号、在不/在 位, 保护位,修改位,访问位,高速缓存禁止位。

  • 保护位:指一个页允许什么类型的访问, 读、写、可读写。
  • 修改位:是否有修改过,修改过,则则需要先写入磁盘保存才能丢弃,如果没修改过,更换其他页面时,就可以直接丢弃了。
  • 访问位:是否正在访问、包裹读、写
  • 高速缓存禁止位:禁止告诉缓存。

针对大内存的页表, 有多级页表、倒排页表等,方便快速查找寻址。

3.4 页面置换算法

在发送缺页中断时,需要选择一个页面,将其换出内存,应该选择哪一个页面呢,有如下算法:
访问原文

  • 最优页面置换算法
  • 最近未使用页面算法
  • 先进先出页面置换算法
  • 第二次机会页面置换算法
  • 时钟页面置换算法
  • 最近最少使用页面置换算法
  • 工作集页面置换算法
  • 工作集时钟页面置换算法

针对他们的总结如下:

所以一般采用工作集时钟页面置换算法

猜你喜欢

转载自blog.csdn.net/qq475703980/article/details/82533901
今日推荐