cache存储器

cache基本原理         

1.cache的功能

    cache是介于CPU和主存之间的小容量存储器,存取速度比主存快。它能高速地向CPU提供指令和数据,加快程序的执行速度。它是为了解决CPU和主存之间速度不匹配而采用的一项重要技术

2. cache的基本原理

    CPU与cache之间的数据交换是以字为单位,而cache与主存之间的数据交换是以块为单位。一个块由若干定长字组成的。当CPU读取主存中一个字时,便发出此字的内存地址到cache和主存。此时cache控制逻辑依据地址判断此字当前是否在 cache中:若是,此字立即传送给CPU;若非,则用主存读周期把此字从主存读出送到CPU,与此同时,把含有这个字的整个数据块从主存读出送到cache中。由始终管理cache使用情况的硬件逻辑电路来实现LRU替换算法

3.cache的命中率

  增加cache的目的,就是在性能上使主存的平均读出时间尽可能接近cache的读出时间。因此,cache的

命中率应接近于1。由于程序访问的局部性 ,这是可能的。 在一个程序执行期间,设Nc 表示cache完成存

取的总次数,Nm 表示主存完成存取的总次数,h定义为命中率,则有

           h=Nc/(Nc+Nm)   ...(3.4)

  若tc 表示命中时的cache访问时间,tm 表示未命中时的主存访问时间,1-h表示未命中率,则cache/主

存系统的平均访问时间ta 为:

           ta =htc +(1-h)tm           (3.5)

设r表示主存慢于cache的倍率,e表示访问效率,则有:

                                  r=tm /tc                           (3.6)

          e=tc /ta=tc/(htc+(1-h)tm)=1/(r+(1-r)h)=1/(h+1-h)r)

为提高访问效率,命中率h越接近1越好,r值以5—10为宜,不宜太大。命中率h与程序的行为、cache的容

量、组织方式、块的大小有关。

【例5】 CPU执行一段程序时,cache完成存取的次数为1900次,主存完成存取的次数为100次,已知cache

存取周期为50ns,主存存取周期为250ns,求cache/主存系统的效率和平均访问时间。

【解】

h=Nc /(Nc +Nm )=1900/(1900+100)=0.95

r=tm /tc =250ns/50ns=5

e=1/(r+(1-r)h)=1/(5+(1-5)×0.95)=83.3%

ta =tc /e=50ns/0.833=60ns

 

主存与cache的地址映射       

  cache的容量很小,它保存的内容只是主存内容的一个子集,且cache与主存的数据交换是以块为单位。

  地址映射 即是应用某种方法把主存地址定位到cache中。

  址映射方式有全相联方式直接方式组相联方式 三种

1.全相联映射方式

  主存中一个块的地址与块的内容一起存于cache的行中,其中块地址存于cache行的标记部分中。

  这种方法可使主存的一个块直接拷贝到cache中的任意一行上,非常灵活。

  它的主要缺点是比较器电路难于设计和实现,因此只适合于小容量cache采用。

 

直接映射方式

  这也是一种多对一的映射关系,但一个主存块只能拷贝到cache的一个特定行位置上去。

  cache的行号i和主存的块号j有如下函数关系:i=j mod m    (m为cache中的总行数)

 

组相联映射方式

  这种方式是前两种方式的折衷方案。它将cache分成u组,每组v行,主存块存放到哪个组是固定的,至

于存到该组哪 一行是灵活的,即有如下函数关系:m=u×v     组号 q=j mod u

 

 

替换策略                     

  cache工作原理要求它尽量保存最新数据,必然要产生替换。

  对直接映射的cache来说,只要把此特定位置上的原主存块换出cache即可。

 

★最不经常使用(LFU)算法

    LFU算法将一段时间内被访问次数最少的那行数据换出。每行设置一个计数器。从0开始计数,每访

问一次, 被访行的计数器增1。当需要替换时,将计数值最小的行换出,同时将这些行的计数器都清零。

  这种算法将计数周期限定在对这些特定行两次替换之间的间隔时间内,不能严格反映近期访问情况。

★近期最少使用(LRU)算法

    LRU算法将近期内长久未被访问过的行换出。每行也设置一个计数器,cache每命中一次,命中行计

数器清零,其它各行计数器增1。当需要替换时,将计数值最大的行换出。

  这种算法保护了刚拷贝到cache中的新数据行,有较高的命中率。

★随机替换

  随机替换策略从特定的行位置中随机地选取一行换出。在硬件上容易实现,且速度也比前两种策略快。

  缺点是降低了命中率和cache工作效率。

 

cache的写操作策略  

  CPU对cache的写入更改了cache的内容。可选用写操作策略使cache内容和主存内容保持一致。

 

