Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 缓存映射技术_C++_Caching_Memory - Fatal编程技术网

C++ 缓存映射技术

C++ 缓存映射技术,c++,caching,memory,C++,Caching,Memory,我试图理解硬件缓存。我有一点想法,但我想在此问一下我的理解是否正确 所以我知道缓存映射有三种类型:直接、完全关联和集合关联 我想知道的是,在硬件和特定的计算机系统中,使用逻辑门实现的映射类型,为了改变映射,需要改变电气连接吗 我目前的理解是,在RAM中,存在一个内存地址来引用每个内存块。在一个包含字的块中,每个字都包含若干字节。我们可以用位数来表示选项的数量。 例如,4096个内存位置,每个内存位置包含16个字节。如果我们要引用每个字节,那么2^12*2^4=2^16 引用每个字节需要16位内存

我试图理解硬件缓存。我有一点想法,但我想在此问一下我的理解是否正确

所以我知道缓存映射有三种类型:直接、完全关联和集合关联

我想知道的是,在硬件和特定的计算机系统中,使用逻辑门实现的映射类型,为了改变映射,需要改变电气连接吗

我目前的理解是,在RAM中,存在一个内存地址来引用每个内存块。在一个包含字的块中,每个字都包含若干字节。我们可以用位数来表示选项的数量。 例如,4096个内存位置,每个内存位置包含16个字节。如果我们要引用每个字节,那么2^12*2^4=2^16 引用每个字节需要16位内存地址

高速缓存还具有内存地址、有效位、标记和一些能够存储n个字的主内存块的数据,从而可以存储m个字节。其中m=n*i(每个字的字节数)

例如,直接映射 1块主内存只能位于缓存中的一个特定内存位置。当CPU使用RAM的16位内存位置请求某些数据时,它首先检查缓存。 它怎么知道这个特殊的16位内存地址只能在几个地方

我的想法是,每个RAM地址与缓存地址之间可能存在某种电气连接。然后可以将16位地址分成几个部分,例如,仅将左8位与每个高速缓存内存地址进行比较,如果匹配,则比较字节位,然后比较标记位,最后比较有效位

我的理解正确吗?非常感谢。
如果有人读了这篇长篇文章,你一定会非常感激。你可能想读一下Ulrich Drepper的
3.3.1 Associativity
,每个程序员都应该知道的关于内存的内容。

标题有点朗朗上口,但它详细地解释了你所要求的一切

简言之:
缓存的问题是比较的数量。如果您的
缓存
包含100个块,则需要在一个周期内执行100个比较。通过引入
集合
,您可以减少这个数字。如果特定内存区域只能放置在插槽1-10中,则将比较次数减少到10。
集合
由内存地址中名为index的附加位字段寻址。 例如,您的16位(来自您的示例)可以拆分为:

[15:6] block-address; stored in the `cache` as the `tag` to identify the block
[5:4] index-bits; 2Bit-->4 sets
[3:0] block-offset; byte position inside the block

因此,方法的选择取决于硬件资源的可用性和要归档的访问时间。它几乎是硬连线的,因为您希望减少比较逻辑。

很少有映射函数用于带有主内存的映射缓存线

  • 直接映射
  • 联想映射
  • 集合关联映射

你必须对这三个映射函数有一点了解

也许electronics.stackexchange.com是解决这个问题的更好论坛,因为这个问题是关于硬件的