虚拟内存是什么
虚拟内存是一种管理和优化计算机系统中内存资源的技术。
下面是关于虚拟内存的
1.虚拟内存的概念
虚拟内存是计算机技术中使用的一种内存管理技术,将物理内存和虚拟内存结合在一起。
内存与硬盘上的交换空间结合在一起,通过操作系统进行统一管理。
虚拟内存技术可以扩展系统的内存空间,允许应用程序使用超出物理内存限制的内存地址空间。
2.虚拟内存的作用
虚拟内存的主要作用是提高系统性能。
当物理内存已满时,操作系统会将一些暂时不活动的数据存储在硬盘的交换空间中,从而释放物理内存以供当前活动的应用程序使用。
这样,即使物理内存有限,系统也可以顺利运行多个应用程序。
同时,虚拟内存还可以进行动态内存分配,根据应用需要调整内存分配策略。
3.虚拟内存实现原理
虚拟内存的实现依赖于操作系统的内存管理模块。
操作系统将物理内存划分为许多页,每个页都有一定的容量。
当应用程序请求访问某个内存地址时,操作系统会检查物理内存中是否存在该地址对应的内存页。
如果存在则直接访问;如果不存在,则通过页面替换算法将硬盘上的数据加载到物理内存中,然后由应用程序使用。
这样,虚拟内存就可以实现动态管理和内存优化。
总之,虚拟内存是计算机系统中一项重要的内存管理技术。
它通过结合物理内存和硬盘资源来提高系统性能,使应用程序能够更高效地运行。
虚拟内存是什么意思虚拟内存原理与工作方式
虚拟内存虽然基址寄存器和索引寄存器用于创建地址空间的抽象,但还有另一个问题需要解决:管理臃肿软件。尽管内存的大小正在迅速增长,但软件的大小增长速度甚至比内存还要快。
20世纪80年代,许多大学使用4MBVAX计算机来运行分时操作系统,可以同时运行十几个用户。
微软现在推荐的64位Windows8系统至少需要2GB内存,而许多多媒体趋势进一步推动了对内存的需求。
这种发展的结果是,要执行的程序往往太大而无法容纳在内存中,系统必须能够支持多个程序同时运行,即使内存可以容纳单个程序的要求,总体而言,内存还是不能满足软件的需求(感觉很像xxx和xxx的矛盾)。
交换技术在一些中小型应用中仍然不是一个非常有效的解决方案。
每次都需要更换几GB内存吗?这显然是不合适的。
典型的SATA硬盘的峰值传输速度为每秒数百兆字节,这意味着1GB程序的交换或交换需要几秒钟的时间。
SATA硬盘(SerialATA)也叫串行硬盘,是PC硬盘未来的趋势,已经基本取代了传统的PATA硬盘。
那么有没有一种有效的方法来解决这个问题呢?是的,这意味着使用虚拟内存。
虚拟内存的基本思想是,每个程序都有自己的地址空间,这个地址空间被划分为若干块,称为页。
每一页都是一个连续的地址范围。
这些页面被映射到物理内存中,但并非所有页面都需要位于内存中才能运行程序。
当程序引用物理内存中的部分地址空间时,硬件立即执行必要的映射。
如果程序引用了不在物理内存中的地址空间的一部分,则操作系统有责任将缺失的部分加载到物理内存中并重新执行失败的指令。
从某种意义上说,虚拟地址是基址寄存器和变址寄存器的映射。
8088有单独的基址寄存器(但没有索引寄存器)用于放置文本和数据。
虚拟内存允许将整个地址空间以小单元映射到物理内存,而不仅仅是移动文本和数据区域。
下面我们就来看看虚拟内存是如何实现的。
虚拟内存非常适合在多道程序系统中使用。
当程序等待其部分被读入内存时,CPU可以交给另一个进程。
分页大多数使用虚拟内存的系统都使用分页技术。
在每台计算机上,程序都指向一系列内存地址。
当程序执行MOVREG,1000指令时,它将内存位置1000的复制到REG(反之亦然,具体取决于计算机)。
地址可以通过索引、基址寄存器、段寄存器或其他方式生成。
这些程序生成的地址称为虚拟地址(virtualaddress),形成虚拟地址空间(virtualaddressspace)。
在没有的计算机上虚拟内存,系统直接将虚拟地址发送到内存行,并且所有读取和写入都使用相同的物理地址。
使用虚拟内存时,虚拟地址不会直接发送到内存总线。
相反,内存管理单元MMU(MemoryManagementUnit)用于将虚拟地址映射到物理内存地址,如下所示。
页表显示了虚拟地址和物理内存地址之间的关系。
关联关系。
每边以4096的倍数开始,以4095结束,因此4K到8K实际上是4096-8191,8K-12K是8192-12287。
在这个例子中,我们可能有一台16位地址为0-64K-1的计算机,这些是虚拟地址。
然而,物理地址只有32KB。
因此,虽然可以编写64KB的程序,但是无法将程序转移到内存中执行。
磁盘上必须有最大64KB的程序核心映像的完整副本,以确保在需要时将程序片段转移到内存。
“映射页面是如何映射的?虚拟地址空间由固定大小的单元组成。
这种固定大小的单位称为页。
相反,物理内存也有固定大小的物理单元,称为页框。
页面和页框的大小相同。
在上面的例子中,页面大小为4KB,但在实际使用中,页面大小可以在512字节到1GB之间。
对应64KB的虚拟地址空间和32KB的物理内存,有16个虚拟页和8个页框可用。
RAM和硬盘之间的交换总是以整页为单位进行。
例如,当程序尝试访问该地址时,执行以下指令MOVREG,0会将虚拟地址0发送到MMU。
MMU检测到虚拟地址位于第0页(0-4095)。
根据其映射结果,该页对应页框2(8192-12287),因此MMU将地址转换为8192,并将地址8192发送到Bus。
。
内存对MMU一无所知,它只看到地址8192处的读或写请求并执行它。
MMU有效地将所有虚拟地址0-4095映射到物理地址8192-12287。
同样,命令MOVREG,8192有效地转换为MOVREG,24576。
虚拟地址8192(在虚拟页2中)被映射到物理地址24576(在物理页帧6中)。
通过正确设置MMU,可以将16个虚拟页分配给8个页框中的每一个。
但是,这并没有解决虚拟地址空间比物理内存大的问题。
上图中,物理页框有8个,所以只分配了8个虚拟页给物理内存,上图中数字X代表的其他页没有分配。
在实际硬件中,存在/不存在位用于记录内存中页面的实际存在。
如何映射未映射的页面?当程序访问未分配的页面时会发生什么,例如B.何时执行指令MOVREG,32780?虚拟页8(从32768开始)的第12个字节对应哪个物理地址?MMU确定该页未分配(图中用X表示)并且CPU被困在操作系统中。
这种陷阱称为页面错误或缺页错误。
操作系统选择一个很少使用的页面并将其写入硬盘驱动器上的(如果硬盘上尚不存在)。
然后将需要访问的页面读入刚刚回收的页框,改变映射关系,然后重新启动引起陷阱的语句。
有点难理解,我们举个例子。
例如,如果操作系统决定放弃页框1,则会将虚拟机的页8加载到物理地址4096中,并对MMU分配进行两次更改。
首先,虚拟页上的条目1被标记为未映射,因此将来对虚拟地址4096-8191的任何访问都会触发陷阱。
然后,虚拟页8的条目更改为叉号1。
因此,当导致陷阱的命令重新启动时,虚拟地址32780将映射到物理地址(4096+12)。
让我们看一下MMU的内部结构,以了解它的工作原理以及为什么我们选择全部为2的幂的页面大小。
在下图中,我们看到了使用上面页表分配图中所示的MMU分配机制分配的虚拟地址8196(二进制0010000000000100)的示例。
输入的16位虚拟地址被分成4位地址。
位页号和12位位偏移量。
4位页号可以表示16个页,12位偏移量可以表示一页内的所有4096个字节。
页号可以作为页表中的索引来获取虚拟页对应的页框号。
如果存在/不存在则设置为0,从而导致操作系统陷阱。
如果该位为1,则将页表中找到的页帧号复制到输出寄存器的高3位,加上输入虚拟地址中的低12位偏移量。
这形成了一个15位的物理地址。
然后输出寄存器的作为物理地址发送到总线。
页表在上面的简单例子中,虚拟地址到物理地址的映射可以概括如下:虚拟地址分为虚拟页号(上部)和偏移量(下部)。
例如,对于16位地址和4KB的页大小,前4位指定16个虚拟页之一,而后12位则确定所选页内的偏移量(0-4095)。
虚拟页号可以作为页表中的索引来访问虚拟页的。
页框号(如果有)可以在页表条目中找到。
然后将页框号拼接到偏移量的顶部来替换虚拟页号,形成物理地址。
因此,页表的作用就是将虚拟页映射到页框。
从数学上讲,页表是一个函数,其参数是虚拟页号,其结果是物理页帧号。
通过该函数可以将虚拟地址中的虚拟页转换为页框,从而形成物理地址。
页表项的结构让我们讨论一下页表项的具体结构,它由页框号和存在/不存在组成,页表项是与机器相关的,但页表项在不同的机器上大致相同。
以上就是一个页表项的组成。
不同计算机的页表项可能不同,但一般都是32位项。
页表项中最重要的字段是页框号。
最后,将页表移入页框的最重要步骤是映射该值。
下一个要点是存在/不存在位。
如果该位的值为1,则页表项有效并且可以使用。
如果该值为0,则表示该页表项对应的虚拟页不在内存中,访问该页会引起页错误异常(pagefailure)。
保护位告诉我们允许什么类型的访问。
最简单的表示是该字段只有一位,0表示可读可写,1表示只读。
更改的位(修改的)和访问的位(引用的)跟踪页面使用情况。
当写入页面时,硬件自动设置更改位。
当页面重新分配给页框时,更改位非常有用。
如果页面已更改(即脏),则必须将其写回磁盘。
如果页面未更改(即干净),则在重新分配期间会简单地丢弃该页框,因为磁盘上的副本仍然有效。
该位有时称为脏位,因为它反映了页面的状态。
访问位(Referenced)在访问页面时设置,无论是读取还是写入。
该值有助于操作系统在发生页面错误时选择要删除的页面。
不再使用的页面比已经使用的页面更有可能被淘汰。
该位在页面替换算法中起着很大的作用,这将在后面讨论。
最后一位用于禁用页面缓存。
该函数无论是映射到设备寄存器还是映射到内存中都起着关键作用。
可以通过该位禁用缓存。
具有独立I/O区域而不是内存映射I/O的机器不需要该位。
在我们详细讨论以下主题之前,必须强调虚拟内存本质上用于创建地址空间的抽象。
可以理解为一个进程,是CPU的一个抽象,它将虚拟地址空间分成页,并将每个元素映射到物理内存中的页框。
因为我们的重点是管理这个虚拟内存抽象。
加速分页过程现在我们已经了解了虚拟内存和分页的基础知识,现在我们可以专注于具体的实现。
在任何具有分页的系统中,您必须处理以下两个主要问题:虚拟地址到物理地址的映射速度必须很高。
如果虚拟地址空间足够大,页表也足够大,问题是每次访问内存都需要虚拟地址到物理地址的映射。
所有指令最终都来自内存,并且许多指令也访问内存中的操作数。
操作数:操作数是计算机指令的组成部分,指定指令中执行的数字运算的数量。
操作数指定语句执行的操作所需的数据源。
操作数是汇编指令的一个字段。
例如MOV、ADD等。
因此,每个语句可以多次访问页表。
如果一条指令需要1ns执行,则页表查询必须在0.2ns内完成始终多次访问少量页面,而不是仅对大量页面进行少量访问。
结果,只能访问少数页,而很少访问其他页表项。
页表条目通常也称为PageTableEntry(PTE)。
基于这个思想,提出了从硬件方面解决这个问题的方案,即为计算机设置一个小型硬件设备,可以直接将虚拟地址映射到物理地址,而不需要访问页表。
该设备称为TranslationLookasideBuffer(TLB),有时称为关联内存。
TLB通常位于MMU中并包含少量表条目。
除了虚拟页号之外,其他表项与页表都是一一对应的。
什么是TLB?它是内存高速缓存,是MMU存储的一部分,通常称为地址转换高速缓存(addressconversioncache)。
TLB通常位于CPU和CPU缓存之间,这是与CPU缓存不同的缓存。
说再见。
我们来看看TLB是如何工作的。
当MMU中需要翻译虚拟地址时,硬件首先检查虚拟页号和TLB中的所有条目进行并行匹配,以确定虚拟页是否在TLB中。
如果找到有效匹配并且要执行的访问操作不违反保护位,则直接从TLB获取页帧号,而不直接访问页表。
如果虚拟页位于TLB中但违反了保护位权限(例如只允许读取但允许一个写入命令),则返回保护错误。
上面讨论的是虚拟地址在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中的页表(上述过程),且不会产生磁盘I/O操作,并且该处理只需要几条机器指令即可在几纳秒内完成。
但是,如果页面本身不在内存中,则会发生硬未命中,并且必须从磁盘获取页表。
硬缺失的处理时间通常是软缺失的一百万倍。
在页表结构中查找映射的过程称为页表遍历(pagetablewalk)。
以上两种情况是理想情况下出现的现象,但实际应用中情况会更加复杂。
错误情况可能既不是硬错误也不是软错误。
有些失误可能会更轻或更重(咯咯笑)。
例如,如果遍历页表时没有找到所需的页,就会出现三种情况:所需的页在内存中,但没有记录在进程的页表中。
这种情况可以是:如果其他进程正在运行在这种情况下,页面只需要正确映射即可,无需从磁盘传输。
这是一种称为次要页面错误的软故障。
基于以上情况,如果页面需要直接从磁盘加载,则属于主要页面错误(majorpagefalut)。
另一种情况是程序可能访问非法地址,根本不需要添加到TLB的映射。
此时操作系统会报告分段错误(segmentationerror)来终止程序。
只有第三种类型的缺页是程序错误。
其他缺页情况由硬件或操作系统处理,但会牺牲程序性能。
还记得我们讨论过的问题吗?(捂脸),也许你们讨论太多了,不知道。
再次提醒大家,上面讨论的加速分页过程,问题是虚拟地址到物理地址的映射速度一定要高呢,如果虚拟地址空间足够大,页表也会足够大。
就像巨大的虚拟地址空间一样所处理的解释如下。
多级页表的第一个解决方案是使用多级页表(Multi)。
下面是一个例子。
32位虚拟地址分为10位PT1字段和10位PT2字段。
和一个12位偏移字段。
由于偏移量为12位,因此页面大小为4KB,总共有2^20个页面。
引入多级页表的原因是为了避免不断地将整个页表保存在内存中。
不必要的页表不应保留。
多级页表是由两级或更多级分页表组成的分页方案,也称为分层分页。
1级页表中的条目是指向2级页表的指针,2级页表中的条目是指向3级页表的指针,依此类推。
最后一级页表存储实际信息。
下面是二级页表的工作过程。
最左边是顶层页表,有1024个条目对应于10位PT1字段。
当虚拟地址发送到MMU时,MMU首先提取PT1字段,并使用该值作为访问顶级页表的索引。
由于4GB(即32位)的整个虚拟地址已被划分为4KB块,因此顶层页表中的1024个条目中的每一个都代表4MB块地址范围的索引所获得的表条目。
顶级页表包含二级页表的地址或页框号。
顶层页表的表项0指向程序体的页表,表项1指向有数据的页表,表项1023指向堆栈页表,其他表项(用阴影表示)表示它们是没有使用。
现在使用PT2字段作为索引来访问选定的二级页表,找到虚拟页对应的页框号。
倒排页表分页层次结构的一种日益增长的替代方案是使用倒排页表。
此类解决方案的示例包括PowerPC、UltraSPARC和Itanium。
通过这种设计,实内存中的每个页框对应一个条目,而不是每个虚拟页对应一个条目。
倒排页表虽然节省了大量的空间,但是它也有自己的缺点:那就是虚拟地址转换成物理地址变得困难。
当进程n访问虚拟页p时,硬件无法再通过将p视为页表中的索引来查找物理页。
相反,必须搜索整个倒排列表才能找到条目。
此外,搜索必须针对每个内存访问操作执行一次,而不是在发生页面错误时执行。
解决这个问题的方法就是使用TLB。
如果发生TLB错误,软件必须搜索整个倒排页表。
一种选择是创建哈希表并使用虚拟地址进行哈希处理。
目前,内存中的所有虚拟页都通过相同的哈希值链接在一起。
如下图所示,当哈希表中的槽数量与机器中的物理页数量一样大时,哈希表中的冲突链长度等于一个条目的长度,从而提高了哈希表中冲突链的长度。
绘图速度相当快。
一旦找到页框,新的(虚拟页码,物理页码)页帧号)加载到TLB中。
P115页的出版物有错误。
根据以下描述,很容易纠正这个问题。
虚拟内存占用的是系统盘的空间吗?
当您玩游戏或打开多个窗口时,系统可能会提示内存不足。这是由于虚拟内存的作用而发生的。
虚拟内存的原理是,当系统需要大量数据来运行程序时,内存就会“满”。
此时,将为“活动”数据腾出空间,并将一些“惰性”数据转移到硬盘的虚拟内存中。
默认情况下,虚拟内存保存在硬盘的系统分区中,名为Pagefile.sys。
为了提高工作效率,您可以手动调整虚拟内存的大小。
步骤如下:1、右键单击桌面上的“我的电脑”图标,选择“属性”选项,打开“系统属性”窗口。
2.单击“高级”选项卡,进入“高级设置”对话框。
3.选择“显示”区域中的“设置”按钮,打开“显示选项”窗口,然后单击“高级”选项卡。
4.单击“虚拟内存”区域中的“更改”按钮,进入设置窗口。
选择可用容量较大的分区,勾选“自定义大小”前面的复选框,填写“初始大小”和“最大值”的值。
5.单击“设置”按钮,然后单击“确定”按钮,完成虚拟内存调整。
重新启动计算机以使设置生效。
操作系统的功能中的虚拟内存如何实现
1、实现方法下面以“Windows按钮”中转移虚拟内存的盘符为例,选择“高级”选项卡,点击“虚拟内存”栏中的“更改”按钮,含义是可以去在“虚拟内存”窗口中选择驱动器列表中的系统驱动器盘符,然后选择“无分页文件”选项,然后单击“安装”按钮;然后单击“设置”“初始大小”中的值“最大值”,然后单击“设置”按钮,最后单击“确定”按钮退出2、实现原理虚拟内存的概念与物理内存有关系统的物理内存满足不了,操作系统就开辟一个磁盘。硬盘上的空间称为内存空间,Windows98使用Win386.swp文件,而Windows2000/.pagefile.sys页面来管理虚拟内存1.一般情况一般情况下,建议让Windows自动分配和管理虚拟内存,它可以根据实际内存使用情况自动调整虚拟内存的大小。
2、关于最小值,Windows建议页面文件的最小值应该是系统当前的物理内存量加上12MB。
对于物理内存小于256MB的用户,建议使用页面文件的最小值。
设置大于:①使用情况对于内存为128MB或以下的用户,应设置当前物理内存量的1.75倍作为页面文件的最小值。
②对于内存大小在128MB到256MB之间的用户,建议设置当前物理内存容量的1.5倍作为页面文件的最小值。
3、关于最大值一般情况下,页面文件的最大值越大越好。
4、极端情况如果硬盘空间紧张,在设置页面文件时,只要保证不小于物理内存的3/4即可。
如果物理内存较大(大于512MB),则可能会禁用虚拟内存。
(上海任亚伟)5、根据不同的任务环境进行设置①以3D游戏为主的环境,对CPU、显卡、内存要求较高。
如果物理内存小于256MB,则应预留虚拟内存。
大。
这对于提高游戏的稳定性和流畅度会有很大的帮助。
②环境主要以视频流为主。
视频应用程序需要硬盘空间,但不会像3D游戏环境中那样放置大尺寸的虚拟内存,特别是对于WindowsXP用户。
由于WindowsXP不会自动释放不必要的空间,这意味着Pagefiles.sys文件会变得越来越大。
如果你把虚拟内存和WindowsXP放在同一个分区,在播放RM、ASF等视频流文件后,系统经常会提示你虚拟内存设置太小或者磁盘空间不足。
现在看文件页面,已经有1GB的容量了。
因此,建议经常欣赏视频文件的WindowsXP用户设置较小的初始值或将虚拟内存移动到分区。
除系统盘外。
虚拟内存的工作原理
虚拟内存由硬件和操作系统自动调度和管理,以规划和管理存储数据。
工作过程包括6个步骤:①通过组号a和组地址b改变中央处理器访问主存的逻辑地址,改变组号a的地址,即使用逻辑组号a作为检查地址变化表以查明数据集是否存储在主存中的索引。
②如果组号在主存中,则执行④;如果组号不在主存中,则检查主存中是否有空闲空间,否则就到辅存中将该数据集传输到主存中。
③从辅助存储器中读取所需的组并将其发送到主存的空闲位置,然后将空闲的物理组号A和逻辑组号注册到地址转换表中。
④从地址转换表中读取逻辑组号A对应的物理组号。
⑤根据物理组号a和组内的字节地址求出物理地址。
⑥根据物理地址从主存中存取所需的信息。
布局方式有分页、类、类分页三种。
分页将逻辑和物理地址空间划分为固定大小的页面。
主存按页顺序编号,每个独立的程序区都有自己的页号顺序。
按照表一一计算。
页调度的优点是页分区小,页表对程序员清晰,地址变化快,传输过程简单,缺点是每个页不是程序的独立模块,不方便保护程序和数据。
划分表按照程序的逻辑结构来划分地址空间,该部分的长度是任意的,并且允许对程序进行扩展;缺点是转账操作比较复杂。
将这两个方法组合起来形成一个类页面调度程序。
在类分页调度中,物理空间被划分为页,程序被划分为模块,每个类被划分为与物理空间的页一样小的页。
类页调度结合了类调度和页调度的优点。
缺点硬件成本增加,软件变得更加复杂。
大多数大型通用计算机系统都使用类页调度。