b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

什么是内存(2): 虚拟内存

电脑杂谈  发布时间:2020-04-05 16:04:17  来源:网络整理

ddr pc3200是几代内存_u盘是内存么_什么是内存

通过上一篇文章的废话,我们应该已经了解了内存的层次结构. 技术细节非常复杂,但是这个主意并不难理解,因为它是一个非常简单的缓存主意. 因此,在本文中,我们开始讨论关于内存的另一个主题. 虚拟内存. 实际上,这个想法很容易理解.

我不知道有多少人听说过虚拟内存的概念,但是虚拟内存是计算机系统最重要的概念之一,其成功的主要原因是它一直在静默地工作,并且换句话说,我们从事应用程序的程序员不需要干预其工作流程,但是不追求的代码农民却不是一个好移民,因此,作为一个有抱负的程序员,我们仍然必须了解虚拟内存,甚至可以说,如果您不了解虚拟内存,就无法了解程序的深层操作原理. 理解汇编程序,链接程序,加载程序,共享对象,文件和进程的概念也是不可能的.

上一篇文章提出了一些问题供大家思考:

这些使我们仔细思考的问题将在本文中得到解答.

在访问者眼中,主存储器是M字节单位的数组,每个字节都有一个唯一的物理地址(PA). 它的访问地址与数组相同,第一个地址为0,随后的地址为1,2,3 ----- M-2,M-1;这称为线性地址空间. 这种访问内存的自然方式称为物理寻址.

注意: 在访问内存时,对于任何地址(无论是0还是M-1),访问该地址的时间始终相同.

在各种数据结构中,我们都说哈希表最快,比红黑树之类的要快,那么为什么哈希表最快?那是因为哈希表本质上使用数组. 那么阵列是最快的,为什么阵列最快?这是因为我们知道数组的起始地址和元素的序列号,我们可以获得内存中元素的地址,并且对于内存来说,访问任何地址的访问时间总是相同的. 只能遍历链表和树之类的结构. (但是,好的哈希算法仍然很难设计,这是另一个主题. )

一个使用物理寻址的系统_10.jpg-34.4kB

图10: 使用物理寻址的系统

上图是物理寻址的示例. 这是一条加载指令. 它从物理地址4开始读取4个字节. CPU通过存储器总线将指令和地址传递到主存储器. 主存储器读取从物理地址4开始的4个字节什么是内存,然后将其返回给CPU.

因为本文主要讨论虚拟内存,所以它是关于L4级别主内存和磁盘之间的交互的. 为了方便编写,有时文章会直接指出内存是指主内存. 因此,不要将其误认为是L1,L2之类的缓存. 如果您不理解本文的含义,请务必阅读我上一篇有关内存的文章(1): 内存层次结构,然后查看这篇文章.

早期计算机使用物理寻址,但是在当前多任务计算机时代,虚拟寻址是常用的. 如下图所示:

一个使用虚拟寻址的系统_11.png-178.6kB

图11: 使用虚拟寻址的系统

u盘是内存么_什么是内存_ddr pc3200是几代内存

CPU通过虚拟地址(VA)访问主存储器. 该虚拟地址在发送到主存储器之前将转换为物理地址. 将虚拟地址转换为物理地址的任务称为地址转换.

地址转换需要CPU硬件和操作系统之间的配合. CPU芯片上称为内存管理单元(MMU)的特殊硬件使用存储在主内存中的查找表来动态转换虚拟地址. 该表的内容由操作系统管理.

一些现代计算机系统仍然使用物理寻址,例如DSP,嵌入式系统和超级计算机系统. 这些系统的主要任务是执行单个任务,这与需要执行多个任务的通用计算机不同. 可以想象,物理寻址速度更快. 此原理与有关跨平台理解的某些文章中的原理相同,即Java在理论上比C ++慢.

前面已经解释了虚拟地址,因此某些人可能已经数过本文开头提出的问题. 因为这些地址是虚拟地址,而不是实际物理内存中的地址. 已经了解了基本思想,然后我们将更详细地讨论这些细节.

