cache子系统介绍

cache子系统

1. 为什么需要cache子系统?

处理器执行指令的速度远大于一次访存miss造成的阻塞,两者的时间不在一个数量级。所以处理器的性能瓶颈在于数据从DISK到DDR到ALU的速度。内存墙是限制处理器发挥性能的主要瓶颈。

cache是利用程序局部性原理减轻memory wall的影响。

  • 时间局部性

    如果某条指令被执行,那么不久后再次被执行的可能性较大。指令不存在空间局部性,所有I-CACHE不能对memory-wall的影响有限。

  • 空间局部性

    如果程序访问了内存的某个单元,那当前内存单元相邻的内存单元短期内可能被访问的概率较大。D-cache主要利用空间局部性原理,加快cpu的访存数据的速度,同时通过一系列方法降低cache-miss造成的等待来提高CPU效率。

2.cache子系统的基本架构

多核系统中cache结构大致如下:

在这里插入图片描述

其中L1包含D-cahce和I-cache。各层cache的规律如下:

访问速度:L1>L2>L3,容量大小:L1<L2<L3。L1的访存速度最快,但是容量也最小,为核独有。L2,L3一般为共享cache,可以多核使用。L3访存速度最慢,但是容量最大。通过多级cache的机制,降低cache-miss的概率,提高数据/指令的访存速度。

3.cache系统如何建立地址映射规则

cache的地址映射主要有三种:全相连,直接映射,多路组相连。cache的地址映射是操作系统看不到的,软件不可见,由硬件维护。

  • 全相连

    主存中的任意一块数据可以映射到cache中的任意一块cacheline中。全相连的地址映射灵活度最高,cache利用率最高(全部cacheline都可以被使用),程序性能提升最大。但是控制电路复杂度极大,只能小规模使用。

  • 直接映射

    主存中一块数据只能映射到cache中的唯一特定块。电路实现最简单,只需要使用mod操作即可。但是容易产生cache震荡产生性能问题。例如有1024条cacheline,block0和block1024使用同一条cacheline0,如果block0和block1024经常被使用,则cacheline0则会被频繁的写入,换出。

  • 多路组相连

    全相连和直接映射的折中,多路组相连将整个cacheline空间氛围大小相同的n个way,每一个way包含2^m条cacheline,对于每个block,可在一个way中由直接映射或者n选1的方式进行替换。

目前CPU的主数据cache多采用多路组相连的地址映射方式。

这里再多探讨下不同场景下cache的使用策略:

  • 刚被替换出去的cacheline,马上又被使用

    因为cache-set的数量通常比可以映射到其中的地址数量少,会出现刚被淘汰的数据马上需要使用的情况。这时候为了避免性能下降,在实际设计中会使用一个小规模的全相连的victim cache来缓解这种冲突,并且victim cache中的数据和主cache中的数据互斥。victim-cache为全相连的,可以存储任意block,并且如果其中的数据马上需要被访问,可以从victim cache获取,可以提高该场景下的性能。

  • 页表的cache

    页表是操作系统维护虚拟地址和物理地址的一个映射表,页表一般存储在硬盘中,在需要的时候load到内存中。虚拟地址需要通过mmu进行地址转换才能对物理存储器进行寻址,此时就需要使用到页表。所以为了加快地址转换的效率,MMU内部有一个TLB(translation lookaside buffer)。TLB为页表cache,具备时间相关性。空间相关性弱,即未必会访问当前页的相邻页,因此预取等方法无法使用到TLB中。现代处理器一般使用两级TLB,第一级分为I-TLB和D-TLB,采用全相连结构。第二级指令数据共用,采用组相连。此处的TLB规模小,所以采用全相连的结构。

    现代处理器中一般支持大小可变的页,由操作系统进行管理,很久不同应用选择不同大小的页,最大限度利用TLB。页太小,多级页表转换效率低;页太大,如果程序数据较小,则容易造成页浪费,整体效率低。

4.cpu核如何从cache中获取数据

cpu从cache中取数据的过程就是查找数据所在cacheline是否在N-way组相连中存在的过程。

通过tag-set-ofst三部分进行译码寻址。cache-hit时从cacheline中直接获取数据;cache-miss时需要从DDR中读取数据,替换cacheline。

5.cache系统如何替换数据

常用的替换算法有:随即替换,轮转替换,最近最少使用替换,最近使用替换,最不经常使用替换。

6.cache数据写回策略

cache数据写回策略为:write-through和write-back两种策略。

write-through:同时更新cache和DDR中的数据。此时cache和DDR中的数据是一致的,但是需要等待DDR回写完成,降低效率。

write-back:只更新cache,不刷新DDR。当替换cacheline时再写回到DDR。此时cache和DDR中的数据是不一致的,根据一致性协议维护数据一致性。

7.多核系统如何保证cache一致性

通过MOESI一致性协议维护多核之间cache一致性。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值