虚拟内存一

虚拟内存一

一、什么是虚拟内存

​ 虚拟内存是对主存的抽象概念。它将主存看做是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要再主存和磁盘之间传输数据。

有了虚拟内存,进程不必将所有数据都装入主存,只需要将一部分活动的块装入内存即可。这加大了系统的并发度、

任何时候都在内存中的部分称为进程的常驻集。

​ 根据局部性原理,在任何一段很短的时间里,执行可能会限制在很小的一段程序中,仅可能访问少数数据数组。因此,虚拟内存将进程的一部分装入主存的做法是可行的。当cpu需要的数据不在主存中,会触发缺页中断,中断处理程序会将所需的页读入主存。

二、虚拟内存的实现

1.分页

​ 分页是虚拟内存实现的前提。磁盘上的虚拟地址空间同样被分成一系列和页框大小相同的页,进程在执行时将一部分页缓存到主存中。

​ 每个进程同样维护一个页表,页表项上需要有一位来表示它对应的页是否被装入主存。还需要一个控制位是修改位,来表示相应页的内容从上次装入内存到现在是否被修改。若被修改,则该页换出时需要将数据写回磁盘中。

地址转换

​ 虚拟地址的页号用于检索页表,查询相应页框号,并与虚拟地址的偏移量结合起来形成物理地址

​ ![屏幕截图 2023-12-13 144934](/../../images/屏幕截图 2023-12-13 144934.png)

转换检测缓冲区

​ 由于每次地址转换都会发生两次主存访问,一次读,一次取。所以大多虚存方案为页表提供了一个特殊的高速缓存,称为转换检测缓冲区(TLB)。给定一个虚拟地址,cpu先检查TLB,若所需的页表项在TLB中(TLB命中),则检索页框号并形成物理地址。否则访问主存,并将相应页表项载入TLB中。

​ ![屏幕截图 2023-12-13 145504](/../../images/屏幕截图 2023-12-13 145504.png)

多级页表

​ 由于每个进程都有一个页表,所以页表可能会很大,所以大多虚存系统在虚存中保存页表。一个进程在运行时,它的页表至少有一部分在主存中。为了减少从磁盘中读页表锁耗费的时间,通常组织多级页表,即在页表上组织页目录,每个页目录指向一个页表(可以理解为页表的稀疏索引)。

​ 这样一来可以将比较小的页目录装入主存中,来减少读磁盘的次数。

​ ![屏幕截图 2023-12-13 150105](/../../images/屏幕截图 2023-12-13 150105.png)

倒排页表

​ 上述页表的缺陷是,页表大小与虚拟地址空间大小成正比。倒排页表,顾名思义,它与常规页表相反,存储的是有关每个物理页框的信息,所以倒排页表项与物理内存页框有一一对应关系,它所包含的表项数量较少。

​ 在这种方法中,虚拟地址的页号部分使用一个简单的散列函数映射到散列表中。散列表包含一个指向倒排表的指针,而倒排表中含有页表项.通过这个结构,散列表和倒排表中各有一项对应于一个实存页.因此,不论有多少个进程、支持多少虚拟页,页表的大小都是固定的。

​ 地址转换时,虚拟地址的页号散列到倒排页表的页框号。然后通过配合进程位来确定这个页框中存的页是否是该进程的数据。通过链地址法来消除冲突。

​ ![屏幕截图 2023-12-13 152131](/../../images/屏幕截图 2023-12-13 152131.png)

二、分段

​ 分段允许程序员把内存视为由多个地址空间或段组成,段大小不等,内存访问以短号和偏移量构成

1.地址转换

​ ![屏幕截图 2023-12-13 152424](/../../images/屏幕截图 2023-12-13 152424.png)

2.优点

​ 1.简化了对不断增长的数据结构的处理

​ 2.允许程序独立地改变或重新编译,而不要求整个程序集重新链接或加载

​ 3.有助于进程间的共享

​ 4.有助于保护

三、段页式

​ 段页式系统中,用户地址空间被程序员划分成多个段,每段依次划分为多个页,页长度等于页框大小。使用一个寄存器记录该进程段表的起始地址。对于每个虚拟地址,处理器用段号部分来检索进程段表以寻找该段的页表。

​ ![屏幕截图 2023-12-13 152827](/../../images/屏幕截图 2023-12-13 152827.png)