操作系统原理三:存储器管理与虚拟存储器
存储器管理与虚拟存储器
存储器的功能是保存数据,存储器的发展方向是高速、大容量和小体积
重定位:实现逻辑地址(相对地址)到物理地址(绝对地址)的映射
程序的装入和链接#
装入#
编辑----编译----链接----装入----运行
绝对装入
- 编译后,装入前已产生了绝对地址(内存地址),装入时不再作地址重定位
- 绝对地址的产生:1. 由编译器完成,2. 由程序员编程完成
- 对 1. 而言,编程用符号地址。
可重定位装入
- 静态重定位:地址转换在装入时一次完成,由软件实现(重定位装入程序完成)。
缺点:不允许程序运行时在内存中移动位置。
动态运行时装入
- 在装入后不能移动
- 该情况一般在执行时才完成相对地址向绝对地址的转换,需要硬件地址变换 “重定位寄存器”的支持,才能保证进程的可移动性
链接#
静态链接
- 对相对地址的修改
- 变换外部调用符号
装入时动态链接
- 便于修改和更新
- 便于实现对目标模块的共享
运行时动态链接
连续分配方式#
单一连续分配#
- 内存分为两个区域:系统区,用户区。应用程序装入到用户区,可使用用户区全部空间
- 最简单,适用于单用户、单任务的OS
- 优点:易于管理
- 缺点:对要求内存空间少的程序,造成内存浪费;程序全部装入,很少使用的程序部分也占用内存
分区式连续分配#
固定式#
将内存划分成若干个连续区域,称为分区。每个分区只能存储一个程序,而且程序也只能在它所驻留的分区中运行。有n个分区,则可同时装入n个作业/任务。
- 分区大小:
相等
不相等:不相等利用率更高 - 内存分配:
数据结构- 分区表:将分区按大小排序,并将其地址、分配标识作记录
例:dos的MCB
- 分区表:将分区按大小排序,并将其地址、分配标识作记录
- 优缺点:
优点:简单;缺点:有碎片(内零头)
可变式#
内存不预先划分好,当作业装入时,根据作业的需求和内存空间的使用情况决定是否分配。若有足够的空间,则按需分割一部分分区给该进程。
数据结构:
- 空闲分区表
- 空闲分区链
分配算法:
- 首次适应算法
要求:分区按低址---高址链接,找到第一个大小满足的分区
低址部分不断划分留下碎片,低址内存使用频繁 - 循环首次适应算法
从首次适应中上次找到的空闲分区的下一个开始查找
空闲分区分布均匀,提高了查找速度,但缺乏大的空闲分区 - 最佳适应算法(和最坏适应算法)
分区按大小递增排序;分区释放时需插入到适当位置
内存回收:
- 上邻空闲区:合并,改大小
- 下邻空闲区:合并,改大小,首址
- 上、下邻空闲区:合并,改大小
- 不邻接,则建立一新表项
可重定位#
连续式分配中,总量大于作业大小的多个小分区不能容纳作业
紧凑:
- 通过作业移动将原来分散的小分区拼接成一个大分区
- 作业的移动需重定位,是动态(因作业已经装入)
对换#
- 将阻塞进程,暂时不用的程序,数据换出
- 将具备运行条件的进程换入
- 类型
- 整体对换:进程对换,解决内存紧张
- 部分对换:页面对换/分段对换:提供虚存支持
- 对换空间的管理
外存
对换区比文件区侧重于对换速度,因此,对换区一般采用连续分配
采用数据结构和分配回收类似于可变化分区分配 - 换出
- 选出被换出进程:
因素:优先级,驻留时间,进程状态 - 换出过程:
对于共享段:计数减1, 是0则换出,否则不换
修改PCB和MCB(或内存分配表)
- 选出被换出进程:
- 换入
- 选择换入进程:优先级,换出时间等
- 申请内存
- 换入
基本分页存储管理#
连续分配引起碎片问题
碎片问题的解决方案:紧凑方式消耗系统开销
离散分配:分页、分段、段页
分页:将用户程序地址分为若干个大小固定的区域,也就是页
页面和页表#
页面和物理块:逻辑空间和内存空间
页面大小 :
- 页太大,页内碎片大
- 页太小:页表可能很长,换入/出效率低
地址结构:
逻辑地址A;页大小L;页内偏移d,则页号P和页内地址d:
例:系统页面大小为1kb,A=2170B,P=2,d=122
地址变换机构#
基本任务:逻辑地址——物理地址的映射
- 页号→块号:通过页表来完成
- 页内地址→块内地址:无需转换
基本地址变换机构:
- 越界保护
- 每个进程对应一页表,其信息(如长度、始址)放在PCB中,执行时将其首地址装入页表寄存器
需要考虑的问题:
-
页表放在哪里?整个系统的页表空间有多大?
-
直接映像的分页系统对系统效能的不利影响?(影响执行速度,因为CPU至少要访问两次主存才能存取到所要数据)
-
基本的地址变换机构
①页表驻留在内存中
②系统中设置一个页表寄存器存放页表在内存中的始址和页表的长度
③缺点:两次访问主存,速度降低近1/2
假设访问一次内存时间为t
快表:
减少一次内存访问
假设命中率为a,查找快表需要时间为λ,访问一次内存时间为t
多级页表#
- 页表可能很大,将其离散存放在不同页块中。
- 建一“外部页表”来管理这些离散页表块。
相当于单级页表中的页表寄存器,一般应常驻内存。
每项记录页表始址,且增加存在位。 - 64位机器页表一般>3级,最外层页表常驻。
基本分段存储管理#
按程序的逻辑结构,将程序的地址空间划分为若干段,各段大小可不相同。在进行存储分配时,以段为单位,这些段在内存中可以不相邻接。
每个段有其逻辑意义和功能,便于
- 方便编程
- 分段共享
- 分段保护
- 动态链接
- 动态增长
分段地址结构
段表
地址变换
分页和分段的主要区别
- 页是信息的物理单位,段是逻辑单位
- 页长度固定,段长度不固定(由用户指定)
- 一维与二维
段式管理的优缺点
优点:
- 程序的各段可独立编译(修改一个过程不会影响其它无关过程)
- 可采用不同的保护措施(段只包含一种类型的对象,可以有针对这种特定类型的合适的保护)
- 便于共享某些段(常见的例子是共享库,如图形库)
缺点:
- 段长受限制(段长不定会出现空闲区上内存的浪费)
- 段是作为一个整体调入调出,操作时间长
段页式存储管理#
将用户程序分成诺干段,把每个段分成若干页
采用段页式存储管理,在CPU中应设置段表控制寄存器
地址变换过程
段页式存储管理中,访问快表失败时,每访问一条指令或存取一个操作数都要3次访问主存
虚拟存储器#
常规存储器管理方式的特征
- 一次性(指全部装入)
- 驻留性(指驻留在内存不换出)
局部性原理
- 时间局部性:如循环执行
- 空间局部性:如顺序执行
虚拟存储器
- 具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储系统
- 实质:以时间换空间,但时间牺牲不大
虚存的实现方式:
- 需要动态重定位
请求分页系统
- 以页为单位转换
- 需硬件
- 请求分页的页表机制
- 缺页中断
- 地址变换机构
- 需实现请求分页机制的软件(置换软件等)
请求分段系统
- 以段为单位转换
- 请求分段的段表结构
- 缺段中断
- 地址变换机构
- 需实现请求分段机制的软件(置换软件等)
虚存特征:
- 离散性:部分装入(若连续则不可能提供虚存),无法支持大作业小内存运行
- 多次性:局部装入,多次装入
- 对换性
- 虚拟性
请求分页#
需要:请求页表机制,缺页中断机制,地址变换机制
请求页表机制
状态位指示是否已调入内存
缺页中断机制
每当所访问的页面不存在时,便产生一缺页中断,请求OS将所缺页调入内存
- 一般中断在CPU一条指令执行完后才检查,而缺页中断在指令执行期间立刻处理
- 一条指令执行期间可能产生多次缺页中断
地址变换机制
请求分页的内存分配#
最小物理块数:能保证进程正常运行所需的最小
- 单地址指令,直接寻址:2块(一块存放指令页面,另一块存放数据页面
- 允许间接寻址:3块
内存分配策略:
- 固定分配局部置换:
固定分配:为每个进程分配一定物理块,不再改变
局部置换:缺页只能从分配的n个页中选一换出,再调入
-难以确定固定分配的页数(少:置换率高; 多:浪费) - 可变分配全局置换:
可变分配:为每个进程分配一定物理块,运行期间可增减
全局置换:缺页从OS保留的空闲块取出分配,或以所有进程物理块为目标选出一块换出,再分配 - 可变分配局部置换
可变分配:为每个进程分配一定物理块,运行期间可增减
局部置换:只允许再该进程的页面中选择患处换入,如果频繁发生中断,OS再为其分配若干附加物理块知道缺页率减少
物理块分配算法:
-
平均分配
-
按进程大小比例分配:
n个进程,页面数为Si,总页面数为S,总物理块m,分配到物理块bi= -
优先权:一部分按比例,一部分考虑优先权
页面调入策略:
调入时机:
- 预调:(根据空间局部性)目前:成功率≤50%
- 请求调入:较费系统开销,各有优劣
从何处调页:
- 对换区(连续):全部从对换区调入所需页面, 快
- 文件区(离散):修改过的页面换出到对换区, 稍慢
- UNIX方式:
未运行过的页面,都应从文件区调入
曾经运行过但又被换出的页面,从对换区调入
对共享页,应判断其是否在内存区
页面调入过程:
访问页面状态位为0,向CPU发出缺页中断,中断程序先保留CPU环境,查找页表找到该页所在的外存物理块,若此时能容纳新页面,则启动磁盘I/O,调入内存,修改页表;若已满,则按照置换算法,选一页换出,如果该页修改位为0,则不必写回磁盘,繁殖则写回磁盘。再调入所缺页,并写入快表。最后利用修改后的页表访问数据物理地址,再访问数据
缺页率:进程逻辑空间为n页,系统分配物理块数m,访问页面成功的次数为S,失败的次数为F,A=S+F,缺页率f=
页面置换算法#
先进先出(FIFO):淘汰最先进入内存的页面
最佳(Optimal):淘汰最长(未来)时间内不再被访问的页面
最近最久未使用(LRU):
须为每个在内存中的页面配置一个移位寄存器:R=Rn-1Rn-2...R1R0,访问某物理块时将相应寄存器的Rn-1位置1,定时信号每个一段时间寄存器右移1位,具有最小数值的寄存器就是LRU
然后再用栈保存当前页面:
Clock置换算法:
为每页设置一位访问位,将内存中所有页面通过指针链接成一个循环队列,被访问时访问位置1
淘汰时:访问位是0,则换出;访问位是1,则置0,给予页面第二次驻留内存的机会,再按照FIFO检查下一个页面
改进Clock:对于修改过的页面,换出时所付出的开销更大
访问位A,修改位M:A=0,M=0:未被访问,未被修改,最佳淘汰页
- 扫描循环队列,寻找上述最佳淘汰页,第一次扫描不改变A
- 1失败则进入第二轮,寻找A=0,M=1;所有扫描过的页面A置0
- 2失败则进入第三轮,重复1,再失败则进入2,一定能找到
性能分析#
-
被访问页在内存中,且在快表中
内存访问有效时间EAT=查找快表时间λ+访问实际物理地址时间t -
被访问页在内存中,不在快表中
查找快表+查找页表+修改快表+访问实际物理地址 -
不在内存
查找快表+查找页表+缺页中断处理时间ε+修改快表+访问实际物理地址
考虑到命中率a,缺页率f:
仅考虑缺页率,λ=0,a=0
CPU利用率与多道程序度的关系:多道程序度指在内存中并发执行的程序数目。在低度情况下,CPU利用率呈线性变化关系。随着度的上升,CPU利用率也逐渐上升,最终上升到一个最大值,若在这种情况下,进一步增加度,则系统发生抖动,且CPU利用率将迅速恶化.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)