标签:结合 ptr 体系 收集 alt 拷贝 收集器 间接引用 翻译
2、虚拟寻址 CPU生成一个虚拟地址(VA)来访问主存,在被传送到存储器之前先转换成适当的物理地址。
地址翻译通过CPU芯片上的存储器管理单元完成。
未分配的:VM系统还没分配、创建的页,不占用任何磁盘空间。
缓存的:当前缓存在物理存储器中的已分配页。
未缓存的:没有缓存在物理存储器中的已分配页。
2、页表 一个数据结构,存放在物理存储器中,将虚拟页映射到物理页。 (1)页表就是一个页表条目PTE的数组。 PTE:由一个有效位和一个n位地址字段组成的,表明了该虚拟页是否被缓存在DRAM中。
PTE的三个许可位:
SUP:表示进程是否必须运行在内核模式下才能访问该页
READ:读权限
WRITE:写权限
(2)页表的组成:有效位+n位地址字段 设置了有效位:地址字段表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页。 没有设置有效位: 空地址:表示该虚拟页未被分配 不是空地址:这个地址指向该虚拟页在磁盘上的起始位置。 3、缺页 指DRAM缓存不命中。 缺页异常:会调用内核中的缺页异常处理程序,选择一个牺牲页。 页面调度(交换):磁盘和存储器之间传送页的活动。 按需页面调度:直到发生不命中时才换入页面的策略,所有现代系统都使用这个。 4、虚拟存储器中的局部性 局部性原则:保证了在任意时刻,程序将往往在一个较小的活动页面集合上工作,这个集合叫做工作集/常驻集。 颠簸:工作集大小超出了物理存储器的大小。 只要程序有良好的时间局部性,虚拟存储器系统就能工作的相当好。
一个N元素的虚拟地址空间VAS中的元素和一个M元素的物理地址空间PAS中元素之间的映射。
MAP: VAS → PAS ∪ ?
MAP = A‘ ,如果虚拟地址A处的数据在PAS的物理地址A‘处
MAP = ? ,如果虚拟地址A处的数据不在物理存储器中
用页表实现映射
处理器生成虚拟地址,传给MMU
MMU生成PTE地址,并从高速缓存/主存请求得到他
高速缓存/主存向MMU返回PTE
MMU构造物理地址,并把它传给高速缓存/主存
高速缓存/主存返回所请求的数据给处理器。
处理器生成虚拟地址,传给MMU
MMU生成PTE地址,并从高速缓存/主存请求得到他
高速缓存/主存向MMU返回PTE
PTE中有效位为0,触发缺页异常
确定牺牲页
调入新页面,更新PTE
返回原来的进程,再次执行导致缺页的指令,会命中
2、结合高速缓存和虚拟存储器 在既使用SRAM高速缓存又使用虚拟存储器的系统中,大多数系统选择物理寻址。 两者结合的主要思路是地址翻译发生在高速缓存之前。 页表目录可以缓存,就像其他的数据字一样。 3、利用TLB加速地址翻译 TLB:翻译后备缓冲器,是一个小的、虚拟存储的缓存,其中每一行都保存着一个由单个PTE组成的块。 步骤:
CPU产生一个虚拟地址
MMU从TLB中取出相应的PTE
MMU将这个虚拟地址翻译成一个物理地址,并且将它发送到高速缓存/主存
高速缓存/主存将所请求的数据字返回给CPU
4、多级页表 采用层次结构,用来压缩页表。 好处:
R/W位:确定内容是读写还是只读
U/S位:确定是否能在用户模式访问该页
XD位:禁止执行位,64位系统中引入,可以用来禁止从某些存储器页取指令
1、linux为每个进程维持了一个单独的虚拟地址空间,其中,内核虚拟存储器位于用户栈之上。 内核虚拟存储器包含内核中的代码和数据结构,还有一些被映射到一组连续的物理页面(主要是便捷地访问特定位置,比如执行I/O操作的时候需要的位置)。 2、linux将虚拟存储器组织成一些区域(也叫做段)的集合。 允许虚拟地址空间有间隙;内核不用记录那些不存在的页,这样的页也不用占用存储器。 区域结构:
vm _start:指向这个区域的起始处;
vm _end:指向这个区域的结束处;
vm _prot:描述这个区域内所包含的所有页的读写许可权限;
vm _fags:描述这个区域内的页面是与其他进程共享的,还是这个进程私有的,等等;
vm _next:指向链表的下一个结构.
Unix文件系统中的普通文件
匿名文件(全都是二进制0)
1、共享对象
对于所有把它映射到自己的虚拟存储器进程来说都是可见的。即使映射到多个共享区域,物理存储器中也只需要存放共享对象的一个拷贝。
2、私有对象
运用写时拷贝的技术,在物理存储器中只保存有私有对象的一份拷贝。
3、fork函数:应用了写时拷贝技术。为每个进程保持了私有地址空间的抽象概念。
4、execve函数:将程序加载到存储器。
Execve("a.out",NULL,NULL);
步骤:
删除已存在的用户区域。
映射私有区域。
映射共享区域。
设置程序计数器。
5、map函数: (1)创建新的虚拟存储器区域。
#include <unistd.h>
#include <sys/mman.h>
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
//成功返回指向映射区域的指针,若出错则为-1
(2)删除虚拟存储器
#include <sys/mman.h>、
int munmap(void *start, size_t length);
//成功返回0,失败返回-1
从start开始删除,由接下来length字节组成的区域。
显示分配器-malloc和free
隐式分配器/垃圾收集器
1、malloc函数:从堆中分配块。
#include <stdlib.h>
void *malloc(size_t size);
//成功返回指针,指向大小至少为size字节的存储器块,失败返回NULL
2、free函数:释放已分配的堆块。
#include <stdlib.h>
void free(void *ptr);
//无返回值,ptr参数必须指向一个从malloc、calloc或者reallov获得的已分配块的起始位置。
3、分配器的要求和目标 要求:
处理任意请求序列
立即响应请求
只使用堆
对齐块
不修改已分配的块
目标:
最大化吞吐率
最大化存储器利用率——峰值利用率最大化
4、碎片:虽然有未使用的存储器,但是不能用来满足分配请求。
#include <unistd.h>
vid *sbrk(intptr_t incr);
//成功则返回旧的brk指针,出错为-1
通过将内核的brk指针增加incr来扩展和收缩堆。 8、合并空闲块 合并是针对于假碎片问题的,任何实际的分配器都必须合并相邻的空闲块。 策略:
立即合并
推迟合并
垃圾收集器是一种动态存储分配器,自动释放程序已经不再需要的已分配块(垃圾)。 垃圾收集器将存储器视为一张有向可达图,图的节点被分配为一组根节点和一组堆节点。 1、Mark&Sweep垃圾收集器 由标记阶段和清除阶段组成,标记阶段标记出根节点所有可达的和已分配的后继,清除阶段释放每个未被标记的已分配块。
本周学习的主要内容是存储器,从本章中,我巩固了之前在其他课中学习的一些知识,如:虚拟地址、寻址方式、缺页置换等,也学习了一些新的知识,如:LINUX 虚拟存储器系统、动态存储器分配、垃圾收集等,将不同课程的知识结合起来,融会贯通,有利于我们构建完整的知识体系、将知识活学活用,而不是单纯的背、记,只是为了应付考试。
- [20155311](博客链接)
- 结对照片
- 结对学习内容
-存储器技术,缓存,局部性
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 10/ 10 | 1/1 | 10/10 | |
第三周 | 158/ 168 | 1/2 | 17/27 | |
第五周 | 145/ 313 | 3/ 5 | 21/48 | |
第六周 | 209/ 522 | 1/ 6 | 20/68 | |
第七周 | 200/ 722 | 2/ 8 | 20/88 | |
第九周 | 55/ 777 | 2/ 10 | 19/107 | |
第十一周 | 11/ 788 | 2/ 12 | 18/125 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。 耗时估计的公式 :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:20小时
实际学习时间:19小时
改进情况:开始进入学习状态,但因为别的课程作业也很多,所以安排不够好,可能学习不够认真
(有空多看看现代软件工程 课件 软件工程师能力自我评价表)
2017-2018-1 20155305 《信息安全系统设计基础》第11周学习总结
标签:结合 ptr 体系 收集 alt 拷贝 收集器 间接引用 翻译
原文地址:http://www.cnblogs.com/20155305ql/p/7922955.html