0x13 内存管理(二)

四、页表结构

例子

一个具有32位逻辑地址空间的系统,页大小4KB(也就是212),那么一个页表最多可包含1M个表项(232/212=220)。
假设每个页表项4个字节,每个进程需4MB空间放页表,也就是1024个连续页面来存储页表本身。
显然需要这么多个连续页面来存放页表不一定能实现。

解决方法

  • 层次页表
    将页表划分为更小的部分,如两级页表就是将页表再分页。
  • 哈希页表
  • 反向页表

例子:4KB页大小的32位系统
一个逻辑地址被分为:
20位的页号,12位的页偏移
页表所在页被分页,页号被分为:
10位的页号,10位的页偏移
因此,逻辑地址表如下:
在这里插入图片描述
在这里插入图片描述
对于64位的逻辑地址空间的系统,两级页表的方案就不再适合了。

三级分页机制

设系统页大小为4KB(212),页表可由252个表项组成。
使用两级分页方案。内部页表p2用10位表示,即210个项。可用一页表示,外部页表有242项。
在这里插入图片描述

四级分页方案

Intel x86-64
仅用48位,页大小:4KB,2MB,1GB
在这里插入图片描述

哈希页表

通常地址空间 > 32位,虚拟页号被散列到一个页表中。这种页表的每一个条目都包括了一个链表元素,这些元素哈希成同一位置。
虚拟页号与链表中的每个元素相比较,找到匹配项。如果匹配,则相应的物理帧被取出。
每一个进程都有一个页表,该进程所用的每一页在页表中都有一项。

缺点:每个页表可能由多个表项,这些表可能占用大量的物理内存。

反向页表

为了解决这个问题,可以使用反向页表
对于每个真正的内存页或帧才有一个条目。每个条目保存在真正内存位置的页的虚拟地址,以及包括拥有这个页的进程的信息。

反向页表的地址空间中需要一个标识符以确保一个特定进程的一个逻辑页可以映射到相应的物理帧。

反向页表机制:

IBM RT系统
三元组:<进程id,页号,页偏移>
反向页表的条目:<进程id,页号>(其中进程id作为地址空间标识符)
由<进程id,页号>组成的虚拟地址送交到内存子系统,通过查找反向页表来寻找匹配项。
如果匹配找到,取出这个条目的表项号i,即为内存帧号,与页偏移结合得到物理地址。

由于反向页表按物理地址排序,而查找是很据虚拟地址,因此需要查找整张表来寻求匹配。虽然减少了需要储存每个页表的内存,但是当访问一个页时,增加了寻找页表需要的时间。
可以使用哈希表来将查找限制在一个或少数几个页表条目。

实现共享内存困难,共享内存通常通过多个虚拟地址映射为一个物理地址来实现。每个物理页只有一个虚拟页条目,所以一个物理页不可能有两个或更多的共享虚拟地址。

五、分段内存管理

分页内存管理的问题:用户视角的内存和实际物理内存的分离。
用户通常愿意将内存看成是一组不同长度的段的集合,段是逻辑上有意义的单位,而且段与段之间没有一定的顺序。

分段

支持用户观点的内存管理机制。
逻辑地址空间是由一组段组成的,每个段都有名称和长度。地址指明了段名称和段内偏移
所以逻辑地址由一个有序对组成:<段号,偏移>,这称为二维地址。
一个程序是一些段的集合,一个段是一个逻辑单位,如:
main program,procedure,function,local variables,global variables,common block,stack,symbol table,arrays

分段的逻辑视图

在编译用户程序时。编译器会自动根据输入程序来构造段。
如一个C语言编译器可能会创建如下段:代码、全局变量、维、钱、标准的库函数等。

分段机制(1)

一个逻辑地址是两个向量的集合:
<segment-number,offset>;

段表-映射二维用户地址,每个表项包括:

  • 基址 - 包含内存中段物理地址的起始地址;
  • 限长 - 指定段的长度;

段表基址寄存器(STBR)指向段表在内存中的地址;
段表限长寄存器(STLR)表明被一个程序所使用的段的数目;
如果段号s<STLR,段号s是合法的。

分段机制(2)

由于段的长度各不相同,内存分配是一个动态存储-分配问题,可采用可变分区方案来实现;

内存分配

  • 首先/最佳适应法
  • 外碎片问题

重定位

  • 动态
  • 由段表来执行

段共享

  • 段是逻辑上有意义的单位
  • 实现更方便
  • 比页共享更容易实现

分段机制(3)

保护,每个段表的表项有:

  • 有效位=0>非法段
  • 读/写/执行权利

保护位同段相联系,在段的级别进行代码共享。

段页式原理

分段和分页原理的结合;

先将用户程序分成若干个段,再把每个段分成若干个页,并为每个段赋予一个段号;