★写回法

  当CPU写cache命中时,只修改cache的内容,而不立即写入主存;只有当此行被换出时才写回主存。

  这种方法减少了访问主存的次数,但是存在不一致性的隐患。

  实现这种方法时,每个cache行必须配置一个修改位,以反映此行是否被CPU修改过。

★全写法

  当写cache命中时,cache与主存同时发生写修改,因而较好地维护了cache与主存的内容的一致性。

  当写cache未命中时,直接向主存进行写入。cache中每行无需设置一个修改位以及相应的判断逻辑。

  缺点是降低了cache的功效。

★写一次法

  基于写回法并结合全写法的写策略,写命中与写未命中的处理方法与写回法基本相同,只是第一次写命

中时要同时写入主存。这便于维护系统全部cache的一致性。

奔腾PC机的cache       

  奔腾PC机采用两级cache结构。安装在主板上的2级cache(L2)采用2路组相联映射方式,集成在CPU内的

1级cache(L1)也采用2路组相联映射方式,L1又是L2的子集,从而使L1未命中处理时间大大缩短。CPU中的

L1分设成各8KB的指令cache和数据cache,有利于CPU高速执行程序。

  数据cache采用2路组相联结构,采用LRU替换算法,一组两行共用一个LRU二进制位。数据cache的工作

方式受CPU控制寄存器CR0中CD和NW位组合状态控制,如下表3.8所示。

              表3.10 奔腾CPU片内数据cache工作方式

 CD  NW   新行填入   全写法   使无效
 0  0    允许   允许   允许
 1  0    禁止   允许   允许
 1  1    禁止   禁止   禁止

   其中CD=1,NW=1时复位后状态,而CD=0,NW=0时最佳使用状态

 

 

### Cache存储器与虚拟存储器工作原理 #### Cache存储器概述 Cache是一种高速缓存技术,位于CPU和主存之间。为了提高访问速度,主存中的数据被划分为固定大小的块(即主存块),而Cache也被划分成同样大小的块(即Cache块)。当CPU需要从内存中读取或写入数据时,会先检查所需的数据是否已经在Cache中存在[^2]。 如果在Cache中找到了对应的数据,则称为命中;如果没有找到,则会发生一次缺失,这时就需要从主存加载相应的块到Cache中,并可能替换掉某些已有的Cache块。这种机制能够显著减少平均访存时间,因为大多数情况下程序具有局部性特征,使得最近使用的数据更有可能再次被使用。 #### 虚拟存储器概述 虚拟存储器通过引入逻辑地址空间来扩展物理内存容量。段页式虚拟存储器结合了分段和分页两种方式的优点,在支持按段进行共享的同时也能提供较好的内存管理和保护功能。然而,由于每次地址转换都需要经历两次查找过程(首先是段表,其次是页表),这增加了系统的额外开销[^1]。 对于操作系统而言,它负责管理这些复杂的映射关系以及处理页面置换等问题。应用程序员通常不需要关心具体的细节,只需要知道自己的程序可以在更大的地址范围内运行即可。 #### 主要区别 | 特征 | Cache 存储器 | 虚拟存储器 | | -- | --- | | **位置** | CPU 和 RAM 间的小型临时缓冲区 | 系统级抽象层,涉及磁盘交换文件作为辅助存储 | | **目的** | 提升频繁访问数据的速度 | 扩展可用内存总量,允许更大规模的应用执行 | | **透明度** | 对程序员完全透明 | 需要操作系统的配合和支持 | | **硬件/软件依赖** | 完全由硬件实现 | 结合软硬件共同完成 | ### 示例代码展示两者差异 下面是一个简单的Python模拟例子用于说明两者的不同之处: ```python import random class SimpleCache: def __init__(self, size=8): self.cache = {} self.size = size def access(self, address): if address not in self.cache or len(self.cache) >= self.size: print(f"Miss! Loading data from main memory at {address}") # Simulate loading into cache (here we just add it to dict) self.evict_if_full() self.cache[address] = "data" else: print(f"Hit! Data found in cache for {address}") def evict_if_full(self): if len(self.cache) >= self.size: key_to_remove = next(iter(self.cache)) del self.cache[key_to_remove] def virtual_memory_simulation(): addresses = list(range(0, 100)) * 5 # Repeat some addresses multiple times. random.shuffle(addresses) simple_cache = SimpleCache() for addr in addresses[:20]: simple_cache.access(addr) if __name__ == "__main__": virtual_memory_simulation() ``` 此脚本创建了一个简易版的Cache模型`SimpleCache`类,并展示了如何模拟Cache命中的情况。而对于虚拟存储器来说,实际应用中涉及到的操作更为复杂,包括但不限于页面调度算法的选择、异常处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值