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

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

    教材学习内容总结

    • 理解虚拟存储器的概念和作用

    虚拟内存作为缓存的工具
    虚拟内存作为内存管理的工具
    虚拟内存作为内存保护的工具

    • 理解地址翻译的概念

    现代处理器使用虚拟寻址,通过一个虚拟地址(VA)来访问主存,将虚拟地址转换为物理地址的任务叫做地址翻译。CPU芯片上的内存管理单元(MMU)硬件,利用存放在主存中的查询表来动态翻译虚拟地址,这个查询表由操作系统管理。

    • 理解存储器映射

      Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射。虚拟内存区域可以映射到两种类型的对象中的一种:

    1. Linux文件系统中的普通文件
    2. 匿名文件

    一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件之间换来换去。在任何时刻,交换空间都限制着当前运行着的进程能够分配的虚拟页面的总数。

    一个对象被映射到虚拟内存的一个区域,要么作为共享对象,要么作为私有对象。

    • 掌握动态存储器分配的方法

    动态内存分配器维护着一个进程的虚拟内存区域,称为堆。分配器将堆视为一组不同大小的块的集合来维护,每个块就是一个连续的虚拟内存片,要么是已分配的(显式地保留为供应用程序使用,释放可以显式/隐式执行),要么是空闲的(保持空闲直到被分配)。

    显式分配器:

    malloc返回一个指针,指向大小为至少size字节的内存块。不初始化它返回的内存
    calloc将分配内存初始化为0。
    realloc改变已分配块的大小。
    free释放已分配的堆块。

    分配器的实现:
    分配器组织堆的数据结构是隐式空闲链表。放置、分割、合并。
    更好的,将空闲块组织为某种形式的显示数据结构。比如双向空闲链表。或者采用分离存储,维护多个空闲链表。

    • 理解垃圾收集的概念

    垃圾收集器是一种动态内存分配器,它自动释放程序不再需要的已分配块。定期识别垃圾块,并相应地调用free,将这些块放回到空闲链表中。

    垃圾收集器将内存是为一张有向可达图,不可达节点对应于垃圾。

    • 了解C语言中与存储器有关的错误
    1. 间接引用坏指针
    2. 读未初始化的内存
    3. 允许栈缓冲区溢出
    4. 假设指针和它们指向的对象是相同大小的
    5. 造成错位错误
    6. 引用指针,而不是它所指向的对象
    7. 误解指针运算
    8. 引用不存在的变量
    9. 引用空闲堆块中的数据
    10. 引起内存泄露

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

    • 问题1:我看了P561,将虚拟内存作为缓存的工具,我的困惑是虚拟内存存放的是什么?
    • 问题1解决方案:我的理解是,虚拟内存里存放的是找到对应主存单元的虚拟地址。虚拟内存分为三种状态:未分配的,缓存的,未缓存的。
    • 问题2:“DRAM缓存是全相关联的”这是什么意思?
    • 问题2解决方案:我的理解是,DRAM缓存就是全部虚拟页的集合,而这些虚拟页可以映射到物理内存的任意物理页。

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

    • 问题1:我看了P588,sbrk函数通过将brk指针增加incr来扩展和收缩堆。如果成功就返回brk的旧值。为什么不是返回新值?
    • 问题1解决方案:在网上找了资料,并尝试调用了一下sbrk这个函数,发现sbrk返回的的确是旧指针,但brk已经加了size。

    测试代码和结果如下:

    #include<stdio.h>
    
    #include<unistd.h>
    
     
    
    void main()
    
    {
    
         int * p1=sbrk(0);     //得到大块空闲空间的首地址初始化指针
    
         int * p2=sbrk(4);     //分配4个字节的空间先返回空闲空间的首地址,在将指针加4
    
         int * p3=sbrk(4);     //同理,返回的指针地址为上一次sbrk返回的地址+size
    
         int * p4=sbrk(-3);
    
         int * p5=sbrk(0);
    
         printf("%p
    ",p1);
    
         printf("%p
    ",p2);
    
         printf("%p
    ",p3);
    
         printf("%p
    ",p4);
    
         printf("%p
    ",p5);
    
    }
    

    image

    代码托管

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

    上周考试错题总结

    • 错题1及原因,理解情况
    • 错题2及原因,理解情况
    • ...

    结对及互评

    点评模板:

    • 博客中值得学习的或问题:
      • xxx
      • xxx
      • ...
    • 代码中值得学习的或问题:
      • xxx
      • xxx
      • ...
    • 其他

    本周结对学习情况

    - [结对同学学号1](博客链接)
    - 结对照片
    - 结对学习内容
        - XXXX
        - XXXX
        - ...
    

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

    xxx
    xxx

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 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小时

    • 改进情况:

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

    参考资料

  • 相关阅读:
    Northwind测试学习用数据库
    DataTables在回调方法中使用api
    DataTables获取表单输入框数据
    DataTables选择行并删除(删除单行)
    DataTables选择多行
    DataTables给每一列添加下拉框搜索
    AngularJS 父子控制器
    更改AngularJS的语法解析符号
    AngularJS中的控制器示例_3
    AngularJS中的控制器示例_2
  • 原文地址:https://www.cnblogs.com/clever-universe/p/7967292.html
Copyright © 2011-2022 走看看