DAZHA大渣

  • 主页
  • 随笔
  • about
总文章数: 11
所有文章 友链 关于我

DAZHA大渣

  • 主页
  • 随笔
  • about

深入理解计算机系统读书心得

2019-09-14 阅读量
字数:1.1k字 | 预计阅读时长:4分钟

第六章——存储器层次结构

  • 磁盘容量 = 字节数(扇区)* 平均扇区数(磁道)* 磁道数 (表面)* 表面数 (盘片)* 盘片数(磁盘)
  • 磁盘结构

  • 内存和磁盘技术的一个基本事实:增加密度(从而降低成本)比降低访问时间容易得多

局部性(locality)

  • 一个有良好局部性的计算机程序倾向于引用邻于其他最近引用过的数据项的数据项,或者最近引用过的数据本身。
  • 时间局限性:被引用过一次的内存位置很可能在不远的将来再被多次引用。
  • 空间局限性:若一个内存位置被引用了一次,那么程序很可能再不远的将来引用附近的一个内存位置。
  • 局部性小结:
  • 重复引用相同变量的程序有很好的时间局部性。
  • 对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性。在内存中以大步长跳来跳去的程序空间局部性会很差。
  • 对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。

空间局部性举例

1
2
3
4
5
6
7
8
9
> #define N 1000
>
> typedef struct{
> int vel[3];
> int acc[3];
> } point;
>
> point p[N];
>

​ structs数组

1
2
3
4
5
6
7
8
9
10
11
12
> void clear1(point *p, int n)
> {
> int i,j;
> for(i=0; i<n; i++)
> {
> for(j=0; j<3; j++)
> p[i].vel[j]=0;
> for(j=0; j<3; j++)
> p[i].acc[j]=0;
> }
> }
>
1
2
3
4
5
6
7
8
9
10
> void clear2(point *p, int n)
> {
> int i,j;
> for(i=0; i<n; i++)
> {
> for(j=0; j<3; j++)
> p[i].vel[j]=0;
> p[i].acc[j]=0;
> }
>
1
2
3
4
5
6
7
8
9
10
11
> void clear3(point *p, int n)
> {
> int i,j;
> for(j=0; j<3; j++)
> {
> for(i=0; i<n; i++)
> p[i].vel[j]=0;
> for(i=0; i<n; i++)
> p[i].acc[j]=0;
> }
>

以上三段代码中, clear1 优于clear2 优于clear3

  • 抖动(thrash) 是指高速缓存反复地加载和驱逐相同的高速缓存块的组。

想象一个函数求出两个各有10个元素的数组每组元素的乘积,但是高速缓存一次只能保存一个数组的大小(即十个元素)由于第一次读缓存是冷不命中(cold miss)于是从下一级缓存中获取数组1,但读取数组二时同样未命中(miss),于是从下一级中读取数组2,并替换掉数组1,当再次需要数组1时仍旧为miss….重复以上过程即时抖动。

  • 对于抖动的优化很简单,仍旧使用上面10个元素数组的例子,这次我们将数组设置成15个元素(后两个为空)这次高速缓存因为小于数组大小于是便不会出现抖动
  • 为何高速缓存要用中间位来做组索引?
标记 组索引 位偏移
t 位 s位 b位

缓存工作原理

缓存工作原理

若地址为0x0E34

则答案

对高速缓存友好的代码

  • 让最常见的情况运行得快,即循环部分
  • 尽量减小每个循环内部的缓存不命中数量
  • 对局部变量的反复引用时好的
  • 步长为1 的引用模式是好的
  • 一个读带宽的时间和空间局部性的二维函数称为存储器山(memory mountain)
  • 每个计算机都有表明它存储器系统的能力特色的唯一的存储器山

推荐的技术

  • 将注意力集中在内循环上,大部分计算和内存访问都发生在这里
  • 通过按照数据对象存储在内存中的顺序、以步长为1的来读数据,从而使得你程序中的空间局部性最大
  • 一旦从存储器中读入了一个数据对象,就尽可能多地使用它,从而使得程序中的时间局部性最大
赏

谢谢啦~

支付宝
微信
  • 读书心得

扫一扫,分享到微信

微信分享二维码
LaTeX Markdown的安装以及使用
深入理解计算机系统读书心得
© 2019 DAZHA大渣 载入天数...载入时分秒...
本站总访问量次
  • 所有文章
  • 友链
  • 关于我

tag:

  • 环境搭建
  • 读书心得
  • 项目练手

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 啥都没有哦
这里是DAZHA大渣的个人博客哦!