初识cache
1、cache是什么
cache这个名字用来称呼两种物理世界中存在的概念,硬体cache和cache机制。下面来分别介绍。
硬体cache:硬体cache是一种用肉眼可以看得见用皮肤可以摸得着的物品,它是由SRAM(static random-access memory)构成(在计算机硬件系统中main memory由DRAM(dynamic random-access memory)构成。硬体cache在CPU中,直接与寄存器进行数据的传输。

cache机制:有两块存储区域,区域A,区域B,区域B大于区域A,区域A存放区域B中最常用的数据。相比于区域B,由于区域A更小,所以在区域A中寻找一个数据的时间更短。在程式运行过程中,区域A始终维护着区域B中最常用的数据。这样一种机制就称为cache机制。有了cache机制,我们可以更加快速的访问程式需要的数据。当然,这里值得说明的一点是,cache机制之所以有效,是因为程式的一个特性,locality。程式的这个特性可以简单的认为每一个程式一般只访问一些数据,并且经常访问他们(如果想要了解更多关于locality,可以参考本文最后给出的参考材料)。cache机制示意图如下。

在实际使用当中,我们需要根据上下文判断出这里的cache是指硬体cache还是cache机制。 硬体cache从本质上讲是一块具有极高硬件访问速度的存储区域,并在这块存储区域上使用cache机制。所以本文所介绍的相关知识的核心是cache机制。硬件cache只不过加了更好的硬件材料而已。
2、硬件cache以及cache机制在计算机系统中的分布
计算机系统中的memory hierarchy如下图所示,

对于硬体cache。L1cache,L2cache,L3cache是硬体cache,存在于CPU当中。
对于cache机制。L1与L2之间存在cache机制,即L1是L2的cache(如果CPU想访问L2上的数据,那么CPU访问更上层的L1。如果有想要的数据,L1直接返回给CPU;如果没有,再从L2中搜索出想要的数据,并保存到L1当中,最后将此数据返回给CPU)。同理,L2是L3的cache,L3是L4的cache,等等。
3、cache的读与写(这里指cache机制)
在cache机制中,读操作的运行机制是这样的。假设CPU想访问Level k+1 上的数据B,其地址为A。
第1步,根据地址A判断数据B在不在Level k 上,如果在,返回给CPU数据B,我们称cache hit 发生;如果不在,我们进行第2步,并称cache miss 发生;
第2步,在Level k+1 上根据地址搜索出数据B,将数据B所在的block根据替换规则替换Level k上的相对应的block,并返回CPU所需的数据B。注意:这里是将数据B所在的block拷贝到更上层,不仅仅是数据B。一个block不仅包含数据B,还包含邻近的几个数据项。层与层之间的数据的传输都是以block进行传输以提高传输效率。另外层与层之间的block的大小也不一样,一般来说,越靠近底层,block越大,block在32—64 bytes之间。
更加详细的细节描述,比较繁琐,这里不再赘述,只需要阅读完下面的第一个参考资料的一章,并记住拷贝的是block而不仅仅是单个的数据项,即可以理解。
cache的写基于cache的读,读理解了,写自然就理解了。
4、cache的分类
根据cache中存储的是指令还是数据可以分为 I-cache 和 D-cache。
根据每个set的个数,cache line的个数可以分为 directed-mapped caches(多个set,每个set中cache line 只有一个)、set associative caches(多个set,每个set中有多于1个的cache line)、fully associative caches(只有一个set),示意图分别如下图的左、中、右。

5、参考资料
<<computer systems a programmer's perspective>> second edition p559-p615
初识cache的更多相关文章
- 初识virtual memory
一.先谈几个重要的东西 virtual memory是一个抽象概念,书上的原文是"an abstraction of main memory known as virtual memory& ...
- DBA面对新mysql环境
来源:http://blog.csdn.net/wyzxg/article/details/8491152 author:skatetime:2013/01/10 DBA面对新MySQL环境感悟 1. ...
- 初识 MySQL 5.6 新功能、参数
摘要: 继上一篇的文章 初识 MySQL 5.5 新功能.参数 之后,现在MySQL5.6 针对 MySQL5.5 各个方面又提升了很多,特别在性能和一些新参数上面,现在看看大致提升了哪些方面(后续不 ...
- 初识 ServiceWorker
初识ServiceWorker 初识ServiceWorker 在8月份的时候.W3C更新了一个叫Service Workers的API. 了解过HTML5中的Web Worker的人可能会对这个AP ...
- 3 MySQL数据库--初识sql语句
1.初识sql语句 服务端软件 mysqld SQL语句:后面的分号mysql -uroot -p123 操作文件夹(库) 增 create database db1 charset utf8; 查 ...
- Django框架 之 Cookie和Session初识
Django框架 之 Cookie和Session初识 浏览目录 Cookie介绍 Django中的Cookie Session 一.Cookie介绍 1.Cookie产生的意义 众所周知,HTTP协 ...
- 第一章 初识shiro
shiro学习教程来自开涛大神的博客:http://jinnianshilongnian.iteye.com/blog/2018936 第一章 初识shiro 简单了解shiro主要记住三张图即可. ...
- 初识Nginx及编译安装Nginx
初识Nginx及编译安装Nginx 环境说明: 系统版本 CentOS 6.9 x86_64 软件版本 nginx-1.12.2 1.什么是Nginx? 如果你听说或使用过Apache软件 ...
- PHP下的异步尝试一:初识生成器
PHP下的异步尝试系列 PHP下的异步尝试一:初识生成器 PHP下的异步尝试二:初识协程 PHP下的异步尝试三:协程的PHP版thunkify自动执行器 PHP下的异步尝试四:PHP版的Promise ...
随机推荐
- 怎么样在Myeclipse中配置JDK?
1.首先电脑上安装JDK 2.打开Myeclipse >> Window >> Preferences 如图1: 图1 2.Preferences >> ...
- Hibernate 系列 08 - 对象识别机制
目录导读: Hibernate 系列 学习笔记 目录 本篇目录: 为了区别不同的对象,有两种识别方法: 1. 内存地址识别(“==”号识别) 2. equals()和hashCode()识别 1. 以 ...
- 随机生成长度为len的密码,且包括大写、小写英文字母和数字
一道华三面试题,随机生成长度为len的密码,且包括大写.小写英文字母和数字,主要Random类的使用,random.nextInt(len)表示生成[0,len)整数.具体实现见下面代码,已经很详细了 ...
- VS 母版使用配置技巧
采用web.config配置母版,方便母版的变更,处理方法: 1.在web.config配置如下内容: <configuration> <system.web> <pag ...
- Ural 1209. 1, 10, 100, 1000... 一道有趣的题
1209. 1, 10, 100, 1000... Time limit: 1.0 secondMemory limit: 64 MB Let's consider an infinite seque ...
- Spring Mock
今天看别人的测试代码,发现有 MockMvc.MockHttpServletRequest.MockHttpServletResponse ,不知道是干啥的,百度下下才知道 Mock这个东东. 下 ...
- [No0000AB]用Visual Studio 2015在 WIN10 64bit 上编译7-zip (32 bit)
1.7-ZIP简介 7-zip 是一款免费的压缩解压软件.ZIP格式的文件默认被苹果和微软支持,完全不需要额外安装其他软件就可以解压.但对于非US-ASCII编码的文件名和大于2GB的ZIP文件,可能 ...
- GO语言总结(3)——数组和切片
上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...
- [LeetCode] Path Sum III 二叉树的路径和之三
You are given a binary tree in which each node contains an integer value. Find the number of paths t ...
- [LeetCode] Patching Array 补丁数组
Given a sorted positive integer array nums and an integer n, add/patch elements to the array such th ...