计算机组成原理——虚拟存储器
一. 页式虚拟存储
1.概念
(1)程序员在比实际主存大得多的逻辑地址空间中编写程序
(2)程序执行时,把当前需要的程序段和数据块掉入主存,其他暂不使用的放在磁盘上
(3)执行指令时,通过硬件将逻辑地址转化为物理地址。虚拟地址高位为虚页号,低位为页内偏移地址
(4)当程序发生数据访问或程序访问失效(缺页时),由操作系统把信息从磁盘调入主存中
2.分页
(1)基本思想:
内存被分成固定长度且长度较小的存储块(页框,实页,物理页)
每个进程也被划分为固定长度的程序块(页,虚页,逻辑页)
通过页表,实现逻辑地址想物理地址的转化
(2)逻辑地址
程序中指令所使用的地址(进程所在地址空间)
(3)物理地址
存放指令或数据的实际内存地址
3.“主存-磁盘”层次
(1)与“cache-主存”层次相比,页大小远比cache的行大小要大(windows中的页位4k)
(2)采用全相联映射方式:磁盘中的任意一个页能用射到内存中的任意一个页
因为缺页导致中断时,操作系统从磁盘拿数据通常要耗费几百万个时钟周期。增大页大小,可以减少缺页中断
(3)为什么让软件处理“缺页”
因为访问磁盘需要好粉几百万个时钟周期,硬件即使能立刻把地址打给磁盘,磁盘也不能立即响应
(4)为什么地址转换用硬件实现
硬件实现地址转换可以加快指令的执行速度
(5)为什么页写会策略采用write back
避免频繁的慢速磁盘访问
4.页表结构
页表的首地址放在基址寄存器。采用基址寻址方式
每个页表项前面有一个虚页号:从0开始递增的序号。页表项又分为几个结构:
(1)装入位:该页是否在内存中
(2)修改位:该也在内存中是否被修改
(3)替换控制位:用于clock算法
(4)其他
(5)实页号(8进制)
5.TLB
(1)一次磁盘引用需要访问几次主存?2次,一次查页表,一次查物理地址。于是,把经常查的页表放到cache中。这种在cache页表项组成的页表称为TLB(Translation Lookside Buffer)
(2)TLB的页表结构:tag + 主存中的页表项
当采用全相连映射时,tag为页表项前面的虚页号。需要把tag和虚页号一一比较
当采用组相联映射时,tag被分为tag+index,虚页号的高位为tag,虚页号的低位为index,做组内索引(属于组内第几行)
二. 段式虚拟存储
1.段式存储是根据程序逻辑,给程序分段。使得每段大小不同。这种虚拟地址划分方法适合程序设计
2.段式存储的虚拟地址由段号和段内偏移地址组成。段式虚拟存储器到物理地址的映射通过段表实现
3.段式虚拟存储会造成空页
三. 段页式虚拟存储
1.段页式虚拟存储,先把程序按照逻辑分成段,再把每段分成固定大小的页。
2.程序对主存的调入调出是按照页面进行的;但他有可以根据段实现共享和保护
3.缺点是段页式虚拟地址转换成物理地址需要查询2个表:段表和页表。段表找到相应页表的位置,页表找到想也页的位置
4.段页式细腻地址的结构可以为以下形式:
程序地址: 用户号(进程pid) | 段号 | 页号 | 页内偏移地址
eg:
(1)某计算机的cache块工16块,采用二路组相联映射方式,每个主存块大小为32字节,按照字节编制。则主存129号单元的主存块硬装如刀cache的组号是:(C)A、0 B、2 C、4 D、6
解:二路组相联,所以每组2块,共有16/2=8组,所以组号占3位。
每块32字节,所以块内地址占5位。
129转化为二进制:1000 0001:前3位为组号,100:=4
(2)假设用若干个2K4位的芯片组成一个8K8位的存储器,则地址0B1FH所在芯片的最小地址为:
解:用2片组成一行,共4行,所以片选地址占2位。片内地址有2k=211,所以占11位
0B1FH:000|0 1|011 0001 1111 这三段为前缀,片选地址,片内地址。
该片芯片的最小地址是片内地址全0:000|0 1|000 0000 0000 = 0800H
(3)某计算机的主存地址空间大小为256MB,按字节编址,指令cache和数据cache分离,均有8个cache行,每行大小为64B,数据cache采用直接映射方式,现有两个程序A,B对数组int a[256][256]进行遍历,程序A按行遍历,程序B按列遍历。假定int类型数据用32位补码表示,数组a按行优先方式存储,其地址为320(十进制)。
问:(1) 若不考虑cache一致性维护和替换算法所需的控制位,则数据cache的总容量占多少?
(2) 数组元素a[0][31]和a[1][1]各自所在主存块对应的cache行号分别为多少(cache从0行开始)?
(3)程序A和B的数据访问命中率各自为多少?哪个程序的执行时间更短?
解:(1) 因为cache的总容量是cache每行的数据存储大小+tag位+数据是否有效位+其他一致性控制位。
主存地址空间256MB,占28位。直接映射方式,8行,行号占3位。每行64B,所以块内地址占6位,因此,tag占28-3-6=19位
每行有一个数据有效位。因此,cache共(19+1+648)8 = 532字节
(2) 因为int类型占32位,所以一个int占4B。a[0][31] = 320 + 314 = 444 a1 = 320 + 4(256+1) = 1348。
块内地址占6位,直接映射下行号占3位,因此444 = 110 | 111100,所以行号为6
1348 = 10 | 101 | 000100,所以行号为5
(3) 因为1行cache占64B,每个int数占4B,所以一行有16个数。第一个数会因cache缺失而不命中,然后调入cache。,使得后面的15个int访问全部命中。所以命中率为1516 对于程序B,每次调入16个数,小于数组每行的128个元素,因此每次都不会命中,命中率为0