操作系统内存管理

为了更加有效地管理内存并减少出错,现代操作系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。从概念上讲,可以将虚拟内存看作存储在磁盘上的字节序列,存储在磁盘上的虚拟内存的内容要缓存到主存中,这个操作有点类似Cache的工作原理。在开始学习操作系统内存管理之前先回顾一下Cache的工作原理

虚拟内存实现的思路:在程序运行时,只把当前必要的很小一部分代码和数据装入内存中。其余代码和数据需要时再装入。不再运行的代码和数据及时从内存删除。利用了程序运行的局部性。

1. 页式虚拟内存管理

概念: 把进程空间(虚拟)和内存空间划成等大小(一般4k)的小块

  • 进程的小块——页(虚拟页或页面)
  • 内存的小块——页框(物理页)

进程装入和内存使用的基本方法:
内存以页框为单位分配使用;进程以页为单位装入内存。(页框和页的大小相等)

  • 只把程序部分页装入内存便可运行。
  • 页在内存中占用的页框不必相邻。
  • 需要新页时,按需从硬盘调入内存。
  • 不再运行的页及时删除,腾出空间。

2. 页表和页式地址映射

虚拟地址(VA) 是个地址编号,可以分解成虚拟页号(VPN)虚拟页内偏移(VPO),这里分别简称页号P和页内偏移W。
页号( P): VA所处页的编号=VA/页的大小
页内偏移(W): VA在所处页中的偏移=VA%页的大小


例子:
已知页的大小: 2 n 2^n 2n个单元
页号P=VA>>n
页内偏移W=低n位=VA&( 2 n − 1 2^n-1 2n1), 2 n − 1 2^n-1 2n1是数值大小,其位级表示是n个1。
n位可以表示出 2 n 2^n 2n种状态。


页式地址映射
页面映射表记录页与页框之间的对应关系。也叫页表,页表主要包含页号,页框号以及页面其他特性三大内容。

  • 页号:登记程序地址的页号。
  • 页框号:登记页所在的物理页号。
  • 页面其他特性:登记含存取权限在内的其他特性。

功能: 虚拟地址(页式地址)→物理地址
过程【三步】:
1.从VA分离页号P和页内偏移W;
2.查页表:以P为索引查页框号P‘;
3.计算物理地址MA
MA=P’*页大小+W


例子:
假设页面大小为 2 10 = 1024 2^{10}=1024 210=1024
MOV R1,[0xffff]; #0xffff是虚拟地址
解:
1.分离P,W.
P=VA/页面大小=0xffff >>10=0x3f
W=VA%页面大小=0xffff & ( 2 n − 1 2^n-1 2n1)=0x3ff
2.查找页表
P=0x3f,P’=7
3.计算MA=P’x页面大小+W
MA=7x1024+452=7620
7620即为物理地址


3. 快表技术和页面共享技术

慢表: 页表放在内存中
快表: 页表放在Cache中
快表的特点: 容量小,访问快,成本高。
快表是慢表的部分内容的复制。地址映射时优先访问快表若在快表中找到所需数据,则称为“命中”。没有命中时,需要访问慢表,同时更新快表。合理的页面调度策略能使快表具有较高命中率(90%)。
在这里插入图片描述
页面的共享
代码共享的例子,文本编辑器占用多少内存。
文本编辑器:150KB代码段和50KB数据段。有10个进程并发执行该文本编辑器。
不采用代码段共享占用内存=10x(150+50)KB=2M;如果采用代码段共享,代码段在内存只有一份真实存储,占用内存=150+10×50=650KB。
页面共享原理:在不同进程的页表中填上相同的页框号,多个进程能访问相同的内存空间,从而实现页面共享。共享页面在内存只有一份真实存储,节省内存。

4. 缺页中断

(1)扩充有中断位和辅存地址的页表。
在这里插入图片描述
中断位I标识该页是否在内存中。若I=1,不在内存;若I=0,在内存。
辅存地址:该页在辅存上的位置。
(2)扩充有访问位和修改位的页表
在这里插入图片描述
访问位:标识该页最近是否被访问?
0-最近没有被访问;1-最近已被访问
修改位:标识该页的数据是否已被修改?
0-该页未被修改;1-该页已被修改
缺页中断
定义: 在地址映射过程中,当所要访问的目的页不在内存时,则系统产生异常中断一缺页中断。
缺页中断处理程序: 中断处理程序把所缺的页从页表指出的辅存地址调入内存的某个页框中,并更新页表中该页对应的页框号以及修改中断位I为0。
在这里插入图片描述

5. 页面淘汰策略

淘汰策略: 选择淘汰哪一页的规则称淘汰策略。
页面抖动: 页面在内存和辅存间频繁交换的现象。“抖动”会导致系统效率下降。
好的淘汰策略: 具有较低的缺页率(高命中率);页面抖动较少。
(1)先进先出淘汰算法(FIFO算法)
思想: 淘汰在内存中停留时间最长的页面。
优点:实现简单;页面按进入内存的时间排序,淘汰队头页面。
缺点:进程只有按顺序访问地址空间时页面命中率才最理想。异常现象:对于一些特定的访问序列,随分配的页框增多缺页率反而增加。
(2)最久未使用淘汰算法(LRU,Least Recently Used)
思想: 淘汰最长时间未被使用的页面。
LRU的实现(硬件方法):
页面设置一个移位寄存器R。每当页面被访问则将其重置1;周期性地(周期很短)将所有页面的R左移1位(右边补0);当需要淘汰页面时选择R值最大的页。
R值越大,对应页未被使用的时间越长;R的位数越多且移位周期越小就越精确,但硬件成本也越高。若R的位数太少,可能同时出现多个为0的页面,难以比较。
(3)最不经常使用算法(LFU,Least Frequently Used)
思想: 选择到当前时间为止被访问次数最少的页面。
每页设置访问计数器,每当页面被访问时,该页面的访问计数器加1;发生缺页中断时,淘汰计数值最小的页面,并将所有计数清零。