逻辑地址:<段号,页号,页内偏移>;
段号页号页内偏移
存在内碎片,无外碎片。

例子
当前程序被分为3段,每段又被划分为4K大小的页,主程序段被划分为4页,子程序段被划分为2页,数据段被分为3页。逻辑地址组成如图(b)所示。
在这里插入图片描述
Intel32位CPU简称IA32,64位的简称IA64,支持分段和段页式内存管理。

段页式方法简单来说,就是CPU产生的逻辑地址首先送入分段单元,生成线性地址,然后将线性地址交给分页单元,生成内存中的物理地址。分段单元和分页单元相当于内存管理单元MMU。

Intel386使用段页结合来进行二级分页的内存管理。

习题:
1.在段式存储管理中,一个段是一个( )区域。

A.定长的连续
B.不定长的连续
C.定长的不连续
D.不定长的不连续

B

2.段页式内存管理中,物理内存本质上是()的。

A.分段
B.分页
C.段页
D.这三个都不是

B

3.分段管理的突出的优点有()。

A.可以实现有意义的共享
B.用户可以使用覆盖技术
C.方便地址转换
D.程序不需要连续的内存

A、C、D

4.段式和页式存储管理的地址结构很类似,但是他们之间有实质上的不同,表现为( )。

A.页式的逻辑地址是连续的,段式的逻辑地址可以不连续
B.页式的地址是一维的,段式的地址是二维的
C.分页是操作系统进行,分段是用户确定
D.各页可以分散存放在主存,每段必须占用连续的主存空间

A、B、C、D

六、内存“扩充”技术

内存空间不足怎么办?

进程的虚拟地址空间大于系统能够提供的物理内存空间,前面提到的内存管理方案,连续内存分配、分页、分段管理都不能满足该要求,而直接拒绝该进程的运行。

内存“扩充”技术

所谓的内存“扩充”,并不是指增加系统的物理内存,而是指在现有的物理内存基础上,如何扩大内存的使用效率。
常用的内存扩充技术包括:紧缩、覆盖、交换和虚拟内存。

有一种情况:
尽管空闲内存的总量可以满足进程的需求,但这些内存碎片是不连续的,分散在不同的区域,这种情况可以采用我们前面可变分区管理中介绍过的紧缩技术,这实际上也是一种内存扩充技术。

覆盖技术

当程序大小超过物理内存总和时,所采用的内存扩充技术。
具体实现时,是指在程序执行过程中,程序的不同部分相互替换。
程序执行时:只在内存中保留那些在低何时间都需要的指令和数据。
由程序员声明覆盖结构,不需要操作系统的特别支持。

技术的优点
不需要操作系统的特别支持。
技术的缺点
覆盖结构的程序设计很复杂。

应用于早期的操作系统。

交换技术

在多道程序环境下

  • 在内存中的某些进程由于某事件尚未发生而被阻塞运行,但它却占用了大量的内存空间,甚至有时可能出现在内存中所有进程都被阻塞而迫使CPU停止下来等待的情况。
  • 另一方面,又有着许多作业在外存上等待,因无内存而不能进入内存运行的情况

存在问题

  • 浪费资源
  • 降低系统吞吐量

交换
把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上的备份区,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需的程序或数据,调入内存。

备份区——是一个固定的足够大的可以容纳所有用户内存映像拷贝的快速磁盘;必须提供对这些内存映像的直接访问

滚入,滚出——交换由于基于优先级的算法而不同,低优先级的进程被换出,这样高优先级的进程可以被装入和执行;

交换时间的主要部分是转移时间,总的转移时间直接同交换的内存的数量成正比;

交换较为耗时(100MB大约4s);

标准交换技术在现代操作系统中一般很少使用

常用策略:当空闲内存不够时采用交换

1.进程的哪些内容要交换到磁盘?

主要交换的内容应该是进程运行时创建或修改的内容,也就是栈或堆的内容,至于代码部分,由于不需要修改且在外存上有备份,由此不需要被交换出去保存,直接丢弃即可。

2.在磁盘的什么位置保存被换出的进程?

交换区(备份区):系统指定一块特殊的磁盘区域作为交换空间(swap space),包含连续的磁道,操作系统可以使用底层的磁盘读写操作对其高效访问。
不同的操作系统对交换区的叫法不一样,如Windows系统称为页文件pagefile。

3.何时需要发生交换?

一种是进程只要不用或者很少再用的就换出;
第二种使用更多的策略则是内存空间不够或有不够的危险时启动交换程序换出。lniux系统就是采用这种策略。

4.如何选择被换出的选程?

根据进程的各种属性
如,紧缩技术,有些选程在内存里是不能随意搬家的。
处于等待VO状态的选程也不能殖意被交换出去。

5.如何处理进程空间增长?
一般采用预留空间的方法。

猜你喜欢

转载自blog.csdn.net/ITmincherry/article/details/106694530
今日推荐