某机主存容量为128MB, Cache 容量为32KB,主存与 Cache 均按64B的大小分块 分别写出主存与 Cache 采用直接映像和全相联映像时主存与 Cache 地址的结构格式并标出各个字段的位数 若 Cache 采用组相联映像,每组块数为4块。写出主存与 Cache 地址的结构格式并标出各个字段的位数。并 回答一个主存块可以映像到多少个 Cache 块中?一个 Cache 块可与多少个主存块有对应关系
时间: 2023-05-19 07:06:34 浏览: 179
对于直接映像的主存与 Cache,主存地址结构为:Tag(高位)+ Index(中位)+ Offset(低位),其中 Tag 为主存块的标记,Index 为主存块在 Cache 中的索引,Offset 为主存块内部的偏移量。在本题中,主存容量为128MB,即2^27B,Cache 容量为32KB,即2^15B,均按64B的大小分块,因此主存共有2^22个块,Cache 共有2^13个块。由于直接映像的 Cache 中每个索引只对应一个主存块,因此 Index 的位数为13,Offset 的位数为6,Tag 的位数为8。
对于全相联映像的主存与 Cache,主存地址结构为:Tag(高位)+ Offset(低位),其中 Tag 为主存块的标记,Offset 为主存块内部的偏移量。由于全相联映像的 Cache 中每个块都可以对应主存中的任意一个块,因此 Tag 的位数为22,Offset 的位数为6。
对于组相联映像的 Cache,每组块数为4块,因此共有2^11组。主存地址结构与直接映像相同,Tag(高位)+ Index(中位)+ Offset(低位),其中 Tag 的位数为13,Offset 的位数为6,Index 的位数为11-2=9,因为每组有4块,需要2位来表示块内的索引。因此,一个主存块可以映像到4个 Cache 块中,一个 Cache 块可以与4个主存块有对应关系。
相关问题
主存—Cache层次的存储器,以字编址(1字=4字节)。主存容量为4MB,Cache容量64KB,主存和Cache以相同大小分块(行),每块(行)大小512B。设计一个4路组相联映像(即Cache每组4个块)的Cache组织,问: 1)写出C
ache的数据结构定义;
struct CacheLine {
bool valid; // 有效位
bool dirty; // 脏位
uint32_t tag; // 标记位
uint8_t data[512]; // 数据
};
struct CacheSet {
CacheLine lines[4]; // 每组4个Cache行
};
struct Cache {
CacheSet sets[128]; // Cache共128组
};
// 每个Cache块大小为512B,即4个字
// Cache共64KB,即128个块,128组
// 每组4个块,即4路组相联映像
// 每个Cache行包括有效位、脏位、标记位和数据
2)写出访问主存地址为0x12345678的数据时,Cache的读取过程;
读取地址为0x12345678的数据时,首先计算出该地址所在的Cache块在Cache中的索引,即为set_index = (0x12345678 >> 6) & 0x7f,其中0x7f为十进制数127,表示二进制下7位全为1。然后计算出该地址所在Cache块的标记位,即为tag = 0x12345678 >> 13。接着在Cache的set_index组中查找是否有与tag相同的Cache行,若有则表示命中Cache,直接返回该Cache行中对应地址的数据;若没有则表示未命中Cache,需要从主存中读取该地址所在的块,并将其存入Cache中。由于是4路组相联映像,需要找到set_index组中一个无效的Cache行,将读取的数据存入其中,并将其标记为有效。若set_index组中没有无效的Cache行,则需要选择其中一个替换出去。由于是LRU策略,可以将最久未使用的Cache行替换出去,并将新读取的数据存入其中。最后将存储了数据的Cache行中对应地址的数据返回即可。
3)写出向主存地址为0x12345678写入数据时,Cache的写入过程。
向地址为0x12345678的数据写入数据时,先检查Cache中是否已有该地址的数据。如果有,需要将该Cache行中对应地址的数据修改为新数据,并将脏位设置为1,表示该Cache行中的数据已被修改过。如果没有,则需要先从主存中读取该地址所在的块,并将其存入Cache中。由于是4路组相联映像,需要找到set_index组中一个无效的Cache行,将读取的数据存入其中,并将其标记为有效。若set_index组中没有无效的Cache行,则需要选择其中一个替换出去。由于是LRU策略,可以将最久未使用的Cache行替换出去,并将新读取的数据存入其中。最后将存储了数据的Cache行中对应地址的数据修改为新数据,并将脏位设置为1,表示该Cache行中的数据已被修改过。最后再将修改过的Cache行中的数据写回主存即可。
已知主存容量,cache容量,分块时每块容量大小,求cache,主存块数,主存的块采取某种映像方式对应cache第几块
假设主存大小为 $M$ 字节,Cache 大小为 $C$ 字节,每个块大小为 $B$ 字节,则:
- Cache 块数为 $C/B$。
- 主存块数为 $M/B$。
- 主存的块采取直接映射方式,则主存中任意一块对应 Cache 中的某一块,可以使用下面的公式计算:$$\text{Cache 块号} = \text{主存地址} \bmod \text{Cache 块数}$$
- 主存的块采取全相连映射方式,则主存中任意一块对应 Cache 中的某一块,可以使用下面的公式计算:$$\text{Cache 块号} = \text{主存地址} \bmod \text{Cache 块数}$$
- 主存的块采取组相联映射方式,则主存中任意一块对应 Cache 中的某一块,可以使用下面的公式计算:$$\text{Cache 块号} = (\text{主存地址} \bmod (\text{组数} \times \text{每组块数})) \div \text{每组块数} \times \text{组长} + (\text{主存地址} \bmod \text{每组块数})$$ 其中,$\text{组数}=\text{Cache 块数}/\text{每组块数}$,$\text{组长}=B\times \text{每组块数}$。
需要注意的是,在实际的计算机系统中,Cache 的映射方式通常是通过硬件实现的,而不是通过软件计算的方式来实现的。
阅读全文