zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155215 《信息安全系统设计基础》第9周学习总结

    2017-2018-1 20155215 《信息安全系统设计基础》第9周学习总结

    教材学习内容总结

    目标内容:

    1. 了解常见的存储技术(RAM、ROM、磁盘、固态硬盘等)
    2. 理解局部性原理
    3. 理解缓存思想
    4. 理解局部性原理和缓存思想在存储层次结构中的应用
    5. 高速缓存的原理和应用
    • 第六章:

    • 存储器层次结构:

    • 存储器系统:具有不同容量、成本和访问时间的存储设备的层次结构

    • 高速缓存存储器设备:主存中的数据和指令的缓冲区域

    • 随机访问存储器:

    • RAM分为静态和动态两类

    • 静态SRAM比动态DRAM快

      • 静态RAM:将每个位存储在一个双稳态的存储单元里
      • 动态RAM:将每个位存储为对一个电容的充电
    • 传统的DRAM:单元被分成d个超单元,每个超单元由w个DRAM单元组成

    • 增强的DRAM:快页模式DRAM、扩展数据输出DRAM、同步DRAM、双倍数据速率同步DRAM、Rambus DRAM、视频RAM

    • 磁盘存储:

    • 磁盘构造:由盘片构成,每个盘片有表面,主轴,磁道,扇区

    • 磁盘容量:容量由记录密度、磁道密度、面密度决定

    • 磁盘操作:访问时间有三个主要部分寻道时间、旋转时间和传送时间

    • 逻辑磁盘块:磁盘控制器维持着逻辑块号与实际的磁盘扇区之间的映射关系

    • 访问磁盘:CPU使用存储器映射I/O技术向I/O设备发出命令

    • SSD随机访问时间比旋转磁盘快

    • 局部性:

    • 局部性原理:计算机程序倾向于引用邻近于其它最近引用过的数据项的数据项,或者最近引用过的数据项本身的倾向性

      - 时间局部性:被引用过一次的存储器位置很可能在不远的将来被再次引用
      - 空间局限性:如果一个存储器被引用了,在不远的将来很可能会引用附近的一个存储器位置
      
    • 存储器层次结构

      • 缓存命中:程序需要的数据块恰好缓存在第k层
      • 缓存不命中:第k层中没有缓存需要的数据,从第k+1层读取一个数据块可能会替换(驱逐)一个现存的块
    • 缓存不命中种类:冷不命中、强制性不命中(冷缓存)、冲突不命中(限制性的放置策略)、容量不命中(工作集的大小超过缓存的大小)

    • 缓存管理:编译器管理寄存器文件,缓存结构层次的最高层

    • 通用的高速缓存存储器结构

    • 写问题

      • 写命中
      • 直写:立即将w的高速缓存块写回到紧接着的低一层中
      • 写回:尽可能的推迟存储器更新,只有当替换算法要驱逐更新过的块时,才把它写回紧接着的低一层中
      • 写不命中
      • 写分配:加载相应的第一层中的块到高速缓存中,然后更新这个高速缓存块
      • 非写分配:避开高速缓存,直接把这个字写到第一层中
    • 一个真实的高速缓存层次结构的解剖

      • i-cache:只保存指令的高速缓存,通常只读
      • d-cache:只保存程序数据的高速缓存
    • 统一的高速缓存:即保存指令又保存程序数据

    • 高速缓存参数的性能影响

    教材学习中的问题和解决过程

    • 问题1:练习题6.7:

    改变下列函数的循环顺序,使它以步长为1的引用模式扫描三位数组a:

    int sumarray3d(int a[N][N][N])
    {
        int i,j,k,sum=0;
        
        for(i=0;i<N;i++){
            for(j=0;j<N;j++){
               for(k=0;k<N;k++){
                sum+=a[k][i][i];
               }
            }
        }
        return sum;
    }
    
    

    我觉得我还是没有理解题目是如何改变循环次序的。

    这是答案代码:

    int sumarray3d(int a[N][N][N])
    {
        int i,j,k,sum=0;
         
        for(k=0;k<N;k++){
            for(i=0;i<N;i++){
               for(j=0;j<N;j++){
                sum+=a[k][i][i];
               }
            }
        }
        return sum;
    }
    
    
    • 问题1解决方案:

    我看了书上的解析,说是

    改变循环次序,使得最右边的次序变化的最快。

    就可以达到目的,但是我发现我没有理解这一点。

    我重新阅读了书上的6.2局部性一节,我认识到,多维数组的存储是按照行顺序存储的,所以只有按照相应的编号,1,2,3,4...读取的才是步长为1的,也就是说要改变循环顺序,按照数组被存储的行优先顺序来,否则,就不是步长为1.

    代码调试中的问题和解决过程

    • 问题1:暂无

    代码托管

    (statistics.sh脚本的运行结果截图)

    上周考试错题总结

    • Linux信号处理说法正确的是()
      A .
      可以用signal()处理信号
      B .
      一个信号最多只能被接收一次
      C .
      kill(1)用来杀死进程
      D .
      kill(1)用来发送信号
      E .
      可以通过键盘发送信号
      F .
      可以用sigaction()处理信号
      正确答案: A B D E F 你的答案: B D E F

    • 有关exec系列函数,下面说法正确的是()
      A .
      可以用char[][] 来传递argv
      B .
      进程调用了exec系列函数后,pid会变
      C .
      进程调用了exec系列函数后,代码会改变。
      D .
      system()和exec系列等价。
      E .
      exec系列函数中带e的要传入环境变量参数
      F .
      exec系列函数中带v的要传入环境变量参数
      正确答案: C E 你的答案: A C E

    • 关于代码 int main(){} 说法正确的是()
      A .
      返回值是0
      B .
      返回值不确定
      C .
      会调用exit(0)
      D .
      返回值大于0
      E .
      上面代码运行完,在命令行中运行echo $? 的值是0
      正确答案: A C E 你的答案: A E

    • Unix/Linux中通过调用( )可以获取子进程PID。
      A .
      getpid()
      B .
      getppid()
      C .
      getcpid()
      D .
      fork()
      正确答案: D 你的答案: A

    • 有关异常,下面说法正确的是()
      A .
      系统中的异常由异常名唯一确定
      B .
      异常表中存放的是异常处理程序
      C .
      异常表的起始地址存放在异常表基址寄存器中
      D .
      异常处理程序运行在内核模式下
      正确答案: C D 你的答案: A C D

    • 进程上下文包括程序的( )
      A .
      代码和数据
      B .

      C .
      通用寄存器中的内容
      D .
      程序计数器
      E .
      环境变量
      F .
      打开的文件描述符的集合
      正确答案: A B C D E F 你的答案: B C D F

    • Linux中,信号(Signal)是一种()异常控制流。
      A .
      硬件层
      B .
      操作系统层
      C .
      用户层
      D .
      网络层
      正确答案: C 你的答案: B

    结对及互评

    点评模板:

    • 博客中值得学习的或问题:
      • 5232同学进行了在课本的学习部分记录很丰富。

    本周结对学习情况

    - [20155232](http://www.cnblogs.com/lsqsjsj/p/7860398.html)
    

    其他(感悟、思考等,可选)

    感觉这周的实验难度很大,虽然说是每个人一组,但是其实实验过程中还是有很多和我之前的搭档一起完成的部分。感觉自己在SOCKET编程上还有很多需要提高的,虽然在《网络编程基础》中学习了很多,老师讲的也很详细,但是书到用时方恨少,而且linux环境和java环境也是不同的,仍然有很多地方需要我去学习。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 200/200 2/2 20/20
    第二周 300/500 2/4 18/38
    第三周 500/1000 3/7 22/60
    第四周 300/1300 2/9 30/90

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:XX小时

    • 实际学习时间:XX小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    Python select示例
    Python paramiko
    Python SQLAlchemy之多对多
    Python SQLAlchemy
    Python 上下文关系
    Python rabbitmq
    Python mysql
    使用Word 2013向cnblog发布博文
    jquery lazyload延迟加载技术的实现原理分析_jquery
    jquery-懒加载技术(简称lazyload)
  • 原文地址:https://www.cnblogs.com/xuanyan/p/7839884.html
Copyright © 2011-2022 走看看