6. 缺页因素与页式系统缺点

缺页的因素

  • 淘汰算法
  • 分配给进程的页框数
    页框数越少,越容易缺页
  • 页本身的大小
    页面越小,越容易缺页
  • 程序的编制方法
    局部性越好,越不容易缺页;跳转或分支越多越容易缺页

页面的大小选择:
页面太大,浪费内存,极限是分区存储;页面太小,页面增多,页表长度增加,浪费内存,换页频繁,系统效率低。
页面的常见大小:2的整数次幂:1KB,2KB,4KB。
页式系统的不足:

  • 页面划分无逻辑含义
  • 页的共享不灵活
    共享的代码是以页为单位共享的,也就是说页内的代码全部都要共享出去
  • 页内碎片
    在页内容易产生没有使用的空间

7. 段式和段页式虚拟存储。

段式存储管理
进程分段:把进程按逻辑意义划分为多个段(由人控制),每段有段名,长度不定。进程由多段组成,比如一个具有代码段、数据段、堆栈段的进程。
段式内存管理系统的内存分配:以段为单位装入,每段分配连续的内存,但是段和段不要求相邻。段式虚拟地址VA包含段号S和段内偏移W, VA:(S,W)。
段的共享:

  • 共享段在内存中只有一份存储。
  • 共享段被多个进程映射到各自段表
  • 需要共享的模块都可以设置为单独的段

段式系统的缺点:

  • 段需要连续的存储空间
  • 段的最大尺寸受到内存大小的限制
  • 在辅存中管理可变尺寸的段比较困难

段页式存储管理
在段式存储管理中结合页式存储管理技术在段中划分页面。
在这里插入图片描述
段页式系统的地址构成:段号,页号,页内偏移。
在这里插入图片描述
逻辑地址:段号S、页号P和页内位移W;内存按页划分,按页装入。
段页式地址的映射机构:
同时采用段表和页表实现地址映射。

  • 系统为每个进程建立一个段表
  • 系统为每个段建立一个页表
  • 段表给出每段的页表基地址(找到哪个页表)及页表长度(即段长)。
  • 页表给出每页对应的页框。

在这里插入图片描述
有几个段就有几个页表,图中段表中有三个段,对应三个页表。

8. Intel CPU与Linux内存管理

计算机在刚刚加电CPU处在实模式状态下,只支持20位的地址总线和1MB的存储空间。实模式下CPU的寄存器都是16位,表示20位寻址能力方法是:地址通过段地址(16位):偏移地址(16位)组成。段地址4位对齐,也就是说段地址的低4位都是零。段地址向左偏移4位再与偏移地址相加,就得到20位地址,记住就好,这是实模式下CPU的寻址方式。实模式下,程序直接访问物理内存。在保护模式下,段寄存器仍然是16位。
在这里插入图片描述
x86CPU架构下的三种地址:虚拟地址,线性地址,物理地址。
在这里插入图片描述
段与段描述符
段: 一段连续的内存。
在实模式下用段的基址来描述段;在保护模式下用一个段描述符的数据结构(8字节)来描述段的属性:段基址、段界限、段属性、段类型(代码段,数据段)、访问该段所需最小特权级、是否在内存……
普通页表实现时的问题
32位OS(4G空间),每页大小4K,页表每个记录占4字节。
进程的页数:4G/4K=1M个页
页表的记录数应有:1M条记录
页表所占内存:1M*4字节 =4M
页表占页框数:4M/4K =1K页框(连续)注意这里是说页表占页框数
问题: 难以找到连续1K个页框存放页表;页表全部装入过度消耗内存(4M)。
解决办法: 将4M的超大页表存储到离散的1K个页框中;仅将页表的部分内容调入内存。

二级页表

把超大的页表(4M)以页为单位分成若干个小页表,存入离散的若干个页框中。
分解成1024个小页表(=1M/1K);小页表含有1K个记录;小页表大小4K(=1Kx4);小页表刚好占用1个页框。
在这里插入图片描述

为了方便对小页表进行管理和查找,另设置一个叫页目录的表,记录每个小页表的存放位置(即页框号)不要忘记每个小页表含有1K个页表记录。页目录实际是一个特殊页表:每个记录存放的是小页表的编号和其所在的页框号之间的对应关系。页目录:一级页表或外部页表;小页表:二级页表。
在这里插入图片描述

二级页表地址映射特点: 访问数据需要三次访问内存;页目录调入内存(一直在内存);页表按需要调入主存;页面、页表,页目录的大小都刚好4K(占1个页框)。
一个多级页表的例子
在这里插入图片描述

页表基址寄存器保存着一级页表的起始地址,虚拟地址被分割成几个子区间,VPN1意味着在一级页表中的偏移,也是二级页表的起始地址,依此类推……

Linux对段的支持
Linux将4G虚拟空间划分为两个部分:用户空间3G:从0到0xBFFFFFFF;内核空间1G:从0xC0000000到0xFFFFFFFF。
Linux的段机制
Linux四个范围一样的段:0~ 0xFFFFFFFF(4G)。
内核数据段;内核代码段;用户数据段;用户代码段。
各段属性不同,内核段特权级为0,用户段特权级为3。
作用: 利用段机制隔离用户数据和系统数据;保留段的等级保护机制;简化(避免)逻辑地址到线性地址转换;可以直接将虚拟地址当做线性地址,二者完全一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是浩浩子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值