某机主存容量为128MB, Cache 容量为32KB,主存与 Cache 均按64B的大小分块 分别写出主存与 Cache 采用直接映像和全相联映像时主存与 Cache 地址的结构格式并标出各个字段的位数 若 Cache 采用组相联映像,每组块数为4块。写出主存与 Cache 地址的结构格式并标出各个字段的位数。并 回答一个主存块可以映像到多少个 Cache 块中?一个 Cache 块可与多少个主存块有对应关系
时间: 2023-05-20 13:03:02 浏览: 384
C知道:对于你的问题,我可以回答。当主存与 Cache 采用直接映像时,主存地址的结构格式为:标记位(Tag)+ 块内地址(Block Offset)+ 块索引(Index),其中标记位占用的位数为 7,块内地址占用的位数为 6,块索引占用的位数为 9。Cache 地址的结构格式为:标记位(Tag)+ 块内地址(Block Offset)+ 块索引(Index),其中标记位占用的位数为 7,块内地址占用的位数为 5,块索引占用的位数为 5。当主存与 Cache 采用全相联映像时,主存地址的结构格式为:标记位(Tag)+ 块内地址(Block Offset),其中标记位占用的位数为 12,块内地址占用的位数为 6。Cache 地址的结构格式与主存相同。当 Cache 采用组相联映像时,主存地址的结构格式与直接映像相同,Cache 地址的结构格式为:标记位(Tag)+ 块内地址(Block Offset)+ 组索引(Index),其中标记位占用的位数为 7,块内地址占用的位数为 5,组索引占用的位数为 2。一个主存块可以映像到一个 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 的映射方式通常是通过硬件实现的,而不是通过软件计算的方式来实现的。
阅读全文