20155331 2017-2018 1 《信息安全系统设计基础》第11周学习总结

20155331 2017-2018 1 《信息安全系统设计基础》第11周学习总结

教材学习内容总结

虚拟存储器

一、作为缓存的工具

二、作为存储器管理的工具

三、作为存储器保护的工具

计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每宇节都有一个唯一的物理地址 。第一个字节的地址为 0,接下来的字节地址为 1,再下一个为 2, CPU 访问存储器的最自然的方式就是使用物理地址。我们把这种方式称为物理寻址 。

早期的 PC 使用物理寻址,现代处理器使用的是一种称为虚拟寻址的寻址形式。

1.虚拟存储器的作用:

它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存

它为每个进程提供了一致的地址空间,从而简化了存储器管理

它保护了每个进程的地址空间不被其他进程破坏

(1)物理寻址

•主存被组织成一个由M个连续的字节大小的单元组成的数组,依次类推的寻址方式称为物理寻址。

(2)虚拟寻址

•CPU生成一个虚拟地址来访问主存,在被传送到存储器之前先转换成适当的物理地址。地址翻译通过CPU芯片上的存储器管理单元完成。

2.地址空间

地址空间是一个非负整数地址的有序集合:{0,1,2,……}

(1)线性地址空间

地址空间中的整数是连续的。
(2)虚拟地址空间

•CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间。

(3)物理地址空间

•与系统中的物理存储器的M个字节相对应。

(4)地址空间的大小

虚拟存储器——虚拟页VP,每个虚拟页大小为P=2^平字节

物理存储器——物理页PP,也叫页帧,大小也为P字节。

•任意时刻,虚拟页面的集合都被分为三个不相交的子集:

•未分配的:VM系统还没分配/创建的页,不占用任何磁盘空间。

•缓存的:当前缓存在物理存储器中的已分配页

•未缓存的:没有缓存在物理存储器中的已分配页

DRAM 缓存的组织结构

SRAM 缓存位于 CPU 和主存之间的 Ll、 L2 和 L3 高速缓存。

DRAM 缓存来表示虚拟存储器系统的缓存,它在主存中缓存虚拟页。

在存储层次结构中, DRAM 缓存的位置对它的组织结构有很大的影响。

DRAM 缓存中的不命中比起 SRAM 缓存中的不命中要昂贵得多,因为 DRAM 缓存不命中要由磁盘来服务,而 SRAM 缓存不命中通常是由基于 DRAM 的主存来服务的。

DRAM 缓存的组织结构完全是由巨大的不命中开销驱动的。

页表

页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组。

•页表就是一个页表条目PTE的数组。

PTE:由一个有效位和一个n位地址字段组成的,表明了该虚拟页是否被缓存在DRAM中。

•页表的组成:有效位+n位地址字段

•如果设置了有效位:地址字段表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页。

•如果没有设置有效位: •空地址:表示该虚拟页未被分配

•不是空地址:这个地址指向该虚拟页在磁盘上的起始位置。

缺页

•缺页:就是指DRAM缓存不命中。

•缺页异常:会调用内核中的缺页异常处理程序,选择一个牺牲页。

•页:虚拟存储器的习惯说法,就是块

•交换=页面调度:磁盘和存储器之间传送页的活动

•按需页面调度:直到发生不命中时才换入页面的策略,所有现代系统都使用这个。

地址翻译

当页面命中时,CPU硬件执行步骤

•处理器生成虚拟地址,传给MMU

•MMU生成PTE地址,并从高速缓存/主存请求得到他

•高速缓存/主存向MMU返回PTE

•MMU构造物理地址,并把它传给高速缓存/主存

•高速缓存/主存返回所请求的数据给处理器。

处理缺页时,CPU硬件执行步骤

•处理器生成虚拟地址,传给MMU

•MMU生成PTE地址,并从高速缓存/主存请求得到他

•高速缓存/主存向MMU返回PTE

•PTE中有效位为0,触发缺页异常

•确定牺牲页

•调入新页面,更新PTE

•返回原来的进程,再次执行导致缺页的指令,会命中

多级页表

用来压缩页表的常用方法是使用层次结构的页表。

一个两级页表层次结构。 注意地址是从上往下增加的

这种方法从两个方面减少了存储器要求。

1.如果一级页表中的一个 PTE 是空的,那么相应的二级页表就根本不会存在,这代表着一种巨大的潜在节约,因为对于一个典型的程序, 4GB 的虚拟地址空间的大部分都将是未分配的。

