代码炼金工坊

操作系统概论-内存管理

存储器的层次结构

L0 ~ L2 在 CPU 中。

每一层级的存储器保存来自下一层级的存储器信息。

局部性原理

在一段较短时间内,程序的执行仅限于某个部分,相应地,它锁访问的存储空间也局限于某个区域。

  • 时间局部性
  • 空间局部性

程序的链接和装入

链接:将编译后的目标模块装配成一个可执行程序

链接的分类:

装入方式:

连续分配存储管理方式

空闲分区链:动态地为每一个分区建立一个结点。分区起始地址,分区大小,指向前一个空闲分区结点的指针,指向后一个空闲分区结点的指针

动态分区分配算法:

动态分区的分配流程:

动态分区的回收流程:

基本分页存储管理方式

基本原理

页:将一个进程的 逻辑地址空间 分成若干个大小相等的

页框:将 物理内存空间 分成与页大小相同的若干个 存储块

分页存储:将进程中的若干 分别装入多个 可以不相邻页框

页内碎片:进程 最后一页 一般装不满一个页框,形成页内碎片

页表:实现 从页号到页框号 的映射

逻辑地址结构:页号(P)和页内偏移量(W)。设逻辑地址为 A ,页大小为 L ,则 P=A/L, W=A%L。单位是 Byte 。

分页地址变换机构:

页大小的选择因素:

快表

键值组成。

快表也称为"转译后备缓冲",是为了提高 CPU 访存速度而采用的专用缓存,用来存放最近被访问过的页表项。

性能分析:TLB 命中率

两级和多级页表

将页表再分页,形成两级或多级页表,将页表离散地存放在物理内存中。

基于分页的虚拟存储系统

虚拟存储器

具有 请求调入功能置换功能 ,能 从逻辑上对内存容量进行扩充 的一种存储器系统。

如何理解请求调入和置换?

请求调入:先将进程的一部分装入内存,其余的部分什么时候需要什么时候请求系统装入。

置换:请求调入时没有足够的内存,由操作系统选择一部分内存中的进程内容移到外存,腾出空间来调入需要装入的内存。

优点:

请求分页

最基本、最常用的虚拟存储系统实现方式。

硬件支持

为了实现请求分页,需要: 特殊的页表缺页异常机构 和支持请求分页的 地址变换机构

页分配策略

最少页框数:保证进程正常运行的所需要的最少页框数。与进程大小无关,取决于 指令的格式、功能和寻址方式

局部置换和全局置换

固定分配和可变分配

页置换算法

最佳置换算法(理论研究):选择 以后永远不会被访问的页 或者 在未来最长时间内不再被访问的页 作为换出页

先进先出置换算法 FIFO (最简单):为每个页记录该页调入内存的时间,选择换出页时,选择 进入内存时间最早的页

最近最久未使用置换算法 LRU (近似最佳):选择 最近最久未使用的页 换出

附加引用位算法:选择附加引用为值最小的换出

简单 Clock 置换算法:选择最近没有被访问的淘汰

改进型 Clock 算法:选择既没有被访问过又没有被修改过的淘汰

最少使用置换算法:选择最近时期内使用次数最少的淘汰

页缓冲算法:将换出页移到空闲页链表中

请求分页系统的性能

缺页率对有效访问时间的影响:有效访问时间与缺页率成正比,缺页率越高,有效访问时间越长,访问效率越低

工作集:引入用于降低缺页率,提高内存访问效率。藕断时间间隔里了,进程实际要访问的页的集合。

抖动:进程数太多,分配到的页框太少。运行进程的大部分时间都在用于页的换入换出,几乎不能完成任何有效果工作状态。

分段存储管理

分段机制的引入

主要是为了 易于实现信息共享

在分段存储管理的系统中,程序员使用 二维 的逻辑地址,一个数用来表示 , 另一个数用来表示 段内偏移

基本原理

进程的地址空间被划分成若干个段。

每个段定义了一组逻辑信息,每个段的大小由相应的逻辑信息组的长度确定,段的大小不一样,每个段的逻辑地址从0开始 ,采用一段 连续的地址空间

系统为每个段分配一个 连续的物理内存区域 ,每个 不同的段可以离散 地放入物理内存不同的区域。

系统为 每个进程建立一张段表 , 段表的每一个表项记录的信息包括 段号,段长和该段的基址 , 段表存放在内存中。