智慧的存储

智慧的存储

——Cahce无名的英雄

     智慧的存储?我首先联想到的是硬盘,因为如今的硬盘已经是今非昔比,同一个体积,不同的容量,随着big data时代的到来,硬盘的价格也从原来的望而却步到如今的白菜价格,硬盘对于存储两个自硬盘当之无愧,但是当其面对智慧之时他就显得有点羞涩了。其次我想到了CPU中的寄存器,这可是说是CPU中除了逻辑运算单元最主要的部件了,它保存了我们想要的所有的中间数据,真的是不敢想象加入没有register我们的生活今天是什么样子的!假如没有register,可能我们还要再为将运算的中间结果保存到内存中而蹉跎岁月。让我们在寄存器面前谈论智慧两个字有点就是像在班门弄斧,但是面对几KB级别的存储容量,如今所有的数据动辄就上G的时代,他未免显得有点相形见绌了吧!

      面对如同庞然大物的硬盘与浓缩就是精华的寄存器,我想Cache就是两者的集大成者了,这其实符合我们中国人的中庸之道,做事既不要强出头,但是拿出哪一个方面来我都不差,韬光养晦,运筹帷幄,是中国人的智慧。

      让我们把目光停留在20世纪80年代,当PC这个对于现在的我们耳熟能详的名字,但是在当是是一个不可想象的概念,当时所有的人都在质疑像ENIAC这样的巨型怪物有一天可以出现在我们的家里、我们的办公桌上,更不敢想象有一天他可以让我们拎在手里甚至放入我们的口袋(例如今天的PDA和手机)。但是奇迹真的发生了,IBM的第一台PC将我们的迅速带入了以PC为代表的信息时代。但是当时PC似乎成为了一切贬义词的代名词,什么笨重、速度慢、使用复杂……任何不好的词汇都可以毫不夸张的形容当时的PC,但是时间不是静止的,我们在抱怨的时候,制造PC机的工程师们在卧薪尝胆,PC的技术在日臻完善。

      但是当时光停留在20世纪90年代时,似乎计算机的发展遇到了瓶颈,高速的CPU与低速的主存之间因速度差异带来的矛盾原来越激化,当时处理的办法有很多种,但是没有一种可以很好的解决这种因速度带来的差异,它们大都是用牺牲CPU的工作效率去解决这个问题,但是这显然不是一个很好的解决方案。

      而就在这个时间cache应运而生,这就像是中国人始终信奉的面对困难时候的做法一样:逢山开路遇水填桥!

      当我们仔细研究cache的时候,有一点不可以不提前说的就是程序,因为我们的计算机不是做科学计算就是在运行服务,而这背后的一切都是程序在控制,从高级语言到汇编语言再到机器指令最终归结微指令,面对这么庞大又复杂的系统,其一个致命的弱点就是所有的任务都是穿行处理的,无论是单核亦或是多核他们都是串行处理机制,这就造成了程序在运行的过程中其时间和空间局部性就很明显!这就像是我们想要走100m的距离,我们首先要迈出第一步,而后就是走完全程。这就为cache的存在提供了充分条件,是的cache的存在不再是空中楼阁,假如程序是并行的,每一个程序可能访问一下起始的主存空间,一会访问一下末尾的主存空间,那么cache这个缓冲存储器还就真的没有存在的必要性了!

      当了解到了程序执行的时空局部性的时候,那么cache的存在就显得充满了智慧了。当我们的一个程序在运行时我们捎带着把他的连带的一部分主存空间也送入到cache中,因为cache的速度与CPU的速度比较接近,所以就可以很大的减少时间的浪费。举一个比较形象的例子:我们要从武汉去北京,这要是在古代我们只能借助我们双腿,但是到了19世纪我们就可以借助火车,等到了现代我们还可以使用飞机,而这几者速度就显而易见了,我们不行,但是我们可以借助中间的中介,方便的解决问题!就像荀子在《劝学》中所说的那样“君子性非异也,善假于物也。”这个道理我们的老祖宗就知道了,到了现在我们的cache就是实例化的一个例证!

      当我们把主存的东西调入到cache就万事大吉了吗?显然不是,如果所有的问题都是这么简单那么给穷人发点钱,给要饭的一口粮食不就解决问题了吗?贫穷、饥饿就不会存在了吗?但是问题绝对不是这么简单!Cache的存在也是,简单的搬运工不是智慧的,就像当年的祖国照搬照抄苏联的斯大林模式,最终不还是失败了吗,我们要走中国特色的社会主义,历史和现实证明我们成功了。Cache也是一样,不能简单的搬运,处理从主存来的数据就是cache最智慧的表现。

      假如cache的关系与主存之间数据的映射关系是凌乱的,那么CPU会花费很多的时间去管理cache中的数据。就像一个已经拥有一个孩子夫妻又生了一个孩子,又赶上第一个孩子超级调皮,那么这对夫妻一定会焦头烂额,而假如第一个孩子很听话懂事,那么这对夫妻不但不会为第一个孩子分心,反而会因为长子分担一些工作而松心不少。

      Cache的映射机制就闪烁着智慧,它的智慧的核心体现就是对于主存地址创造性应用。对于16位或者32位的内存地址我们怎么用?到底把内存的数据映射到什么地方?可能这在一般人开来几乎是毫无头绪的事情,但是cache的工程师们将这区区的几字节的二进制数使用到了极致!拿直接相连的映射方式来说对于32位的一个内存地址,它把它分成了区号、区内块号、块内偏移3部分,而其中最不可思议的地方就是有些位可以不存储在cache中,但是却可以很精确的寻找到指定位置的内存单元!这种有秩序的数据管理机制极大的节省了时间并且CPU不用因为多了一级的缓冲存储器而浪费过多的额外时间。

      以上的智慧在我看来都是肤浅的智慧,因为一个有智慧的工程师,亦或是几个臭皮匠经过几代人的摸索同样可以得到相同的解决方案,只不过是时间实现的先后问题了。其实在我看来cache的最主要的智慧是其与世无争的这种境界,但我们步入电脑城,想买一台电脑时,可能我们第一个要问的问题就是CPU的主频是多少,内存有多大,硬盘多少容量,很少有人会关心cache的容量,但是我们要好好想想,如果没有cache那么CPU只能空等,主存一样被闲置。在这个时代,所有的人都恨不得出众,让自己为人所知,有些人恨不得想尽办法让自己成为公众人物,但是拥有cache这种性格的人越来越少。虽然cache只是计算机中的一个很小的部件,但是它代表的确实是这个世界最伟大的精神!非淡泊无以明志,非宁静无以致远。

            向cache这个睿智但无名的英雄致敬!

转载于:https://www.cnblogs.com/wangqingbaidu/archive/2012/12/01/2797451.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值