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\n",p1);

     printf("%p\n",p2);

     printf("%p\n",p3);

     printf("%p\n",p4);

     printf("%p\n",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小时

  • 改进情况:

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

参考资料

posted on 2017-12-03 21:03  20155225江智宇  阅读(167)  评论(0编辑  收藏  举报