2017-2018-1 20155312 《信息安全系统设计基础》第十一周学习总结
教材学习内容总结
理解虚拟存储器的概念和作用
- 虚拟存储器的概念:虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。
- 虚拟存储器的作用:
- 将主存看做是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动区域。
- 为每个进程提供了一致的地址空间,从而简化了存储器管理。
- 保护每个进程的地址空间不被其他进程破坏。
理解地址翻译的概念
- 地址翻译:把一个虚拟地址转换为物理地址的任务。需要CPU硬件和操作系统之间的紧密合作。地址翻译通过CPU芯片上的存储器管理单元完成。
- 物理寻址:主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址(PA)。依次类推的寻址方式称为物理寻址。
- 虚拟寻址:CPU生成一个虚拟地址(VA)来访问主存,在被传送到存储器之前先转换成适当的物理地址。
理解存储器映射
- 存储器映射:Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容的过程。
- 映射对象:
- Unix文件系统中的普通文件:一个区域可以映射到一个普通磁盘文件的连续部分。
- 匿名文件:匿名文件由内核创建,全是二进制的0。
- 共享对象:
- 一个对象被映射到虚拟存储器的一个区域,要么作为共享对象,要么作为私有对象。
- 共享对象:共享对象对于所有把它映射到自己的虚拟存储器进程来说都是可见的。一个映射到共享对象的虚拟存储器区域叫做共享区域。
- 私有对象:私有对象时使用一种叫写时拷贝的技术被映射到虚拟存储器中的,相应私有区域的页表条目都被标记为只读,并且区域结构被标记为私有的写时拷贝。
- 一个对象被映射到虚拟存储器的一个区域,要么作为共享对象,要么作为私有对象。
- execve函数
- 使用execve函数将a.out程序加载到存储器的过程
Execve("ut",NULL,NULL);
- 具体经过的步骤如下:
- 删除已存在的用户区域。
- 映射私有区域。
- 映射共享区域。
- 设置程序计数器。
- 使用execve函数将a.out程序加载到存储器的过程
- 用户级存储器映射相关函数
- Unix进程可以使用
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offest);
来创建新的虚拟存储器区域,并将对象映射到这些区域当中。函数参数、返回值不在此处赘述。 int munmap(void *start,size_t length);
删除虚拟存储器的区域。
- Unix进程可以使用
掌握动态存储器分配的方法
- 当运行时需要额外虚拟存储器时,使用动态存储器分配器维护一个进程的虚拟存储器区域。
- 分配器有两种风格:
- 显示分配器:要求应用显式地释放任何已经分配的块。
- 隐式分配器:要求分配器检测一个已分配块何时不再被程序所使用,就释放这个块。也叫做垃圾收集器。
- 动态存储器分配的相关函数
- 程序通过调用
void *malloc(size_t size);
来从标准堆中分配块。 - 通过调用
void free(void *ptr);
来释放已分配的块。 - 调用
vid *sbrk(intptr_t incr);
申请额外的堆存储器。
- 程序通过调用
理解垃圾收集的概念
- 垃圾收集器是一种动态存储分配器。自动释放程序已经不再需要的已分配块(垃圾)。垃圾收集器将存储器视为一张有向可达图,图的节点被分配为一组根节点和一组堆节点。当存在一条从任意根节点出发到并到达P的有向路径时,就称节点P是可达的。
- Mark&Sweep垃圾收集器:由标记阶段和清除阶段组成,标记阶段标记出根节点所有可达的和已分配的后继,清除阶段释放每个未被标记的已分配块。
ptr isPtr(ptr p)
:如果p指向一个已分配块中的某个字,那么就返回一个指向这个块起始位置的指针b,否则返回NULL。int blockMarked(ptr b)
:如果已经标记了块b,就返回true。int blockAllocated(ptr b)
:如果块b是已分配的,就返回true。void markBlock(ptr b)
:标记块b。int length(ptr b)
:返回块b的以字为单位的长度(不包括头部)。void unmarkBlock(ptr b)
:将块b的状态由已标记的改为未标记的。- ptr nextBlock(ptr b):返回堆中块b的后继。
了解C语言中与存储器有关的错误
- 间接引用坏指针
- 读未初始化的存储器
- 允许栈缓冲区溢出
- 假设指针和指向他们的对象大小是相同的
- 造成错位错误
- 引用指针,而不是他所指向的对象
- 误解指针运算
- 引用不存在的变量
- 引用空闲堆块中的数据
- 引起存储器泄露
教材学习中的问题和解决过程
- 问题1:使用虚拟寻址的现代系统,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被传送到内存之前下转换成适当的物理地址(如下图所示),此转换过程由CPU芯片上的内存管理单元(MMU)完成,书上描述的过程是“利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理”,这里地址翻译的过程具体是怎样的呢?
- 解决过程:虚拟地址转化为物理地址的过程让我联想到操作系统课程所学的“存储管理”技术。
存储管理的任务有以下几个:
- 存储分配
- 地址映射
- 存储保护
- 存储共享
- 存储扩充
其中地址映射又称地址重定位,指将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,保证CPU执行指令时可正确访问存储单元。
随着对地址映射的深入了解,我发现不同的存储技术对应着不同的地址映射过程,所用到的数据结构也有所不同。
存储技术分为以下两类:
(1)简单存储技术:相对于虚拟存储而言,为了实现简单,执行之前,操作系统必须将待执行的程序全部装入内存。
- 简单存储技术可分为以下四种:
- 分区存储管理
- 简单页式存储管理
- 简单段式存储管理
- 简单段页式存储管理
(2)虚拟存储技术:现代OS大都支持虚拟存储技术,允许进程装入部分程序即可开始执行。
①分区存储管理
这一种基于连续存储管理的简单存储技术,所以在其进行地址映射时不必存放逻辑地址与物理地址的对应表,只需要利用基址寄存器存放当前进程所在分区的物理存储单元的起始地址,并利用加法器对其与逻辑地址进行加法运算,即可计算出物理地址。这里还有个比较器,它通过界限寄存器中存放的当前执行进程所在分区最后一个物理存储单元的地址来限定进程的执行范围,保护其它进程不被非法访问。
地址翻译过程描述如下图所示:
②简单页式存储管理
页式管理的逻辑地址被分为两部分:页号和页内偏移量。
地址映射过程中涉及到一种数据结构叫做页表:系统为每个进程建立一张页表,用于记载进程的各页面到物理内存中页框的映射信息。进程的每个页面依次对应页表中的一个表项,其中包含相应页在内存中对应的物理页框号和页面存取控制权限等字段。
地址映射的具体步骤如下:
- 根据逻辑地址,计算出页号和页内偏移量;
- 用页号检索页表,查找指定页面对应的页框号;
- 根据页框号和页内偏移量,计算出物理地址。
这里涉及到CPU硬件页表寄存器:实现快速地址映射,存储执行进程的页表起始地址。
地址翻译过程描述如下图所示:
③简单段式存储管理
这种管理技术将程序的地址空间划分为若干个相对独立的段,程序加载时,以段为单位,分配其所需的所有段,每个段占据内存连续的分区,这些段不必连续;段式管理是把内存视为二维空间,与进程逻辑相一致。
分段管理的逻辑地址表示:段号和段内偏移量
简单段式管理的基本数据结构段表:每个进程建一个,用于描述进程的分段情况,记载进程各个段到物理内存中分区的映射情况。包含段号、段长、段基址及对本段的存取控制权限等信息。
简单段式存储管理地址映射过程通过段号与段基址相加计算各段物理地址中的起始地址,再与偏移量相加来计算出进程中具体的物理地址。这里涉及到段表寄存器:为实现快速地址变换,用来存放当前执行进程的段表在物理内存中的起始地址。
地址翻译过程描述如下图所示:
④简单段页式存储管理
这种管理技术采用分段方法组织用户程序,采用分页方法分配和管理内存。系统将内存划分成固定大小的页框,并将程序的每一段分页后装入内存执行。
段页式管理的逻辑地址表示:段号、段内地址+页号、页内地址
简单段页式存储管理涉及到段式管理技术和页式管理技术中的两种数据结构:段表、页表
地址翻译过程描述如下图所示:
代码调试中的问题和解决过程
20155312
上周考试错题总结
ch06:
1.下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为(D)
(题目1)
A. 1
B. 1/4
C. 1/2
D. 3/4
- 误选了C,由于直接映射高速缓存中不命中时的行替换,如果缓存不命中,它需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引块指示的组中的一个高速缓存行中,替换策略就是用新取出的行替换当前的行。未填充时而存放x[i]和y[i]的块被映射到了同一个高速缓存组,而填充x后,x[i]和y[i]的块被映射到了不同的高速缓存组,消除了抖动冲突不命中。
2.有关高速缓存的说法正确的是(ACD)
A . 高速缓存的容量可以用C=SEB 来计算
B . 高速缓存容量为2048,高速缓存结构为( 32 ,8,8,32)
C . 直接映射高速缓存要:组选择、行匹配、字抽取
D . 当程序访问大小为2的幂的数组时,直接映射高带缓存中常发生冲突不命中
- 解析:误选了B,少选了D
3.The following table gives the parameters for a number of different caches. For
each cache, determine the number of cache sets (S), tag bits (t), set index bits (s),
and block offset bits (b) (ACD)
(题目3)
A . 第三行S为1
B . 第一行t为24
C . 第二行b为5
D . 第三行s的值为0
- 解析:感觉答案有问题
4.有关缓存的说法,正确的是(AC)
A .
LRU策略指的是替换策略的缓存会选择最后被访问时间距现在最远的块
B .
不同层之间以字节为传送单元来回复制
C .
缓存不命时,决定哪个块是牺牲块由替换策略来控制
D .
空缓存的不命中叫冲突不命中
- 解析:多选了B,错在:不同层之间以块大小为传送单元来回复制
6.下面代码的步长是()
(题目6)
B . N
- 解析:计算步长时,不会因为循环的层数而对步长进行其他运算,此题中是一个三维数组,但是对于一个连续向量,不管是哪个维度都是每隔N个元素进行访问。
11.下面说法正确的是(ABCD)
A . CPU通过内存映射I/O向I/O设备发命令
B . DMA传送不需要CPU的干涉
C . SSD是一种基于闪存或Flash的存储技术
D . 逻辑磁盘块的逻辑块号可以翻译成一个(盘面,磁道,扇区 )三元组。
- 解析:少选了C,SSD是一种基于闪存或Flash的存储技术
14.有关磁盘操作,说法正确的是(AC)
A . 对磁盘扇区的访问时间包括三个部分中,传送时间最小。
B . 磁盘以字节为单位读写数据
C . 磁盘以扇区为单位读写数据
D . 读写头总处于同一柱面
- 解析:少选了D,磁盘操作中读写头总处于同一柱面
17.根据携带信号不同,总线可分为(BDE)
A . 系统总线
B . 数据总线
C . 内存总线
D . 地址总线
E . 控制总线
- 解析:少选了E根据携带信号不同,总线可分为数据总线、地址总线和控制总线
21.有关计算机存储系统,下面说法正确的是(BCD)
A . 程序具有良好的局部性表现在倾向于从存储器层次结构中的较低层次处访问数据,这样节省时间
B . 存储层次涉用不同容量,成本,访问时间的存储设备
C . 存储层次设计基于局部性原理
D . “存储山”是时间局部性和空间局部性的函数
- 解析:少选了D “存储山”是时间局部性和空间局部性的函数
结对及互评
本周结对学习情况
- 20155333
- 结对照片
- 结对学习内容
- 网络编程第11章
- 教材第3章
- ...
其他(感悟、思考等,可选)
上次第九周博客教材中的问题和代码调试的问题解决过程没有截图,而且提的问题比较浅,被老师评论博客写的太糙了,这周有改进。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1500 | 2/9 | 30/90 | |
第五周 | 200/1800 | 2/11 | 20/120 | |
第六周 | 300/2000 | 2/13 | 18/140 | |
第七周 | 500/2300 | 2/14 | 22/158 | |
第八周 | 300/2800 | 1/16 | 30/180 | |
第九周 | 1000/3800 | 2/17 | 20/210 | |
第十周 | 600/4800 | 0/19 | 20/230 | |
第十一周 | 800/5400 | 2/19 | 20/250 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:20小时
-
实际学习时间:17小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)