在计算机存储体系里,绝大多数存储器都是"报地址、取数据"的按地址访问方式,唯独有一类存储器走的是相反的路子:它不问你数据放在哪里,而是直接问你"里面有没有我要找的内容"。这类存储器就是相联存储器,也叫按内容访问存储器,英文缩写CAM。软考把它当作计算机组成原理里的一个稳定考点,从软件设计师到数据库系统工程师再到系统架构设计师,几乎年年都有题目涉及它。本文把相联存储器的概念、硬件原理、应用场景、命题陷阱和历年真题一次讲透,读完这一篇,这个知识点就能稳定拿分。
相联存储器的英文全称是Content Addressable Memory,直译过来就是"按内容寻址的存储器",中文教材里也把它称作按内容访问存储器或者联想存储器。要准确理解它,必须先厘清它与普通存储器在访问机制上的根本差异,这个差异正是软考命题人反复出题的地方。
普通随机存取存储器RAM的工作方式是"以地址换内容"。CPU要读写数据,必须先在指令中给出一个存储单元的地址,通过地址译码器选中对应的存储单元,再对这个单元进行读或者写。整个访问过程的关键在于地址,数据本身只是被动的存取对象,访问时间与数据是什么内容毫无关系。这种机制要求程序员或编译器在访问前就已经知道数据存放的具体位置,一旦地址算错,取出来的就是错误的数据。
相联存储器恰恰相反,它的工作方式是"以内容换地址"。访问时不是给出地址,而是给出一个关键字,也就是要找的那段数据或者数据的一部分特征。相联存储器内部会把这个关键字与所有存储单元中存放的内容同时进行并行比较,凡是与关键字匹配的存储单元都会被标记出来。如果存在唯一匹配,就把它读出来;如果存在多个匹配,就按某种优先规则选中一个;如果一个都不匹配,则报告未命中。整个访问过程的关键在于内容,地址反而成了比较完成之后才得到的副产品。
这两者的区别可以概括为一句话:RAM是先有地址后有数据,CAM是先有数据后有地址。软考真题里最经典的问法就是"相联存储器按什么访问",正确答案永远是"内容",而不是"地址"。
这里还要澄清一个容易混淆的表述。教材里相联存储器还有两个常见别名,一个是联想存储器,一个是按内容访问存储器,三者指的是同一种器件。之所以叫"联想",是因为它能够根据给定的一部分特征联想到完整的存储内容,就像人看到某个熟悉的片段就能唤起整段记忆一样。考生在遇到这些别名时,应当能够迅速识别出它们指的都是CAM,而不至于因为名称陌生而误判。
相联存储器的查找方式与常见的查找算法也有本质区别。顺序查找要一个一个单元地比下去,查找时间与存储容量成正比;二分查找虽然快,但要求数据先排序。相联存储器依靠硬件并行比较,把所有单元在同一次操作中比完,查找时间基本与容量无关,这是它区别于任何软件查找方法的根本所在。
按照计算机组成原理教材的标准表述,相联存储器是一种不按地址而按存储内容的全部或部分特征进行存取访问的存储器。它的核心要素包含三个方面。第一是关键字寄存器,用来存放当前要查找的关键字;第二是存储体,每个存储单元除了保存数据本身之外,还附带一套与关键字进行比较的比较电路;第三是匹配与选择逻辑,用来记录哪些单元比较成功,并在多个匹配结果之间作出取舍。
需要特别强调的是,相联存储器的"相联"二字指的是存储单元之间按内容特征建立的一种关联关系,这种关联在硬件上表现为每个存储单元都独立配备比较电路,能够在同一个时钟周期内把所有单元的内容与关键字并行比较一遍。正因为比较是并行进行的,相联存储器的查找时间与存储容量基本无关,这是它与顺序查找的根本区别,也是它在某些对查找速度要求极高的场景中不可替代的原因。
理解了概念之后,还要深入硬件层面,搞清楚相联存储器究竟是怎么做到"一个周期内把所有单元都比一遍"的。这部分是软考偶尔考查的原理题,理解透彻之后,很多看似绕的应用题都能迎刃而解。
普通RAM的存储单元只包含一个基本存储元件,比如由六个晶体管构成的静态存储单元,或者由一个晶体管加一个电容构成的动态存储单元,它的职责就是保存一位二进制信息。相联存储器的存储单元则要在基本存储元件之外,再增加一套比较逻辑电路,通常由异或门或者同或门构成。
具体来说,对于每一个存储单元中的每一位,比较电路会把该位存储的值与关键字寄存器对应位送入的值做一次比较,判断二者是否相等。一位的比较用一个异或门就能完成:异或门的输出在两位相同时为低电平,两位不同时为高电平。一个存储字的所有位比较结果再经过一个多输入的与门汇总,只有当这个字的每一位都与关键字完全相等时,这个与门才会输出"匹配"信号。这样,一个存储字配一套比较逻辑,n个存储字就配n套比较逻辑,所有字在同一时刻并行比较,一次比较就能得到全局的匹配结果。
在完整的相联存储器结构中,除了关键字寄存器之外,还有一个屏蔽寄存器。关键字寄存器存放的是当前要查找的关键字,屏蔽寄存器则用来指定关键字中哪些位参与比较、哪些位不参与比较。屏蔽寄存器中被屏蔽的位在比较时一律视为相等,无论存储单元该位的内容是什么。这个机制让相联存储器可以按内容的一部分特征进行检索,例如只按某个字段的高几位进行匹配,从而支持按部分内容寻址。屏蔽寄存器的存在,也是三态内容寻址存储器TCAM中"无关"位的雏形。
比较电路输出的匹配信号需要被记录和进一步处理,这个任务由匹配寄存器和字选择逻辑完成。匹配寄存器是一个位寄存器,每一位对应存储体中的一个存储字,某一位被置位就表示对应的存储字与关键字匹配成功。比较操作结束后,匹配寄存器里可能有一位为1,可能有多位为1,也可能全为0。
当匹配寄存器里恰好只有一位为1时,情况最简单,直接把这个存储字读出即可。当有多位为1时,说明存在多个内容相同的存储字,此时需要字选择逻辑按照预先设定的优先顺序,通常是选择编号最小的那个匹配单元,把它的内容读出。当匹配寄存器全为0时,表示没有任何存储字与关键字相符,也就是发生了未命中,相联存储器会向控制器返回一个未命中标志。
相联存储器的写操作同样有自己的特殊规则,这一点在教材里容易被忽略,却是理解其应用场景的关键。相联存储器并不像RAM那样由地址直接指定写入位置,因此写操作实际上分为两个阶段:先按关键字进行查找,判断要写入的内容是否已经存在于存储体中;如果已经存在,说明无需重复写入,如果不存在,则找一个空闲单元把数据写入,同时把这个单元标记为已占用。
这种"先查后写"的机制意味着相联存储器的每一次写操作都以一次读比较为基础,写之前必须先做内容匹配。正因为写操作代价较高,相联存储器通常只用于容量不大但查找频繁的场景,比如作为小容量高速缓冲,而不是用作主存。软考在考查相联存储器时,偶尔会把这个"先比较再写入"的特性作为干扰项,考生容易想当然地认为相联存储器也和RAM一样能直接按地址写入,从而掉进命题人设下的陷阱。
相联存储器的原理并不复杂,真正让它在软考中占据一席之地的,是它在计算机系统中的几大典型应用。命题人常常不直接考原理,而是把相联存储器的应用场景作为题干,要求考生判断其中用到了哪种存储或映射技术。这部分是拿分的重点。
相联存储器最经典的应用是高速缓冲存储器Cache的地址映射。Cache与主存之间有三种映射方式:直接映射、全相联映射和组相联映射,其中全相联映射就是直接用相联存储器实现的。
在全相联映射中,主存中的任意一块都可以映射到Cache中的任意一行,Cache的每一行除了存放数据块之外,还要存放该数据块对应的主存块号作为标记。当CPU发出一个主存地址时,Cache会把该地址中的主存块号部分作为关键字,与Cache所有行中存放的标记同时进行并行比较,哪个行的标记与之相等,哪个行就是要访问的数据。这套"用主存块号并行比对所有Cache行标记"的机制,正是相联存储器按内容访问的工作原理。
全相联映射的优点在于灵活性最高,冲突缺失的概率最小,但缺点也很明显:每一行都要配备一套比较电路,硬件开销大、成本高、实现困难。因此全相联映射通常只用于小容量Cache。软考真题经常把三种映射方式的优缺点、冲突率、硬件成本放在一起对比考查,考生只要记住"全相联映射的硬件基础是相联存储器"这一条,就能在综合题里准确归位。
相联存储器的第二个重要应用是虚拟存储器中的快表TLB,全称是Translation Lookaside Buff
本篇完!