对缓存的思考——提高命中率

简介: 开篇编写高效的程序并不只在于算法的精巧,还应该考虑到计算机内部的组织结构,cpu微指令的执行,缓存的组织和工作原理等。好的算法在实际中不见得有高效率,如果完全没有考虑缓存、微指令实现的话。前两篇博文局部性原理浅析 介绍了程序的局部性原理,如何写出局部性良好代码。

开篇

编写高效的程序并不只在于算法的精巧,还应该考虑到计算机内部的组织结构,cpu微指令的执行,缓存的组织和工作原理等。

好的算法在实际中不见得有高效率,如果完全没有考虑缓存、微指令实现的话。

前两篇博文

局部性原理浅析 介绍了程序的局部性原理,如何写出局部性良好代码。

提高程序性能、何为缓存 讨论了存储器层次结构,计算机内部的存储结构、缓存的概念,简单的介绍了缓存的工作机制。

建议先阅读前两篇博文,虽然他们之间联系不大,在前面也有一些对本文的铺垫。而且,这是一个系列的文章。旨在优化程序性能。

这篇博文主要介绍的是缓存的组织、工作原理。拨开迷雾,让你更加清晰的认识缓存。

通用缓存结构

回顾

提高程序性能、何为缓存中提到:早起的cpu存储层次只有三层,即cup的寄存器,DRAM主存和磁盘存储。因为寄存器和主存之间的访问时间开销差距很大,于是设计者在寄存器(一个时钟周期)和主存之间加入了L1缓存(2——4个时钟周期),后来由于L1缓存和主存之间的差距,又在主存和L1之间加入了L2缓存,当然后面还有L3缓存,,,等等。

在这里为了简单起见,假设CPU寄存器和主存之间只有一个L1缓存。

下图是高速缓存存储器的典型总线结构:

缓存结构

下图清晰的说明了通用缓存的组织结构:

可以看到,缓存内部是以组的形式组织的。图中的每一块代表一组,每组由一到多行组成(当然图中的是每组有多行)。

每一行包括

1 位标记位(valid bit)标明这行的信息是否有可用

t 位的标记,标明它是属于这一组的哪一行

剩下的空间是存储数据的数据的空间

可以看出在下面的图中把数据地址分为了三部分,左边 t 位是标记行号的,中间的 s 位标明组号,最后的 b 位则是数据块在行内的偏移量。

通常来说,缓存器可描述为(S; E; B; m)其中S为缓存中的组数,E为每组的行数,B为每行存储的字节数,m为缓存的地址位数。

所以缓存的容量为C=S

目录
相关文章
|
2月前
|
缓存 NoSQL 前端开发
16)缓存雪崩、缓存击穿、缓存穿透
16)缓存雪崩、缓存击穿、缓存穿透
38 0
|
5月前
|
存储 缓存 对象存储
合理地处理不需要的缓存
【6月更文挑战第8天】本文介绍了管理缓存数据过期的重要性,以避免内存浪费和过时信息的使用。缓存系统通常允许设置默认过期策略或为每个对象指定绝对或滑动过期时间。缓存服务常使用LRU策略进行逐出,但过度使用可能导致内存超出异常。
59 10
合理地处理不需要的缓存
|
5月前
|
存储 缓存 监控
详解缓存雪崩、缓存击穿、缓存穿透问题,一文掌握,干货不断
详解缓存雪崩、缓存击穿、缓存穿透问题,一文掌握,干货不断
|
缓存 运维 监控
缓存穿透,缓存击穿,缓存雪崩详解
缓存穿透,缓存击穿,缓存雪崩详解
97 0
|
存储 缓存 前端开发
缓存(2) —— 命中率
缓存(2) —— 命中率
209 0
|
缓存 应用服务中间件 数据库
缓存穿透、缓存雪崩、缓存击穿
缓存穿透、缓存雪崩、缓存击穿介绍
180 0
缓存穿透、缓存雪崩、缓存击穿
|
缓存 开发框架 NoSQL
7.4缓存
缓存是一个用来保存数据的区域,从缓存中读取数据要比从数据源读取数据的速度快很多。如果可以从缓存中获取要获取的数据则称之为“缓存命中”,多次请求命中的请求占全部请求的百分比叫做“命中率”,如果数据源中的数据保存到了缓存后,发生了变化则称之为“缓存数据不一致”
|
存储 缓存 运维
常用缓存技巧
在项目中,大家经常会遇到处理高并发的情况,缓存是应对高并发的有效手段之一。这篇文章简单介绍一下常用的缓存手段。
|
缓存 数据库 双11
缓存存在的问题:缓存穿透、缓存击穿、缓存雪崩
缓存穿透是指数据库和缓存都没有的数据,每次都要经过缓存直接去访问数据库,大量的请求打到DB可能导致DB宕机。
135 0
|
存储 缓存 JSON
缓存的注意点
设计缓存的考虑