`
kmplayer
  • 浏览: 498511 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

虚拟存储器

阅读更多
1,虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核文件的完美交互.
提供了三个重要的能力:
(1)将主存看作一个存储在磁盘上的地址空间的高速缓冲,在主存中只保存活动区域,根据需要在主存和磁盘之间来回传送数据.
(2)它为每个进程提供了一致的地址空间,简化了存储器管理.
(3)保护每个进程的地址空间不会被其他进程破坏.

2,一个简单的虚拟寻址系统:

MMU(memory management unit):利用存放在主存中的查询表(页表)动态翻译虚拟地址.

3,虚拟页面分为三个不想交的子集:
(1)未分配的.
(2)缓冲的.
(3)未缓冲的(没有缓冲在主存中的已分配页).

4,DRAM比SRAM慢大约10倍,而磁盘比DRAM慢大约10万多倍,而且从磁盘的第一个扇区读取第一字节的时间比读这个扇区后面的自己要慢大约10万倍.
由于不命中的巨大出发,虚拟页趋向于很大,典型的是4~8KB.

5,一个页表的简单样式:

注:磁盘和存储器之间传送页的活动叫做交换或页面调度.

6,实际中,不命中的概率不大,归功于"局部性".
如果工作集的大小超出了物理存储器的大小,会出现一种不幸的状态"颠簸(thrashing)",页面不断地换进换出.

7,实际中:操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间.
带来的好处:
(1)简化链接:
每个Linux进程都使用下图格式.

文本区总是从0x08048000处开始,栈总是从地址0xbfffffff向下伸展,共享库代码总是从地址0x40000000处开始,操作系统的代码总是从0xcfffffff开始.
这样的一致性简化了链接器的设计和实现.

(2)简化共享:
操作系统可以将不同进程中适当的虚拟页面映射到相同的物理页面,从而实现多个进程共享同一个拷贝.

(3)简化存储器分配:
如果操作系统分配一个适当连续的虚拟存储器页面,可以将它们映射到物理存储器中任意位置的K个任意的物理页面.

(4)简化加载:
加载器从不真正从磁盘拷贝任何数据到存储器中,当每个页面第一次被引用时,虚拟存储器将自动把数据从磁盘调入到存储器.

8,存储器映射:映射一个连续虚拟页面的集合到任意一个文件中的任意一个位置的概念叫做存储器映射.
Unix提供了一个系统调用:mmap.

9,关于地址翻译:
CPU有个控制寄存器:页表基址寄存器(PTBR),指向当前页表.
CPU硬件执行的步骤:
(1)处理器生成一个虚拟地址,送给MMU.
(2)MMU生成PTE(页表表项)地址,并从高速缓冲/主存得到它.
(3)高速缓冲/主存向MMU返回PTE.
(4)MMU构造物理地址,并把它传送给高速缓冲/主存.

页面命中的情况:

页面不命中的情况:

10,结合高速缓冲和虚拟存储器:

11,每个CPU产生一个虚拟地址,MMU就必须查阅一个PTE,可以在MMU中包括一个关于PTE的小的缓冲,称为TLB(翻译后备缓冲器).
TLB的组成同高速缓冲:分组,标记位,块索引.

TLB命中的情况:

TLB不命中的情况:

12,多级页表:
假设一个PTE占用4字节的大小,对于32位的地址空间,需要一个4MB的页表驻留在存储器中.
对于64位的系统,问题将变得复杂.

例如一个二级页表:
一级页表中的每个PTE负责映射虚拟地址空间中一个4MB的组块,每个组块都是由1024个连续的页面组成.
如下图所示:

这种方法可以从两个方面减少对存储器的要求:
(1)如果第一级页表的一个PTE是空的,那么相应的二级页表根本不会存在,这个一种巨大的潜在节约.
(2)只有第一级页表总是在主存中,而最常使用的二级页表才会需要缓冲在主存中.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics