程序的定位
即在辅存的程序调入主存时如何把程序的逻辑地址变换成实际的主存物理地址。
- 加基址方式
- 静态定位:调入的程序块在主存空间位置固定,如果被占了就不能调入。
- 动态定位:调入的程序块在主存空间位置浮动,即可视实际情况用特权指令做基址修改。
- 地址映像方式
- 段式管理:按逻辑分段。
- 页式管理:按固定大小分页。
- 段页式管理:先分段,再分页。
映像方式
- 全相联映像:任何虚页可映像到实存任何页面位置。实页冲突概率最小。
- 页表法:通过 所表示的行数去查表中该行存的装入位和 。
- 目录表法:只记录那些已经装入内存的页表,不存装入位,改存 ,需按存储内容访问,而不是按地址(行)访问。
- 直接映像:每个虚页只能映像到实存的一个特定页面。速度快,实页冲突概率高,实存利用率低。
- 组相联映像:各组之间直接映像,组内各页间是全相联映像。一般cache使用组相联映像。
- 段相联映像:段键全相联,段内各页是直接映像,和组相联正好相反。段相联可以减少目录表欧诺个了,但是会使实页冲突概率增加。
- 位选择组相联映像(节相联):实存分组,虚存不再分组,虚存除了分页之外,还按照实存的组容量 分区。
LRU替换算法的实现
- 使用位法
- 堆栈法:要求有相联比较
- 比较对法:用一般的门电路、触发器等实现
并行访问存储器
把m字w位的存储器改变成m/n字n ×w位的存储器,以增加存储器的字长。把地址码分成几部分,一部分用来选择存储器,剩下的用来选择数据。
交叉访问存储器
(1)地址码高位交叉
高位不连续,存储体内连续,这样没法并行访问连续的数据,只有当指令序列跨越两个存储模块时,才能并行工作。高位交叉目的主要是扩大存储器容量。
(2)地址码低位交叉
高位连续,存储体内不连续,这样可以并行访问在不同存储体上的相关数据。
因为存在访问冲突,所以存储器的速度不是随存储体个数的增加而线性提高。
无冲突访问存储器
访问冲突的根源:转移指令和数据随机性。
具体方法:存储体个数n取质数,且n≥向量长度。
原因:变址位移量必然与存储体个数互质。
虚拟存储器地址空间
- 虚拟地址空间:应用程序员用来编写程序的地址空间,是辅存的逻辑地址。
- 主存储器地址空间。
- 辅存地址空间:磁盘存储器的地址空间,是辅存的实地址。
地址映像和地址变换
地址映像:装入存储器时的事情。把用户用虚拟地址编写的程序按照某种规则装入到主存储器中,并建立多用户虚地址与主存实地址之间的对应关系。
地址变换:程序被装入主存储器之后,在实际运行时的事情。把多用户虚地址变换成主存实地址(内部变换)或磁盘存储器地址(外部变换)。
三种虚拟存储器
(1)段式虚拟存储器
优点:
- 利于程序模块化
- 程序的动态链接和调度容易
- 利于程序的保护
缺点:
- 地址变换花费时间较长,两次加法
- 主存利用率低
- 对辅存的管理比较困难
(2)页式虚拟存储器
优点:
- 主存利用率高
- 地址变换速度快
- 磁盘管理容易
缺点:
- 程序的模块化性能不好
- 页表很长
(3)段页式虚拟存储器
对用户用来编写程序的虚拟存储空间采用分段管理,主存储器的物理空间分页管理。综合了两者的优点。
内部地址变换&外部地址变换
- 内部地址变换:虚拟地址→主存地址。
- 外部地址变换:找到磁盘存储器的实地址,并且把需要访问的那一页或一个程序段调入主存中。
加快内部地址变换的方法
- 目录表:压缩页表的存储容量,用一个容量比较小的高速存储器来存放目录表,相联访问。
- 快慢表:两级存储系统,访问速度接近快表的速度,存储容量是慢表的容量。
- 快表:小容量高速存储器,相联访问。
- 慢表:当快表中查不到时,从主存的慢表查找。按地址访问,用软件实现。
- 散列函数:将快表的相联访问变成按地址访问,用户虚页号 变换成快表地址 。
Cache的预取算法
- 按需取:当出现Cache不命中时,才把需要的块取到Cache中。
- 恒预取:无论Cache是否命中,都把下一块取到Cache中。
- 不命中预取:当出现Cache不命中,把本块和下一块都取到Cache中。
页表级数的计算公式
假设:
为虚拟存储空间大小。
为页面的大小。
为一个页表存储字的大小。
为页表的级数。
那么: