2017-2018-1 20155216 《信息安全系统设计基础》第十一周学习总结
教材学习内容总结
一、虚拟存储器的概念和作用
为解决内存小而作业大、作业多的矛盾, 以及执行过程中只是把当前运行需要的那部分程序和数据装入内存。 所以,操作系统把各级存储器统一管理起来。就是说, 应该把一个程序当前正在使用的部分放在内存, 而其余部分放在磁盘上,启动执行它。操作系统根据程序执行时的要求和内存的实际使用情况, 随机地对每个程序进行换入/换出。
这样, 就给用户提供一个比正式的内存空间大的多的地址空间, 这就是虚拟存储器。所谓虚拟存储器是用户能作为可编址内存对待的存储空间, 在这种计算机系统中虚地址被映射成实地址。简单地说,虚拟存储器:是由操作系统提供的一个假想的特大存储器。就是说, 虚拟存储器并不是实际的内存,它的大小比内存空间大的多; 用户感觉所能使用的“内存”非常大, 但这是操作系统对物理内存的扩充。
虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。
三个重要功能:
1、它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。
2、它为每个进程提供了一致的地址空间,从而简化了内存管理。
3、它保护了每个进程的地址空间不被其他进程破坏。
二、地址翻译的概念
地址翻译是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)中的元素之间的映射。
地址翻译符号:
MMU利用页表来实现映射
举例:Core i7地址翻译
三、存储器的映射
Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程为内存映射。
Linux中文件系统中的普通文件:一个区域可以映射到一个普通磁盘文件的连续部分。
匿名文件:一个区域可以映射到一个匿名文件,匿名文件是由内核创建的,包含的全是二进制零。
共享对象:
一个共享对象:
一个私有的写时复制对象:
fork()函数:
当fork函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的PID。
当fork在新进程中返回时,新进程现在的虚拟内存刚好和调用fork是存在的虚拟内存相同。
execve函数:
格式:execve("a.out", NULL, NULL);
execve函数在当前进程中加载并运行包含在可执行目标文件a.out中的程序。
使用mmap函数的用户级内存映射
参数的可视化解释:
四、动态存储器分配的方法
动态内存分配的两种基本风格:
函数使用:
通过调用malloc函数从堆中分配块:
include <stdlib.h>
void *malloc(size_t size);
使用sbrk函数显示地分配和释放堆内存:
#include <unistd.h>
void *sbrk(intptr_t incr);
调用free函数释放已分配的内存:
#include <stdlib.h>
void free(void *ptr);
分配器的要求和目标:
五、垃圾收集概念
应用通过调用malloc和free来分配和释放堆块。应用要负责释放所有不再需要的已分配块。
收集过程:
Mark和Sweep垃圾收集器
六、C语言中与存储器有关的错误
1、间接引用坏指针
2、读未初始化的内存
3、允许栈缓冲区溢出
4、假设指针和它们指向的对象是相同大小的
5、造成错位错误
6、引用指针,而不是它所指向的对象
7、误解指数运算
8、引用不存在的变量
9、引用空闲堆块中的数据
10、引起内存泄漏
教材学习中的问题和解决过程
- 问题1:
对于内存泄漏不够理解
- 问题1解决方案:
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。
内存泄漏分为四类:
常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。
偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
一次性内存泄漏:发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。
隐式内存泄漏:程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。
代码调试中的问题和解决过程
- 问题1:
实验四中的加载和卸载模块无法被执行
- 问题1解决方案:
使用另一版本的虚拟机,以保证内核路径和版本的正确性。
代码托管
结对及互评
本周结对学习情况
- [20155214](http://www.cnblogs.com/besti155214/p/7782336.html)
- 结对照片
- 结对学习内容
其他(感悟、思考等,可选)
1、虚拟内存的利用解决了诸多计算机作业相关的矛盾,极大地提高了计算机的运行效率。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第三周 | 114/114 | 3/3 | 20/20 | |
第四周 | 136/250 | 2/5 | 18/38 | |
第五周 | 87/337 | 2/7 | 22/60 | |
第六周 | 271/608 | 2/9 | 30/90 | |
第七周 | 185/716 | 2/11 | 30/90 | |
第八周 | 531/1247 | 3/14 | 30/90 | |
第九周 | 439/1686 | 3/17 | 30/90 | |
第十一周 | 153/1839 | 2/19 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
- 计划学习时间:25小时
- 实际学习时间:20小时
- 改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)