2017-2018-1 20155225 《信息安全系统设计基础》第十一周学习总结
教材学习内容总结
- 理解虚拟存储器的概念和作用
虚拟内存作为缓存的工具
虚拟内存作为内存管理的工具
虚拟内存作为内存保护的工具
- 理解地址翻译的概念
现代处理器使用虚拟寻址,通过一个虚拟地址(VA)来访问主存,将虚拟地址转换为物理地址的任务叫做地址翻译。CPU芯片上的内存管理单元(MMU)硬件,利用存放在主存中的查询表来动态翻译虚拟地址,这个查询表由操作系统管理。
-
理解存储器映射
Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射。虚拟内存区域可以映射到两种类型的对象中的一种:
- Linux文件系统中的普通文件
- 匿名文件
一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件之间换来换去。在任何时刻,交换空间都限制着当前运行着的进程能够分配的虚拟页面的总数。
一个对象被映射到虚拟内存的一个区域,要么作为共享对象,要么作为私有对象。
- 掌握动态存储器分配的方法
动态内存分配器维护着一个进程的虚拟内存区域,称为堆。分配器将堆视为一组不同大小的块的集合来维护,每个块就是一个连续的虚拟内存片,要么是已分配的(显式地保留为供应用程序使用,释放可以显式/隐式执行),要么是空闲的(保持空闲直到被分配)。
显式分配器:
malloc返回一个指针,指向大小为至少size字节的内存块。不初始化它返回的内存
calloc将分配内存初始化为0。
realloc改变已分配块的大小。
free释放已分配的堆块。
分配器的实现:
分配器组织堆的数据结构是隐式空闲链表。放置、分割、合并。
更好的,将空闲块组织为某种形式的显示数据结构。比如双向空闲链表。或者采用分离存储,维护多个空闲链表。
- 理解垃圾收集的概念
垃圾收集器是一种动态内存分配器,它自动释放程序不再需要的已分配块。定期识别垃圾块,并相应地调用free,将这些块放回到空闲链表中。
垃圾收集器将内存是为一张有向可达图,不可达节点对应于垃圾。
- 了解C语言中与存储器有关的错误
- 间接引用坏指针
- 读未初始化的内存
- 允许栈缓冲区溢出
- 假设指针和它们指向的对象是相同大小的
- 造成错位错误
- 引用指针,而不是它所指向的对象
- 误解指针运算
- 引用不存在的变量
- 引用空闲堆块中的数据
- 引起内存泄露
教材学习中的问题和解决过程
- 问题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);
}
代码托管
(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小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)