进程地址空间-12.png-228.3kB

图12: 进程地址空间

上图是一个64位进程地址空间. 编译器编译程序时,结果将编译到32/64位地址空间中. 虚拟寻址模式简化了编译器和链接器的工作. 同样由于虚拟内存的存在,每个进程都可以具有较大的,一致的私有地址空间. 这有助于内存管理,并保护每个进程的地址空间不被其他进程破坏. 它还有助于共享库.

虚拟内存将主内存视为磁盘缓存. 主存储器仅存储活动区域,并根据需要在磁盘和主存储器之间来回传输数据.

从概念上讲,虚拟内存被组织为磁盘上存储的N个连续字节大小单位的数组,即字节数组. 每个字节都有一个唯一的虚拟地址作为数组的索引. 在虚拟内存的地址和磁盘的地址之间建立映射关系. 磁盘上活动阵列的内容缓存在主内存中. 在内存层次结构中,磁盘上的数据(较低层L5,请参见上一篇文章中的图4)分为多个块,这些块充当主内存(较高层L4)之间的传输单元. 主内存用作虚拟内存(或磁盘)的缓存.

虚拟内存(VM)系统将虚拟内存分为具有固定大小的虚拟页面(Virtual Pages,VP),并且每个虚拟页有固定的字节大小. 同样,物理内存也分为物理页(Physical Page,PP),并且大小也是固定字节.

随时,虚拟页面分为三个不相交的部分:

未分配的VP不会占用任何实际的物理空间,这应该理解. 32位程序地址空间具有4G. 对于64G程序,其地址空间是一个非常大的天文数字(看起来像16777216T). 目前,我们的计算机配备2T磁盘和16G内存. 如果一个64位程序将每个VP映射到一个实际的PP. 无论如何,它都不匹配. 不需要一一对应,如“图12: 进程地址空间”所示,地址空间中有很多空白. 毕竟,程序实际上不能使用那么大的地址空间.

VM使用主存来作为缓存-13.png-44.8kB

图13: VM使用主内存作为缓存

ddr pc3200是几代内存_u盘是内存么_什么是内存

上图显示,在具有8页的虚拟内存中,尚未分配虚拟页0和3,因此它们在磁盘上不存在. 虚拟页1、4和6缓存在物理内存中. 虚拟页2、5和7已被映射和分配,但尚未缓存在主内存中.

当然,该图片上的标签是错误的,VP部分np和N-1应该分别标记为3和7,但是我们找不到更合适的图片. 所以每个人都知道我们假设总共有8个VP.

系统必须具有确定虚拟页是否缓存在主内存中某处的方法. 这可以分为两种情况.

这些功能由硬件和软件共同提供,包括操作系统,CPU中的内存管理单元(MMU)和存储在物理内存中的称为页表的数据结构. 页面表将虚拟页面映射到物理页面. 每次地址转换硬件将虚拟地址转换为物理地址时,它都会读取页表.

页表-14.png-76.5kB

图14: 页面表

上图显示了页表的基本结构. 页表是页表项(PTE)的数组. 虚拟地址的每个页面在页面表中都有一个对应的PTE. 在这里,我们假设每个PTE由一个有效位(有效位)和一个n位地址字段组成. 有效位指示虚拟页当前是否已缓存在主内存中.

我们在上一篇文章中所说的是内存(1): 内存层次结构中的缓存命中和丢失问题都是缓存的思想,这里肯定有相同的问题. 并且磁盘和主内存之间的高速缓存未命中的代价必须更高. 因为在L0-L4之间,每个高速缓存的速度大约相差10倍,但是在L4主存储器和L5磁盘之间,它们的速度相差大约100,000倍. 因此,在主存储器和磁盘之间交换的页面容量最大,并且命中率尽可能增加. 相应的替换策略,操作系统还使用了更复杂的算法.

在上一篇文章中,什么是内存(1): 内存层次结构,每次我们替换区域时,我们都使用一个块(block),但是这里我们所谈论的是页面(page),实际上是相同的意思. 只是由于历史原因,名称有所不同.

