边缘安全如何发挥价值?
因此,为了区别不同的内存块,在对应的 CPU Line 中我们还会存储一个组标记(Tag)。这个组标记会记录当前 CPU Line 中存储的数据对应的内存块,我们可以用这个组标记来区分不同的内存块。 除了组标记信息外,CPU Line 还有两个信息:
CPU 在从 CPU Cache 读取数据的时候,并不是读取 CPU Line 中的整个数据块,而是读取 CPU 所需要的一个数据片段,这样的数据统称为一个字(Word)。那怎么在对应的 CPU Line 中数据块中找到所需的字呢?答案是,需要一个偏移量(Offset)。
因此,一个内存的访问地址,包括组标记、CPU Line 索引、偏移量这三种信息,于是 CPU 就能通过这些信息,在 CPU Cache 中找到缓存的数据。而对于 CPU Cache 里的数据结构,则是由索引 + 有效位 + 组标记 + 数据块组成。 这样的访问机制,跟我们使用「内存作为硬盘的缓存」的逻辑是一样的,如果内存有缓存的数据,则直接返回,否则要访问龟速一般的硬盘。 那 CPU 怎么知道要访问的内存数据,是否在 Cache 里?如果在的话,如何找到 Cache 对应的数据呢?我们从最简单、基础的直接映射 Cache(Direct Mapped Cache) 说起,来看看整个 CPU Cache 的数据结构和访问逻辑。 前面,我们提到 CPU 访问内存数据时,是一小块一小块数据读取的,具体这一小块数据的大小,取决于 coherency_line_size 的值,一般 64 字节。在内存中,这一块的数据我们称为内存块(Bock),读取的时候我们要拿到数据所在内存块的地址。 对于直接映射 Cache 采用的策略,就是把内存块的地址始终「映射」在一个 CPU Line(缓存块) 的地址,至于映射关系实现方式,则是使用「取模运算」,取模运算的结果就是内存块地址对应的 CPU Line(缓存块) 的地址。 举个例子,内存共被划分为 32 个内存块,CPU Cache 共有 8 个 CPU Line,假设 CPU 想要访问第 15 号内存块,如果 15 号内存块中的数据已经缓存在 CPU Line 中的话,则是一定映射在 7 号 CPU Line 中,因为 15 % 8 的值是 7。
机智的你肯定发现了,使用取模方式映射的话,就会出现多个内存块对应同一个 CPU Line,比如上面的例子,除了 15 号内存块是映射在 7 号 CPU Line 中,还有 7 号、23 号、31 号内存块都是映射到 7 号 CPU Line 中。 这些是存储库维护的基础知识,迟早会有人查看你的代码,以检查你是否适合该公司。招聘者会在几分钟内决定邀请你参加面试是否值得。这既是好消息,也是坏消息。 坏消息是一个明显的错误会让你失去找到工作的机会;好消息是人们并不想深入研究你的代码。他们希望对你的代码和体系结构有一个大概的了解,你不必聪明绝顶,只要能很好地完成任务即可。 下面是一些初级开发人员常犯的错误。如果能避免犯这些错误,你将获得更多的面试机会。 过时的注释 程序员对注释的看法不一。我们难以就是否或何时对代码进行注释达成一致,但是大家都赞同一件事:如果你注释了,它应与你的代码对应。 注释是用来解释代码的。当你编写了一些复杂或不清楚的代码时,注释可以帮助读者理解它们。但要记住,如果你修改了代码,就要相应修改注释。否则注释将不会帮助人理解而是使人产生误解,没有比误导更糟糕的编程错误了。一个错误的注释比没有注释更糟糕。
更糟糕的是,代码中的注释非常突出。现代IDE赋予注释不同于其他代码的颜色,并且注释更容易被发现。添加注释,代码中就会添加“自述”符号。所以,注释和代码之间的任何差异都很容易被发现。明智地选择你的注释,记住随着代码的更新也要更新它们。 (编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |