1. 什么是cache(缓存)?它的工作原理是什么?
Cache是少量的快速内存。它位于主存储器和中央处理器之间。每当CPU请求memory位置的内容时,首先检查cache中是否有此数据。如果数据存在于cache中,CPU直接从cache中获得数据。这是更快的,因为CPU不需要去memory拿数据。如果数据不在cache中,则从memory读取一块内容到cache中,然后传递所需的数据块给CPU。当一个地址在cache中被查找时,如果缓存中包含该地址的内容,它就被称为cache命中。反之称之为cache丢失。
2. 在有cache使能的机器上,在链表(linked list)中搜索数据与在向量(vector)中搜索数据的程序的性能会有差异吗?
链表是一种将元素存储在非连续内存位置的数据结构,而向量是一种将元素存储在连续位置的数据结构。
对于使用cache的设计:如果一个内存位置存在于cache中,那么很有可能其它连续字节也会存在于cache中,因为从主存到cache的任何读取通常都是根据cache line(通常是32或64或128字节)进行的。正因为如此,在有cache的机器上,搜索向量比搜索链表要快。
3. 将memory映射到cache的不同方法有哪些?比较每种方法的优缺点。
有3种主要的映射技术用于映射memory和cache的内容。在每一种映射中,memory和cache被话费为很多块(cache line,通常为64字节大小),这是用于映射的最小大小。
- 直接映射:在直接映射中,memory中每个块只能映射到cache的一个特定块中。这是所有映射中最简单的,通过知道memory地址,可以很容易计算出cache中可能位置,并且仅与单个位置的标记位进行比较就可以算出是否命中cache。这种映射的缺点是,即使cache可能未满,但如果memory访问是在同一块中的地址,则可能导致更多的替换并且效率不高。
- 全相联映射:在全相联映射中,任何memory块都可以映射到cache中的任何块。这种方式的优点是cache的所有位置都可以被充分利用,命中率高。但是成本高,查找是否命中最慢。
- 组相联映射:它是直接映射和全相联映射的折中,在组相联映射中,cache块被分为若干个块集合。memory地址与cache地址的映射转换有两部分,组地址是按直接映射方式,按地址进行访问,而块地址是采用全相联方式,按内容访问。这种映射的优点是cache块的冲突概率比较低,块的利用率大幅度提高,块失效率明显降低。但是实现难度和造价都要比直接映射高。不过,现在这种映射在cache实现中使用最为广泛。
4. 4路组相联映射的cache的总大小为256KB。如果每个cache块(cache line)的大小是64字节,那么cache中有多个集合(cache set)?假设地址位宽为32-bit,需要多少地址位作为标签位(tag)?
Cache的块总数 = (256*1024)/64 = 4096。因为cache是4路组相联,集合数 = 4096/4 = 1024。给定一个32位的地址(address)和64字节的cache块,address[5:0]用于索引cache块内部的字节,address[15:6]被用来找出哪一组地址映射。剩余的address[31:16]用作标签位,也就是16位。
5. Write-through和write-back的cache区别是什么?各有什么优缺点?
Write-through cache:在write-through cache中,每个对cache的写操作同时也写入memory。这很容易设计,因为相对于cache而言,memory总是最新的,但缺点会经常占用memory带宽。
Write-back cache:在write-back cache中,每次对cache的写操作都只写到cache中。写memory被延迟,直到cache块被替换掉。Write-back cache在memory带宽使用上更友好,因为数据只在需要时才写回memory。但如果系统中有多个cache可以缓存相同的地址,那么维护一致性的数据就会变得复杂,因为内存可能并不总是有最新的数据。
6. Inclusive cache和exclusive cache有什么不同?
Cache的inclusive和exclusive属性适用于具有多个cache级别的设计,例如包含L1、L2和L3 cache。
如果L1 cache中存在的所有内容被设计为也存在于L2 cache中,则L1 cache称为inclusive cache。如果保证所有的内容最多只存在于一个L1或L2 cache中,而不同时存在于两个cache中,那么这些cache就称为exclusive cache。Exclusive cache的优点是多级cache可以一起存储更多的数据。Inclusive cache的优点是,在多处理器系统中,如果必须从处理器的cache中删除一个cache块,则只需要在L2 cache中检查它就行,而对于exclusive cache,则必须检查它是否存在于L1和L2 cache中。