当CPU要读取虚拟页面中包含的内容时,如果该页面已经缓存在主内存中,则是页面命中. 完美,完美. 但是如果页面没有缓存在主内存中,我们称其为页面错误(page fault)

对VP3中的字的应用会引起不命中-15.png-96.3kB

图15: 在VP3中使用这些单词会导致遗漏

如上图所示,CPU引用了VP3中的内容,VP3未缓存在主存储器中. 系统从内存中读取PTE3,并得知未缓存VP3,从而触发页面错误异常. 页面错误异常将调用内核页面错误异常处理程序,该处理程序将选择受害者页面. 如下图所示,牺牲页面选择了存储在PP3中的VP4.

VP4被牺牲了-16.png-92.5kB

u盘是内存么_什么是内存_ddr pc3200是几代内存

图16: 牺牲了VP4

如果此时修改VP4的内容,则内核会将其复制回磁盘. 接下来,内核将磁盘上的VP3分配给内存中的PP3并更新PTE3. 然后返回到用户进程. 当异常处理程序返回时,它将重新开始导致页面错误的指令的执行. 当指令重新执行时,由于VP3已在主存储器中,因此这是页面命中.

VP3被缓存到PP3-17.png-98.5kB

图17: VP3缓存到PP3

根据习惯术语,在磁盘和内存之间传输页面的活动称为交换或分页. 仅当发生未命中(即系统未将磁盘的内容预先存储在内存中)时,才发生此交换活动. 这种策略称为需求分页.

我们只是说页面错误是一个例外,但是实际上,在计算机系统中,除以0,读写文件以及我们在上一篇文章中提到的中断(中断),甚至包括我们在内,都包括在内try try catch代码中写的是一个例外. 例如,除以0是Intel CPU指定的0号故障类型异常. 读写文件是Linux分别指定的陷阱类型0和1的例外. 多任务上下文切换,流程创建和回收等与系统中异常流的处理密切相关. 当然,这是另一个话题. 我们在这里不会做详尽的评论.

当然,每个进程都有一个独立的页表和一个独立的虚拟地址空间

返回到本文开头的问题,例如每个C程序都必须调用的库stdio,因此不可能为每个进程添加一个库. 每次使用时,内存中只有stdio库的一个副本.

共享页面-18.jpg-37.4kB

图18: “共享”页面

如上所示: 第一个进程的页面表将VP2映射到物理页面. 第二个过程还将其VP2映射到物理页面. 因此,物理页面由两个进程共享.

此时什么是内存,如果再次查看“图: 12个进程地址空间”,您会发现在地址空间中,每个进程起始地址的“共享库的内存映射区域”都是相同的. 再考虑一下进程之间共享内存的通信方法,因此虚拟内存简化了共享机制

您知道,有C语言的指针,您可以直接执行内存操作. 由于存在虚拟内存,我们的指针操作将不会访问其他进程的区域,但是即使对于其自己的地址空间,也应禁止访问许多内存区域. 这不仅包括内核区域,还包括内核区域. 只读代码段. 然后虚拟内存提供了这样的内存保护工具.

地址转换机制可以使用自然方式来提供内存访问控制. 在PTE上添加其他控制位以添加权限. 每次CPU生成地址时,地址转换硬件都会读取PTE.

ddr pc3200是几代内存_u盘是内存么_什么是内存

虚拟内存提供内存保护-19.png-30.4kB

图19: 虚拟内存提供了内存保护

在上图中,每个PTE添加了三个附加的控制位. SUP位指示进程是否必须在内核模式下运行. READ和WRITE位控制页面的读写权限. 如果一条指令违反了这些控制权限,则CPU将触发故障并将控制权传递给内核中的异常处理程序. 这种异常通常称为分段错误.

我们了解该页面. 该页面按操作系统划分,以方便管理主内存,并且用户不可见. 但是考虑这种情况,假设页面大小为1M. 但是某个程序的数据总计达0.5M,因此内存和磁盘之间的页面交换显然浪费了内存. 因此,划分的另一种方法是细分. 在上面的示例中,我将该段划分为0.5M并在内存和磁盘之间进行了交换,以避免浪费.

