第七章 存储管理
7.1 内存管理功能
-
7.1.1 实现方式
- (1)结构:CPU CACHE 内存 辅存
- (2)原理:内存小时,辅存支援内存;暂不用的模块转为辅存,必要时转为内存
-
7.1.2 地址映射(装入)
- 定义:程序中的虚拟地址→真实物理地址
- (1)固定地址映射:编译时直接确定好内存中位置
- (2)静态地址映射:程序装入(如双击图标时)时操作系统决定
- (3)动态地址映射:执行过程中被访问才映射
- (4)代码运行全过程:预编译→编译→汇编→链接→装入→执行
-
7.1.3 虚拟存储
- 内存不够时/多程序并发时,在硬盘中开辟的虚拟封闭存储空间(可自己设置总大小)
-
7.1.4 内存分配
- 放置策略,调入策略,淘汰策略
-
7.1.5 存储保护
- 使用界址寄存器来防止内存越界与越权
7.2 物理内存管理
-
7.2.1 分区存储管理
- (1)单一区
- (2)固定分区:限定区大小
- (3)动态分区:程序装入时根据程序大小创建分区
-
7.2.2 分区放置策略
- (1)空闲区表:表中存储空闲区位置与大小
- (2)分配过程:从表前往表后,分割空闲区,并保留被分割后的区
- (3)放置策略:首址适应(按地址编号);最佳匹配(从小区开始);最坏匹配(从大区开始)
- (4)分区回收:回收程序释放分区后登记如表(回收算法处理回收后的区间合并或插入)
-
7.2.3 内存覆盖技术
- (1)目的:小空间运行大程序
- (2)分区:常驻区(某段),覆盖区(多段数据共享使用)
-
7.2.4 内存交换技术
- (1)原理:内存不够时将进程写入到硬盘(换出),进程需要运行时重新写入到内存中(换入)
- (2)地址重定位:将原位置替换到任一空位置
-
7.2.5 内存碎片
- (1)定义:动态分区时产生的过小的空闲区,难以利用
- (2)解决方案:规定门限制(不允许产生门限大小的区间);内存拼接技术(释放回收时/没有足够大区间时/定期时将所有小空闲区集中构成大空闲区;解除程序占用连续内存才能运行的限制
7.3 虚拟内存管理
-
7.3.1 页式虚拟内存管理概念
- (1)使用:只装入很小的代码和数据进入内存,其与需要时再装入(内存覆盖技术)
- (2)概念:虚拟进程空间和内存空间划成等大小的小片,进程片为页,内存片为页框
-
7.3.2 页表和页式系统映射
- (1)页式系统地址:虚拟地址VA分解为页号P和偏移W,单位均为B(VA = 页长*P + W)
- (2)页表:记录页与页框之间的对应关系(页号对应页框号)
- (3)页式地址映射:虚拟地址→物理地址(MA = P’(页框号)*页大小 + W)
-
7.3.3 快表技术和页面共享技术
- (1)快表机制:CACHE中的页表为快表,内存中的页表为慢表;搜索时先搜快表,搜不到则搜慢表(搜到更新)
- (2)页面共享:访问相同代码段,拥有不同数据段(如.dll库访问,访问的是相同的页框号)
-
7.3.4 缺页中断
- (1)分级存储:CACHE + 内存 + 辅存
- (2)带中断位的页表:加上中断位(1在内存,0不在)和辅存地址
- (3)带访问位和修改为的页表:访问位0未访问1已访问;修改位0未修改1已修改
- (4)缺页中断:所访问的页不在内存中时中断(调用中断处理程序来处理)
- (5)缺页率:f = 缺页次数/访问页面总次数
-
7.3.5 页面淘汰
- (1)页面抖动:页面在内存和辅存间频繁交换
- (2)最佳算法(OPT):淘汰以后不需要/最远的将来才会用的页面(无法实现)
- (3)先进先出淘汰算法(FIFO):淘汰内存中停留时间最长的页面
- (4)最久未用淘汰(LRU):淘汰最长时间未被使用的页面
- (5)LRU实现方法:硬件层通过移位寄存器R不断左移与重置,软件层通过周期置0与访问重置1
- (6)最不经常使用(LFU):淘汰当前为止被访问次数最少的页面
-
7.3.6 缺页因素与页式系统缺点
- (1)缺页原因:淘汰算法
- (2)页面大小:常见1,2,4KB,其中4KB最多
- (3)程序编写:OS实现行遍历,故遍历数组时推荐行
-
7.3.7 段式与段页式存储
- (1)进程分段:进程以逻辑分为多段,每段有段名,长度不定(段号S,段偏移W)
- (2)段表:记录每段在内存映射中的位置
- (3)映射:逻辑地址VA(S与W)→查询段表(B基地址与L段长)→基地址MA(B + W)
- (4)段页存储:段中划分页面,即段号S + 段内偏移W’(页号P + 页内偏移W)
- (5)段页地址映射:一个进程一个段表,一个段一个页表,VA(S,W’)→(S,P,W)→MA
7.4 Intel CPU与LINUX内存管理
-
7.4.1 Intel CPU物理结构
- (1)模式切换:开机时为实模式,运行进程时为保护模式
- (2)控制寄存器:CR0(低五位为机器状态字),CR2(引发缺页的地址),CR3(高20位位页目录地址)
- (3)三种地址:逻辑地址→线性地址→物理地址
-
7.4.2 Intel CPU段机制
- (1)段与描述符:描述段的属性
- (2)描述符表:GDT全局描述符表(仅1个,所有进程可用),LDT局部描述符表(每个进程特有的),IDT中断描述符表(包含中断服务程序)
- (3)选择子:通过此来选择目标段的描述符(索引+TI(GDT或LDT)+特权级别)
-
7.4.3 LINUX页面机制
- (1)硬件分页:默认4KB的页面大小
- (2)传统分配:4G内存,每页与页框大小为4KB,页表每个记录占4B;
进程的页数 = 4G/4K = 1M个页,则进程页表中记录1M条记录;
页表所占内存 = 1M记录*4B = 4M,则页表所用页框 = 4M / 4K = 1K页框 - (3)二级页表:超大的4M页表分成多个小页表来存储,而存储这些小页表位置的为“页目录”
- (4)LINUX三级页表:页全局目录 + 页中继目录(0位未使用)+ 小页表 + 偏移
-
7.4.4 LINUX对段的支持
- (1)4G虚拟空间分层:3G用户空间,1G内核空间
- (2)LINUX段机制:进程建立时通过段机制对寄存器进行初始化,start_thread