虚拟内存

 在正式讲述虚拟内存之前需要提及存储器的层级结构以及进程在内存中的结构。

存储器的层级结构速度从快到慢排列如下

寄存器——L1高速缓存——L2高速缓存——L3高速缓存——主存——磁盘——分布式文件系统

而成本也是从高到低,空间是从低到高。

两个相邻的存储设备,前者往往是充当后者的高速缓存,后者往往存储比前者更完整的数据。

后面的内容会涉及到高速缓存和主存。

   

   

为了简单的理解可以假设主存是一个线性的数组。每个元素可以是一个字节。而主存与硬盘或者与高速缓存间做数据传输时,每次可以传输若干个字节,我们可以把这若干个字节定为一个新的单位,叫"块"。而高速缓存中每个存储的元素则是一个块。高速缓存的存储结构

如上图所示,高速缓存被分成S个组,每个组里面有E行,每行都有一个有效位,t个标记为和B个字节,这B个字节就组成了之前提到的块。并且和内存地址有这样的一个关系m=t+s+b。即有t个标记位,s个位作为组索引,b个位作为块偏移,并且是t,s,b是从高位到低位排列。这个关系决定了给定一个地址,它该存放在高速缓存中的哪个位置。

   

另外整个高速缓存的总容量是C=S*B*E;按照S和B的变换可以把高速缓存分成下面三种类型

1.直接映射

2.组相联

3.全相联

直接映射和全相联是两种极端情况。

直接映射是缓存中每个组只有1行,即E=1。对于这种情况,当某个当某个地址在缓存中发生冲突时则直接替换。

全相联是缓存中只有一个组,所有行都在这个唯一的组里面,相当于S=1。这种情况所有缓存都放在一个组里面,然后轮询找出哪一行是未使用的,如果全部组都已经使用了,那就按照一定的算法找出一个块踢出,再放上新的块。

组相连则是介于上面两种情况,每个组最少有两行。这种情况跟全相联一样,不命中的时候在组里面找不到未使用的块,也是需要有策略选出一个牺牲的块,替换上新的。

下面则用直接映射来模拟一下读取高速缓存的过程

现在有一个直接映射的高速缓存如下

SEBm=4124

由此可以得出s=2,b=1,t=m-b-s=4-1-2=1,整个地址构成如下

t=1

s=2

b=1

所有地址的标记位,组索引和块偏移如下表所示,另外给内存中的块编上一个序号

高速缓存如下

假设现在读地址0的字,按照上面的表,组块索引是0,标记位是0,缓存不命中,需要从内存中读取块0写入高速缓存,因此m[0]和m[1]会被写入组0,标记位是0,有效位置1,写后高速缓存如下

接着读地址1的字,内存地址是0001,组索引为0,标记位是0,查找高速缓存,组号和标记位对上,有效位是1,取偏移是1的值m[1]

接下来读地址8

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信