The

段是信息的逻辑单元,它可以根据用户需要灵活地划分,因此大小不是固定的,用户看不到,并且提供了二维地址空间.

对于段安来说,我没有找到更好的信息,所以我并不清楚. 互联网上的许多文章互相抄袭. 据我所知,汇编程序员可以直接操纵段,但是编写高级语言的程序员是否具有用于段操作的相应API?因此,我真的不了解Duan的相关知识,想知道的学生可以在消息区域提出批评或留下相关文章的链接. 我将在以后添加此博客. 谢谢

熟悉Linux的学生应该知道Linux具有交换分区. 交换空间的作用可以简单地描述为: 当系统的物理内存不足时,需要释放物理内存中的一部分空间以供当前运行的程序使用. 释放的空间可能来自长时间未运行的某些程序. 释放空间中的信息被临时保存在交换空间中. 当要运行这些程序时,保存的数据将从“交换”恢复到内存. in. 系统总是在物理内存不足时进行交换.

您的计算机上已打开音乐播放器,但未播放歌曲. 然后,几天没有关闭手机,也没有关闭音乐播放器. 随着越来越多的程序在运行,内存正在耗尽. 因此,操作系统选择将此音乐播放器的内存状态(包括堆栈状态等)写入磁盘上的交换区域以进行存储. 这样可以为其他需要运行的程序释放一些内存. 您什么时候想听这首歌,发现了此音乐播放器程序的操作. 此时,系统将从磁盘交换区域中重新读取音乐播放器的相关信息,然后将其发送回内存,然后运行.

在窗口下也起作用的硬盘空间是用户不可见的匿名磁盘空间(在C驱动器上).

硬盘上的交换交换区实际上等效于承担内存的作用(只是速度很慢). 交换区具有扩展内存的作用. 因此从某种意义上讲,交换区域也可以称为虚拟内存,但是该虚拟内存是文字的. 本文不是从计算机系统的角度解释虚拟内存的概念. 因此,请特别注意这一点. 因为有些人了解虚拟内存是交换交互的区域. 该虚拟内存不是其他虚拟内存,因此请了解它们各自的概念和功能. 否则,与他人讨论虚拟内存时,可能会出现驴头不正确的情况.

在Linux环境中,它称为交换分区. 窗口下的该区域不称为交换分区. 从字面上看,它直接称为“虚拟内存”. 因此,读者必须理解具有不同含义的两个虚拟记忆.

关于虚拟内存,我阅读了百度百科的内容,有些地方比较混乱,有些地方正确,但是有些地方解释了交换分区的内容. 如果从字面上看,交换区域的确可以称为虚拟内存,但是该虚拟内存不是另一个虚拟内存. 百度百科关于这一点的介绍比较混乱. 百度百科具有更多的内容,但是如果不区分这一点,它将变得越来越混乱. 我再次检查了维基百科的内容,条目内容不长,但是以下段落很重要.

注意: 虚拟内存不仅仅意味着“用磁盘空间扩展物理内存”,它还扩展了内存级别以包括硬盘驱动器. 将内存扩展到磁盘仅仅是使用虚拟内存技术的结果,它的效果也可以通过将所有非活动程序及其数据覆盖或交换到磁盘来实现. 虚拟内存的定义基于地址空间的重新定义,也就是说,地址空间被定义为“连续的虚拟内存地址”,以便“欺骗”程序,以便他们认为自己使用的是“连续”地址.

所以我认为百度百科的解释令人困惑,维基百科应该是正确的.

写了两篇有关内存的文章. 因为我的才华很浅,所以如果理解上有误或解释不清,希望读者能受到批评.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-164889-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 王君
        王君

        另一方面要通过实际行动向美国表达坚决的意志

      • 白展鹏
        白展鹏

        居然喪失了聯網能力

      热点图片
      拼命载入中...