2.只有一级页表才需要总是在主存中:虚拟存储器系统可以在需要时创建、页面调入或调出二级页表,这就减少了主存的压力:只有最经常使用的二级页表才需要缓存在主存中。

带多级页表的地址翻译并不比单级页表慢很多。

Linux 虚拟存储器系统

一个虚拟存储器系统要求硬件和内核软件之间的紧密协作。

内核虚拟存储器包含内核中的代码和数据结构。内核虚拟存储器的某些区域被映射到所有进程共享的物理页面。

内核虚拟存储器的其他区域包含每个进程都不相同的数据。

fork 函数

当 fork 函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的 PID。为了给这个新进程创建虚拟存储器,它创建了当前进程的 mm_struct、区域结构和页表的原样拷贝。它将两个进程中的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时拷贝。

当 fork 在新进程中返回时,新进程现在的虚拟存储器刚好和调用 fork时存在的虚拟存储器相同。当这两个进程中的任一个后来进行写操作时,写时拷贝机制就会创建新页面,因此,也就为每个进程保持了私有地址空间的抽象概念。

execve 函数

execve 函数在当前进程中加载并运行包含在可执行目标文件 a.out 中的程序,用 a.out 程序有效地替代了当前程序。加载并运行 a.out 需要以下几个步骤:

•删除已存在的用户区域。

•映射私有区域。

•映射共享区域。

•设置程序计数器 (PC)。

动态存储器分配

分配器将堆视为一组不同大小的块的 集合来维护。每个块就是一个连续的虚拟存储器片,要么是已分配的,要么是空闲的。己分配的 块显式地保留为供应用程序使用。空闲块可用来分配。空闲块保持空闲,直到它显式地被应用所分配。一个已分配的块保持已分配状态,直到它被释放,这种释放要么是应用程序显式执行的,要么是存储器分配器自身隐式执行的。

垃圾收集

应用通过调用 malloc 和 free 来分配和释放堆块。应用要负责释放所有不再需要的已分配块。

垃圾收集器 是一种动态存储分配器,它自动释放程序不再需要的己分配 块。这些块称为垃圾 。

自动回收堆存储的过程叫做垃圾收集。在一个支持垃圾收集的系统中,应用显式分配堆块,但是从不显示地释放它们。在 C 程序的上下文中,应用调用 malloc,但是从不调用 free。反之,垃圾收集器定期识别垃圾块,并相应地调用 free,将这些块放回到空闲链表中。

Mark&Sweep 垃圾收集器

•Mark&Sweep垃圾收集器由标记阶段和清除阶段组成,标记阶段标记出根节点所有可达的和已分配的后继,清除阶段释放每个未被标记的已分配块。

•在对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的后继。

教材学习中的问题和解决过程

问题:虚拟存储器有哪些特征?其中最本质的特征是什么?

答案:操作系统四个特征:并发,共享,虚拟和异步。其中最主要的特征是并发。 虚拟存储器特征:1)离散性2)多次性3)对换性 4)虚拟性其中最本质的特征是离散性

上周错题总结

下面说法正确的是(ACEF)

A .
Linux内核使用的file table 所有的进程共享的。

B .
不同进程打开同一个文件的文件描述符必须一样。

C .
使用dup2 把标准输入重定向到描述符7 dup2(7,0)

D .
使用dup2 把标准输入重定向到描述符7 dup2(0,7)

E .
ls > foo.txt 是输出重定向

F .
类型为FILE的流是对文件描述符和流缓冲区的抽象。

Unix/Linux中,对于代码fd=open("foo",O_WRONLY,0766),umask=022,下面说法正确的是(AC)

A .
进程对foo是只写的

B .
同组成员能写foo

C .
使用者可以执行foo

D .
任何人都可以写foo

下面代码的输出是(D)

Image 6.png

A .
fd2 = 0

B .
fd2 = 1

C .
fd2 = 2

D .
fd2 = 3

E .
fd2 = 4

F .
不确定

关于open(2),下面说法正确的是(AC )

A .
flag 参数中O_RDONLY,O_WRONLY,O_RDWR至少要有一个

B .
O_RDONLY|O_WRONLY == O_RDWR

C .
fd=open("foo.txt",O_WRONLY|O_APPEND,0),调用write(fd,buff,n)写入foo.txt的数据不会破坏已有数据。

D .
fd=open("foo.txt",O_WRONLY|O_APPEND,0644),必将导致其他人不能写foo.txt

其他(感悟、思考等,可选)

posted @ 2017-12-03 18:15  20155331  阅读(200)  评论(0编辑  收藏  举报