文章目录
存储管理
主存共享方式
- 大小不等的划分
- 分区存储
- 段式存储
- 大小相等的划分
- 页式存储
逻辑组织
一维结构
二维结构
-
段编号
-
段内偏移
-
物理地址/绝对地址
-
主存空间
-
逻辑地址(相对,虚地址)
地址映射
程序中的逻辑地址转换为物理地址
- 编译时确定(×)
- 装载时映射:静态映射
- 动态映射: 随着连续访问连续映射(CR3重定位寄存器)
程序要求的逻辑地址+[CR3]->物理地址
构造分配的数据结构
分配策略:选择请求者
放置策略:选择一个空闲区
调入策略:何时装载
淘汰策略:何时移走哪些用不到的
主存扩充
局部性特征
从存放代码的辅存中调入必须信息
if chunk_lost
{
call(chunk)
}
虚拟存储器
逻辑地址和物理地址分开
合适的地址变换
辅存:存放应用程序的虚地址空间
主存:存放主存的多进程信息
存储保护
保证用户的程序存储只能在区域内运行读写
- 上下界寄存器(越检查界报错)
检查的物理地址 - 基址,限长寄存器
- 20,4->[20,24]
- 不在区间返回越界中断
动态分区存储
建立分区,按请求大小建立分区
分配
0-20:OS
para1 alloc 20:20-40
para2 alloc 40:40-80
para1 ends recycle:20-40
分配数据结构
主存资源信息块
空闲区队列
起始地址->长度,下一个起始地址->长度
分区的分配
找到大小=请求的:直接摘链
找到大小>请求的:拆分为分区+剩余
分区回收
优化:首次适应算法
调度:将输入程序的程序放入大小最接近的空闲区
最后是从小到大
最佳适应算法
See https://blog.youkuaiyun.com/u011070169/article/details/53177987
See ppt
最坏适应算法
调度:将输入程序的程序放入最大的空闲区
最大化利用最大空闲区
队列链表结构
页式存储
程序地址分为大小相等的页面,称为虚页
主存块:主存的大小相等的片,称实页
虚页可以映射到不连续的物理空间(实页)内
页表
每个程序建立的实/虚页的映射关系
超速缓冲储存器/主存中存放
对于每个程序:
页号/块号
0/page1
1/page2
2/…
虚地址结构
低位0~…:Offset
高位~:页号Page
虚实地址转换
- 转换二进制
- 分离低位/高位
- 产生页表:
- offset直接进入寄存器低位
- 页号查表确定物理地址起始
- 填入地址寄存器高位
取址译码的自动化硬件机构
联想存储器/快表:缓冲存储器的当前运行的进程的页表
仅在联想存储器不匹配时进入主存寻找.
页面调取的机制
- 简单页式系统:运行时全部装入
- 请求页式系统:装入部分页面运行
请求式系统的页表改装
- 页号,主存块号
- 中断位:表示是否在主存内(是否装入),没有则产生缺页中断
- 辅存地址:辅存位置
缺页处理
e.g.
MOV R1 [2120]
虚地址2120,分页
得p=2w=72
中断位=1
缺页中断
if有空白,或者块数<m,调入
else 淘汰主存中的块
淘汰策略
淘汰哪些页?
页表改装
- 引用位:是否被引用
- 改变位:是否被修改
如果两个位表明最近未被访问/修改,则考虑移除.
抖动
频繁调入调出导致性能下降的页
最佳替换算法
淘汰最长时间之后采用的页
页号表
替换指针指向最老的一页
次序表
在分块表中建立次序表
最久未使用
先进先出,最久未被使用的.
TODO…