zoukankan      html  css  js  c++  java
  • 计算机存储系统学习心得

    分层组织

    计算机存储系统由高层到低层分别名之寄存器堆、高速缓存(cache)、主存(main memory)和外存(secondary memory)。那么为什么记忆系统要层次化呢?如果答案是效率,那么提效的原理又是什么呢?如果原理是传说中的局部性原理(principle of locality),那么它又是如何实现的呢?对系统开发人员与应用开发人员有什么影响呢(明显的是记忆系统分层是对应用开发人员透明的,他们感觉不到分层的存在)?

    高速缓存

    高速缓存作为一块从内存到CPU的缓冲区,用来保存在内存中被频繁使用的数据块。存储系统层次化的一个目标就是提高CPU访问数据的时间,让这个时间尽量逼近高速缓存的速度。这个目标完成的效果取决于三个因素:第一,程序本身的行为特质;第二,高速缓存的容量和组织方式;第三,缓存数据替换的策略(cache replacement policy)。处理器的一个数据引用在高速缓存找到称为“缓存命中(cache hits)”,否则叫“缓存不命中(cache misses)”。发生不命中时,(系统得先将)不命中的数据从内存取出,这个动作会将包含不命中数据的整块数据载入高速缓存(KEMIN:怎么个整块法?配置好的?)。

    高速缓存的组织方式决定了CPU搜索缓存的方式。高速缓存可以组织成三种方式:直接映射(direct mapped)、全相联映射(fully associative)和组相联映射(set associative)。直接映射方式无须替换算法,而后两都需要一些策略(FIFO, LRU或其它策略)来决定如何替换不命中的数据块。

    虚拟内存

    计算机存储系统层次化的另一个目的是利用大容量的外存来扩充主存,这就是所谓的虚拟内存机制。虚拟内存可以让我们把程序运行在一个比较实际内存大的虚拟地址空间内。虚拟内存另一项功能就是实现多道技术,让多个进程共享内存资源。虚拟内存机制的代价是需要额外的空间保存管理信息(像地址映射程序、页表等)、对虚拟地址转换所耗费的时间和发生缺页时的处理时间。

    虚存与主存的关系与主存与缓存的关系很相似。由于种相似性,高速缓存与地址转换后备缓冲器TLB( Translation Lookaside Buffer)常常让人很迷惑。实际上,TLB也是高速缓存,一种有特定用途的高速缓存区。我们必须清楚,虚拟地址必须先被转为物理地址才能访问主存的,这也就是TLB的功能所在。虽然同样作为一种缓冲区,高速缓存与(分过页的)主存的功能目标不太一致,高速缓存偏向提高访问速度,而分过页的主存(也就是虚存)更多是扩充主存。

    思想

    计算机存储系统层次化的设计思想是以存储器访问的所谓“局部性”为基础的,包括时间局部性和空间局部性。

    P.S.这个以局部性为基础的基础字眼使用我意识到,是局部性的客观存在决定了存储器的层次化设计,不是反之。换句话说,局部性是事物存在的普遍法则,而存储器层次化只是一个特例。

    P.S.这局部性思想又让我想起了其它的思想的客观存在性,比如实现并发机制是中断思想……

    计算机存储系统层次结构的中心思想是,是对每个K,位于K层的更快更小的存储设备作为位于K+1层的更大更慢的存储设备的缓存。换句话说,层次结构中的每一层都缓存来自较低一层的数据对象。

    管理

    对计算机存储系统层次结构中的每一层,必须有某种形式的逻辑照管(manage)缓存(的功能实现)。这个逻辑包括如何划分缓存为块、如何访问缓存、如何判断缓存是否命中,如何用新的数据块替换旧的数据块。这个逻辑可以由硬件、软件或两者的一种结合来实现。比如,寄存器堆(register file)是位层次结构中的最高层,它比较特殊,是由编译器来“管理”,管理方式如分配寄存器给某变量。这个“管理”逻辑是软件;

    再如CPU的一级(L1)及二级(L2)高速缓存是完全靠内置的硬件来“管理”的。这个管理逻辑是硬件;在实现了虚拟内存的系统里,内存作为外存的缓存,这个虚拟的“缓存”是由操作系统软件和CPU的地址转换硬件(如MMU)共同“管理”的。

    还有一个例子,在具有分布式文件系统(比如AFS)的机器里,外存作为整个分布式网络数据库的“缓存”,由本机的AFS客户端进行“管理”。

    在作为一个数据的使用者,比如应用开发人员,是不需关心缓存的实现的,缓存机制对他们来是自动的,透明的;但是对计算机存储系统的管理者,比如操作系统开发人员则必须了解这些“管理”功能的实现原理。

    KEMIN:作为一个系统开发人员,接触硬件开发可能性比较小,所以对CPU高速缓存有基本的了解就行了;但计算机存储系统开发人员很可能参与像编译优化、操作系统移植等工作,所以对这两个“管理”功能实现必须要掌握。
    转自:http://storage.cnw.com.cn/storage-case/htm2013/20130331_266755.shtml

  • 相关阅读:
    [EffectiveC++]item22:Declare data members private
    垃圾人定律
    [EffectiveC++]item17:以独立语句将newed对象置入智能指针
    [EffectiveC++]item15:Provide access to raw resources in resource-managing class
    C++ 中operator用法:隐式类型转换
    [EffectiveC++]item13:Use objects to manage resources(RAII)
    为什么拷贝构造函数的参数必须是引用?
    SPF邮件服务器
    raspberry
    bash
  • 原文地址:https://www.cnblogs.com/chenying99/p/4116622.html
Copyright © 2011-2022 走看看