虚拟内存的工作原理
虚拟内存由硬件和操作系统自动调度和管理,以规划和管理存储信息。
其工作过程包括6个步骤:①中央处理器访问主存的逻辑地址被分解为组号a和组内地址b,组号a转化为地址,即逻辑组数字。
以a为索引,检查地址转换表,以确定该信息集是否存储在主存中。
②若组号已在主存中,则执行④;如果组号不在主存中,请检查主存中是否有空闲区域。
否则,转移暂时未使用的组。
辅助存储器将这组信息传输到主存储器。
③从辅助存储器中读取所需的组并将其发送到主存空闲区域,然后将空闲的物理组号a和逻辑组号a记录在地址转换表中。
④读取地址转换表中逻辑组号a对应的物理组号a。
⑤根据物理组号a和组内的字节地址b得到物理地址。
⑥根据物理地址从主存中存取必要的信息。
调度方式有分页、分段、分段页三种。
分页将逻辑和物理地址空间划分为固定大小的页面。
主存储器按页顺序编号,每个独立寻址的程序空间都有自己的页号顺序。
通过在辅助存储器中调度程序的每个页面,可以将其离散地加载到主存储器中的不同页面位置。
根据对应的查找表一一计算。
页调度的优点是页分数小、页表对程序员透明、地址变化快、传输操作简单;缺点是每个页面不是程序的独立模块,不方便保护程序和数据。
段调度根据程序的逻辑结构来划分地址空间。
该段的长度是任意的并且可以扩展。
其优点是消除了内存碎片,易于实现存储保护,便于动态堆组装。
程序;其缺点是传输操作复杂。
这两种方法的结合形成了分段寻呼调度。
在段分页规划中,物理空间被划分为页,程序被划分为模块,每个段被划分为与物理空间中的页一样小的页。
段到页规划结合了段和页规划的优点。
缺点是硬件成本增加,软件更加复杂。
大多数大型通用计算系统都使用段分页调度。
虚拟内存是什么意思虚拟内存原理与工作方式
虚拟内存虽然基址寄存器和索引寄存器用于创建地址空间的抽象,但还有另一个问题需要解决:臃肿软件管理。尽管内存的大小正在迅速增长,但软件的大小增长速度甚至比内存还要快。
20世纪80年代,许多大学使用一台4MBVAX计算机来运行分时操作系统,供十几个用户同时运行。
微软现在推荐的64位Windows8系统至少需要2GB内存,而许多多媒体趋势进一步推动了内存需求。
这样发展的结果是,需要执行的程序往往太大而无法装进内存,系统必须能够支持许多程序同时运行,即使内存能够满足它们的需要单个程序,一般来说,内存还是不能满足需要的。
Swap技术并不是一个非常有效的解决方案Swap在一些中小型应用中还是可以使用的,如果应用非常大,每次都要交换几GB的内存吗?这显然是不方便的。
典型的SATA驱动器的最大传输速度为每秒数百兆字节,这意味着切换或交换1GB程序需要几秒钟的时间。
SATA(SerialATA)硬盘,也称为串行硬盘,是PC硬盘的下一个趋势,已经从本质上取代了传统的PATA硬盘。
那么有没有有效的方法来治疗呢?是的,这意味着使用虚拟内存(virtualmemory)虚拟内存的基本思想是每个程序都有自己的地址空间,而这个地址空间被划分为多个称为页的块。
每个页面都是一个连续的地址范围。
这些页面放置在物理内存中,但并非所有页面都需要位于内存中才能运行程序。
当程序引用物理内存中的部分地址空间时,硬件立即执行必要的映射。
当程序引用不在物理内存中的地址空间的一部分时,操作系统有责任将丢失的部分加载到物理内存中并重新执行失败的指令。
从某种意义上说,虚拟地址是基址寄存器和变址寄存器的镜像。
8088有单独的基址寄存器(但没有索引寄存器)用于放置文本和数据。
通过使用虚拟内存,可以将整个地址空间以较小的单元放置在物理内存中,而不是简单地移动文本和数据区域。
下面我们来考虑一下虚拟内存是如何实现的。
虚拟内存非常适合在多道程序设计系统中使用。
许多程序的片段同时存储在内存中。
分页大多数使用虚拟内存的系统都使用分页技术。
在每台计算机中,程序都会引用一组内存地址。
当程序执行MOVREG,1000指令时,它将内存位置1000的复制到REG(反之亦然,具体取决于计算机)。
地址可以通过索引、基址寄存器、段寄存器或其他方式生成。
这些程序创建的地址称为虚拟地址(virtualaddress),形成虚拟地址空间(virtualaddressspace),在没有虚拟内存的计算机中,系统发送直接将虚拟地址放在内存行上,并且所有读写操作都使用相同的物理地址。
使用虚拟内存时,虚拟地址不会直接发送到内存总线。
相反,内存管理单元MMU(MemoryManagementUnit)用于将虚拟地址映射到物理内存地址,如下所示。
映射关系。
每个页面以4096的倍数开始,以4095结束,所以4K到8K实际上是4096-8191,8K-12K是8192-12287。
在这个例子中,我们可以拥有一台具有16位地址-64K-1的计算机,这些是虚拟地址。
然而,物理地址只有32KB。
因此,虽然可以编写64KB的程序,但无法将整个程序转移到内存中执行。
磁盘上必须有最大64KB的基本程序映像的完整副本,以确保程序片段传输到磁盘。
需要时记忆。
页面如何映射虚拟地址空间由固定大小的单元组成。
相反,物理内存也有固定大小的物理单元,称为页框。
页面和页框的大小相同。
在上面的示例中,页面大小为4KB,但在实际使用中,页面大小可以从512字节到1G字节不等。
对应64KB的虚拟地址空间和32KB的物理内存,有16个虚拟页和8个页框可用。
RAM和磁盘之间的交换始终以整页为单位完成。
例如,当程序尝试访问该地址时,执行以下MOVREG,0指令会将虚拟地址0发送到MMU。
MMU看到虚拟地址落在第0页(0-4095),根据它的映射结果,这个页对应页框2(8192-12287),所以MMU将地址转换为8192,并将地址8192发送到总线。
内存对MMU一无所知,它只是看到地址8192的读或写请求并执行它。
因此,MMU有效地将所有虚拟地址0-4095映射到物理地址8192-12287。
同样,指令MOVREG,8192有效地转换为MOVREG,24576,虚拟地址8192(在虚拟页2中)被映射到物理地址24576(在物理页帧6中)。
通过正确设置MMU,可以将16个虚拟页放置在任何8页框架上。
但这并不能解决虚拟地址空间比物理内存大的问题。
上图中,物理页框有8个,所以只有8个虚拟页映射到物理内存,上图中数字X代表的其他页没有定义。
在当前的硬件中,存在/不存在位用于注册内存中页面的当前存在。
如何映射未映射的页当程序访问未映射的页时,例如执行MOVREG指令32780时,会发生什么情况?虚拟页8(从32768开始)的第12字节对应的物理地址是多少?MMU检测到该页没有被标记(图中用X表示),CPU在操作系统中被阻塞。
这种陷阱称为页面错误或页面错误。
操作系统选择一个很少使用的页面并将其写入磁盘(如果磁盘上尚未存在)。
然后在新回收的页框中读取要访问的页面,修改映射关系,然后重新启动导致陷阱的指令。
有点难以理解,让我们举个例子。
例如,如果操作系统决定放弃页框1,那么它将加载物理地址4096处虚拟机的页8,并对MMU映射进行两次更改。
首先,它将虚拟页中的条目1标记为未映射,因此将来对虚拟地址4096-8191的任何访问都将触发陷阱。
然后,虚拟页8的条目被更改为具有交叉1,以便当导致陷阱的指令重新启动时,它将把虚拟地址32780映射到物理地址(4096+12)。
让我们看一下MMU的内部结构,以了解它们的工作原理以及为什么我们选择全部为双倍幂的页面大小。
在下图中我们可以看到虚拟地址8196(二进制00100000000100)使用页表映射图中所示的MMU映射机制的示例。
位页号和12位页号。
4位页号可以表示16个页,12位偏移量可以表示一页内的所有4096个字节。
页号可以用作页表的索引来检索与虚拟页相对应的页帧号。
如果存在/不存在则设置为0,从而导致操作系统陷阱。
如果该位为1,则将页表中找到的页帧号复制到输出寄存器的高3位,加上低12位偏移量到输入虚拟地址。
这形成了一个15位的物理地址。
然后输出寄存器的作为物理地址发送到总线。
页表在上面的简单例子中,虚拟地址到物理地址的映射可以概括如下:虚拟地址分为虚拟页号(上半部分)和偏移量(下半部分)。
例如,对于16位地址和4KB的页面大小,高4位指定16个虚拟页面之一,而低12位则定义所选页面内的偏移量(0-4095)。
虚拟页号可以作为页表中的索引来访问虚拟页中的。
页框号(如果有)可以从页表条目中找到。
然后将页框号添加到偏移量的高端来替换虚拟页号,形成物理地址。
因此,页表的作用是将虚拟页放入帧中。
从数学上来说,页表是一个函数,其参数是虚拟页号,结果是物理页框号。
通过该函数可以将虚拟地址中的虚拟页转换为页框,从而形成物理地址。
页表项的结构我们来讨论一下组成页表项的具体结构,页表项是与机器相关的,但是页表项在不同的机器上大致是相同的。
以上就是一个页表项的组成。
不同计算机的页表项可能不同,但一般都是32位的。
页表项中最重要的字段是页框号(Pageframenumber)。
最终,将页表移动到页框的最重要步骤是映射该值。
另一个重要的事情是存在/不存在位,如果该位的值为1,则页表条目有效且有效。
可以使用。
如果该值为0,则表示该页表项对应的虚拟页不在内存中,访问该页将引发缺页异常。
保护位(Protection)告诉我们允许什么样的访问。
最简单的表示就是这个字段只有一位,0表示可读可写,1表示只读。
使用修改(修改)位和访问(引用)位的跟踪页。
当写入页面时,设备自动设置修改位。
当页面重新分配给页框时,修饰符位非常有用。
如果页面已被修改(即脏),则必须将其写回磁盘。
如果页面没有被修改(即是干净的),则页面框架在重新分配期间被简单地丢弃,因为磁盘副本仍然有效。
这部分有时被称为脏部分,因为它反映了页面的状态。
当页面被访问(读或写)时,访问(引用)位被设置。
该值有助于操作系统在发生页面错误时选择要消除的页面。
不再使用的站点比正在使用的站点更适合退役。
该位在后面讨论的页面替换算法中起着重要作用。
最后一位用于禁用页面缓存。
可以通过该位禁用缓存。
具有独立I/O空间且没有内存映射I/O的机器不需要该位。
在我们深入讨论以下问题之前,应该注意的是:虚拟内存本质上是用来创建地址空间的抽象。
可以理解为是CPU将虚拟地址空间分解为页并将页框中的每一项映射到物理内存的过程。
因为我们的重点是如何管理这个虚拟内存抽象。
加快分页过程现在我们已经了解了虚拟内存(virtualmemory)和分页(paging)的基础知识,现在我们可以重点关注具体的实现。
在任何分页系统中,你都必须处理两个主要问题:将虚拟地址报告给物理地址的速度必须快;如果虚拟地址空间足够大,那么页表就会很大。
每次内存访问都需要将虚拟地址映射到物理地址。
操作数:操作数是计算机指令的组成部分,它指定在指令上执行的数字运算的数量。
运算符指示指令执行的操作所需的数据源。
操作数是汇编指令的一个字段。
例如MOV、ADD等。
因此,每条指令可以多次访问页表,如果执行一条指令需要1ns,那么页表查询必须在0.2ns内完成,以避免映射成为主要的性能瓶颈。
第二个问题是所有现代操作系统都至少使用32位虚拟地址,并且64位正变得越来越普遍。
假设页面大小为4KB。
32位地址空间有近100万页,64位地址空间简直难以想象。
对大型和快速站点地图的需求成为构建计算机的一个非常重要的限制。
喜欢上图页表中,每个表项对应一个虚拟页,以虚拟页号作为索引。
当进程启动时,操作系统会将进程缓存页表的读取副本放入注册表中。
最后一句很难理解吗?还记得什么是页表吗?它是将虚拟地址映射到内存地址的页表。
页表是虚拟地址转换的关键组件,需要虚拟地址转换来访问内存中的数据。
当进程启动时,它会执行多次虚拟地址到物理地址的转换,将物理地址的副本从内存读取到寄存器中,然后执行此转换过程。
因此,在进程执行过程中,不需要访问内存来查找页表。
使用这种方法的优点是简单,并且在映射过程中不需要访问内存。
缺点是当页表很大时,代价昂贵,并且每次发生上下文切换时都必须加载整个页表,这会降低性能。
考虑到这一点,我们来讨论处理大转换检测空间的加速分页机制和实现方案。
大多数优化解决方案都是从内存页表开始的。
这种设计对效率有巨大影响。
例如,考虑一条将数据从一个寄存器复制到另一个寄存器的1字节指令。
如果没有分页,该指令仅访问内存一次,因此它从内存中获取指令。
使用分页机制后,将需要更多的内存访问来访问页表。
由于执行速度通常受到CPU从内存取指令和数据的速度的限制,需要两次访问才能达到一次访问的效果,因此内存访问性能会下降一半。
在这种情况下,根本不使用分页机制。
什么是1字节指令?我们以8085微处理器为例在8085微处理器中,字节指令共有三种类型,分别是1-byte(1字节)、2-byte(2字节)。
我们分别来说一下1字节:1字节操作数和操作码共同表示,1字节操作数是一个内部寄存器,被编码在需要存储位置的指令中,以将单个寄存器存储在内存位置中;没有操作数的指令也是1字节指令。
例如:MOVB、C、LDAXB、NOP、HLT(不懂的读者可以自行查看)2-byte:2个字节包括:第一个字节指定光码;需要在内存中存储两个存储位置。
例如,MVIB、26H、IN56H3字节:在3字节指令中,接下来的两个字节指定16位地址;保存高位地址。
该指令需要三个内存位置来在内存中存储单个字节。
例如,大多数程序(如LDA2050H和JMP2085H)总是多次访问少量页面,而不是少量访问大量页面。
因此,只有部分页可以被再次访问,而其他页表项很少被访问。
页表条目通常也称为PageTableEntry(PTE)。
基于这个想法,提出了从硬件角度解决这个问题的方案,即为计算机放置一个小型硬件设备,可以直接将虚拟地址设置为物理地址,而无需需要进入页表。
该设备称为TranslationLookasideBuffer(TLB),有时称为关联内存。
TLB通常驻留在MMU中并包含少量的表项您是否还有些困惑?什么是TLB,实际上是一种用来减少访问内存所需时间的高速缓存,通常称为地址转换高速缓存(地址转换高速缓存-translationcache)。
TLB通常位于CPU和CPU缓存之间,这是与CPU缓存说再见的不同缓存。
我们来看看TLB是如何工作的。
当MMU中的虚拟地址需要转换时,硬件首先检查虚拟页号和TLB中的所有条目是否并行匹配,以确定虚拟页是否在TLB中。
如果找到有效匹配并且要执行的访问操作没有违反保护位,则直接从TLB获取页框号,而不需要直接访问页表。
如果虚拟页在TLB中但违反了保护位的权限(例如允许只读,但允许写指令),则会返回protectionfault。
上面讨论的是虚拟地址在TLB中的情况,那么如果虚拟地址已经不在TLB中了怎么办呢?如果MMU发现没有有效的匹配,它执行正常的页表查找,从TLB中检索条目,并将找到的页表条目放入TLB中。
当一个条目从TLB中清除时,修改的位被复制到内存中的页表条目中,除了访问位之外,其他部分保持不变。
当页表项从页表加载到TLB时,所有值都是从内存中获取的。
软件TLB管理到目前为止,我们假设每台计算机都有硬件识别的页表,外加一个TLB。
在本设计中,TLB管理和TLB错误处理完全在硬件中完成。
操作系统陷阱仅在页面内存不足时发生。
过去,我们的上述假设大体上是正确的。
然而,在许多现代RISC机器上,包括SPARC、MIPS和HPPA,几乎所有页面管理都是在软件中完成的。
精简指令集计算机(RISC)是一种计算机指令集,它使计算机的微处理器比复杂指令集计算机(CISC)具有更少的每条指令周期(CPI),TLB条目是从系统操作员显式加载的。
当发生TLB访问未命中时,MMU不再搜索页表并检索所请求的页表条目,而是生成TLB失败并将问题留给操作系统来解决。
操作系统必须找到该页,将其从TLB中删除(删除页表中的一个条目),然后将新找到的页放入TLB中,最后执行错误的指令。
然而,所有这些操作都必须使用少量指令来执行,因为TLB错误的发生率比错误高得多。
无论是使用硬件还是软件来处理TLB未命中,常见的方式是查找页表并执行索引操作来定位要访问的页面。
软件查找的问题在于,保存页表的页可能不在TLB中,这将在处理过程中导致其他TLB错误。
一种改进方法是将TLB条目的大型缓存保留在固定位置内存中以减少TLB未命中。
通过首先检查软件缓存,操作系统可以有效减少TLB失效问题。
TLB软件管理会出现两个TLB失败问题当一个页面在内存中被访问而TLB中没有访问时,那么此时需要做的就是在上面的TLB过程中更新页表)而不引起访问/磁盘输出,并且处理只需要几个机器指令即可在几纳秒内完成。
然而,当页面本身不在内存中时,就会发生硬缺失,并且必须从磁盘获取页表。
在页表结构中查找镜像的过程称为页表遍历。
以上两种情况是理想情况下出现的现象,但实际执行中情况会更加复杂。
有些错误可能更软或更难(讽刺)。
例如,如果在页表遍历的过程中没有找到所请求的页面,那么就会出现三种情况:所请求的页面在内存中,但是没有注册到进程的页表中这种情况可以是:当其他进程在内存中崩溃时磁盘上,这种情况下,页面只需要被正确映射,不需要从硬盘上传输,这是一种软故障,称为次要页面错误(smallfailure)。
基于上述情况,如果页面必须直接从硬盘加载,这就是主要页面错误(majorpagefalut)。
另一种情况是程序可以访问非法地址,根本不需要将映射添加到TLB中。
这时操作系统会报告分段错误来终止程序。
只有第三种类型的缺页是程序错误。
(捂脸),也许你讨论了很多还不知道,我提醒一下,上面讨论的页面加速过程就是虚拟地址到物理地址连接速度快的问题,如果虚拟地址空间很大,页表也会很大。
第一种多级页表解决方案是使用多级页表。
和一个12位偏移字段。
因为偏移量是12位,所以页面大小是4KB,总共有2^20个页面。
引入多级页表的原因是为了避免整个页表一直保存在内存中。
不需要的页表不应被维护。
多级页表是由两级或更多级分页表组成的分页方案,也称为分层分页。
1级页表项是指向2级页表的指针,2级页表项是指向3级页表的指针,依此类推。
底层页表存储当前信息。
下面是二级页表的工作过程,左边是顶层页表,有1024个表项,对应10位的PT1字段。
当虚拟地址发送到MMU时,MMU首先提取PT1字段,并使用该值作为访问顶级页表的索引。
因为整个4GB(即32位)虚拟地址被划分为4KB块,所以顶层页表中的每1024个条目代表一个4M块地址范围。
的条目通过索引顶级页表得到的表包含二级页表的地址或页框号。
顶层页表项0指向程序体页表,项1指向包含数据的页表,项1023指向堆栈页表,其他项(阴影部分)表示未使用。
现在使用PT2字段作为索引来访问所选择的二级页表,以找到虚拟页对应的页框号。
倒排页表一种日益增长的页层次结构替代方案是使用倒排页表(倒排页表)。
此类解决方案的示例包括PowerPC、UltraSPARC和Itanium。
在这种设计中,实内存中的每个页框对应一个条目,而不是每个虚拟页对应一个条目。
倒排页表虽然节省了大量空间,但也有其缺点:即虚拟地址到物理地址的转换变得困难。
当进程n访问虚拟页p时,硬件无法再通过将p视为页表中的索引来查找物理页。
相反,必须搜索整个倒排列表才能找到条目。
另外,每次内存访问操作都必须执行一次寻道,而不是发生页错误。
解决这个问题的方法就是使用TLB。
当TLB失败时,软件必须搜索整个倒排页表。
一种可能的方法是构建哈希表并使用虚拟地址进行哈希。
当前内存中具有相同哈希值的所有虚拟页都链接在一起。
如下图所示,如果哈希表中的槽数与机器中的物理页数一样多,则哈希表中冲突链的长度将是一个条目的长度,即大大提高地图速度。
一旦找到页框,新的(虚拟页号、物理页框号)就会加载到TLB中。
P115页上存在发布错误。
两条线的位置相反。
谁能告诉我虚拟内存的工作原理!
类别:计算机/网络>>硬件分析:虚拟内存不足其实和你的内存无关。虚拟内存是从硬盘驱动器中提取的存储空间。
当你运行游戏或运行大量程序时,你的内存空间很小,需要使用大量的虚拟内存来帮助。
虚拟内存的工作原理是,当接收到一部分信息时,就会处理当前的信息,但在处理的过程中,又接收到另一条信息。
虚拟内存会将数据以页的形式存储在硬盘上,处理完上一次的信息后,就将这次的信息取出来进行处理。
但由于硬盘上寻呼机碎片不断堆积,垃圾文件过多。
因此,原规划的虚拟内存空间不足。
一般来说,虚拟内存的设置分为两极。
它是最大值和最小值。
通常,人们根据自己实际内存的大小来设置虚拟内存。
最小值应设置为实际内存的1.5倍,最大值应设置为实际内存的1.5倍。
例如。
你当前的虚拟内存是128M,那么虚拟内存范围可以设置为:最小值:128*1.5=192M。
最大值:128*2=256M。
当然还有更简单的。
您可以使用优化大师软件。
它可以根据您的实际内存计算出虚拟内存的最佳设置范围。
最后,我想补充一点,您应该偶尔清理虚拟内存中的分页器碎片。
养成良好的清洁习惯。
(优化大师功能这么全面)不然你的虚拟内存设置多大,里面都会塞满垃圾数据。