操作系统面试—内存管理

本文是对操作系统概念(第七版)——内存管理的学习总结,不足之处欢迎批评指正。

首先我们区分什么是逻辑地址空间和物理地址空间。

逻辑地址空间:cpu所生成的地址,逻辑地址又称为虚拟地址。

物理地址:内存单元所看到的地址(加载到内存寄存器中的地址)。

运行是从虚拟地址到物理地址的映射是由内存管理单元(MMU)的硬件设备来完成的。

现在有两个不同的地址,逻辑地址0~max,物理地址R~R+max。

内存分配策略


1、连续内存分配

最为简单的内存分配方法之一就是将内存分为多个固定大小的分区,每个分区只能容纳一个进程。从分区中如何选择满足进程要求的内存块呢?最常用的有三个策略:

(1)首次适应(第一块满足要求)

(2)最佳适应(最小的足够大的)

(3)最差适应(最大的)

三种策略的分析:

首次适应和最佳适应都有外部碎片问题。外部碎片问题:当所有总的可用内存之和可用满足请求之和,但并不连续时就会出现外部碎片。

内部碎片:通常内存单元是以块为单位,进程所分配的可能比所需要的要大。

我们先讨论如何解决外部碎片问题。

第一种解决方法:紧缩。紧缩的目的是移动内存内容,以便所有空闲空间合并成一整块。

第二中解决方法:允许物理地址空间非连续。常见的有分页和分段。


2、分页

实现分页的基本方法涉及将物理内存分为固定大小的块,称为帧;逻辑内存也分为固定大小,称为页。

分页的实现为:

cpu生成逻辑地址,改地址包含两个部分:页号(p)和页偏移(d)。页号作为页表的索引。页表的内容是每页所在物理内存的基地址,这些基地址和页偏移的组合形成了物理地址。

通常页大小是由硬件决定的,页的大小通常为2的幂,如果逻辑地址空间为2^m,且页的大小为2^n单元(字节或字),那么逻辑地址的高m-n为表示页号,第n为表示页偏移。由于物理地址非连续,所以分页是不会产生外部碎片,但是由于页的大小是由硬件决定的,所以分页也有内部碎片。

分页的一个重要特点是用户视角的内存和实际的物理内存的分离。

分页的硬件支持:

引入转换表缓冲区(TLB),下图是从其他地方截图得到的,若侵犯版权,请告知。


3、页表结构

提出的原因:以及分页页表太大。

(1)层次页表

二级分页算法(页表号1+页表号2+页偏移)

(2)哈希页表

哈希页表以虚拟页码为哈希值,哈希页表中的每一条目都包括一个链表的元素,这些元素哈希成同一位置。每个元素有3个域:虚拟页码,所映射的帧号,指向链表元素的下一个指针。

操作系统面试—内存管理_第1张图片

具体工作流程:虚拟地址中的虚拟页号转换到哈希表中,用虚拟页号和链表中每个元素的第一个域进行比较,如果匹配,那么相应的帧号用来形成物理地址,否则继续查找。

(3)反向页表

反向页表对于每个真正的内存页或帧才有一个条目。每个条目包含 保存在真正内存位置的页的虚拟地址以及拥有该页的进程的信息。因此,整个操作系统只有一个页表,对每个物理内存的页只有一条相应的条目。

操作系统面试—内存管理_第2张图片

pid是进程id。

反向页表的问题:

1、虽然减少了内存存储空间,但是增加了查找页表的时间。这是因为反向页表是按照物理地址排序(见上图),而查找是根据虚拟地址,所以可能需要查找整个表来寻求匹配。

2、在实现共享内存时存在困难。


4、分段

前面我们提到:采用分页内存管理有一个不可避免的问题:用户视角的内存和实际物理内存的隔离,用户视角的内存需要映射到物理内存。

分段:逻辑地址空间是由一组段组成的,每个段都有名称和长度,地址指定了段内名称和段内偏移。因此用户通过两个量来指定地址:段名称和段偏移(而分页中用户指定一个地址,由硬件分为页码和页偏移,这些程序员是看不见的)。

为了简单起见,段名称是编号的,因此逻辑地址是由段号和段偏移组成的。<段号,段偏移>

这里总结一下段和页的区别:

1、页是信息的物理单位,段是逻辑单位。

2、页的作业地址是一维的,段是二维的。

3、页的长度由系统决定,是等长的,而段是不等长的。

段表:将二维地址映射到一维地址。

段表的条目都有段基地址和段界限。




你可能感兴趣的:(数据结构与算法)