海马玩安卓模拟器-lol皮肤修改器

虚拟内存有什么用
2023年3月31日发(作者:vgaa)

python使⽤虚拟内存_虚拟内存、物理内存

前⼀段时间在⾯试总监的时候,总监问了我这样的⼀个问题:你个我说说物理内存和虚拟内存到底是怎么⼀回事?

其实之前我看过这个问题,据我理解的,当时是这么回答的“进程在运⾏的时候,操作系统都为其分配⼀个4GB的地址空间,即所谓的虚拟

地址空间,⼀般情况下,当我们的程序很⼤的时候,实际的物理内存根本不能满⾜我们的需求的时候,这个时候操作系统就会借助磁盘空间

来做虚拟的内存空间,把当前进程不需要的数据放在磁盘上,等到⽤到的时候,在利⽤调度算法把所需要的数据从磁盘空间上调度到内存,

虚拟内存就是为了扩⼤内存的容量,每当我们要运⾏⼀个程序的时候经过编译以后形成的仅仅是逻辑上的空间,根本不是可以直接运⾏的内

存空间,所以它还存在⼀个地址映射的概念。”当时感觉回答的很是笼统,只见总监在最后说了⼀句,你下去还是把这⼀块的内容在好好看

看,所以今天就好好的把这个概念理⼀理。

⾸先我从最基本的概念说起,什么是物理内存的概念,虚拟内存的概念?

物理内存,在应⽤中,⾃然是顾名思义,物理上,真实的插在板⼦上的内存是多⼤就是多⼤了。⽽在CPU中的概念,物理内存就是CPU的

地址线可以直接进⾏寻址的内存空间⼤⼩。⽐如8086只有20根地址线,那么它的寻址空间就是1MB,我们就说8086能⽀持1MB的物理

内存,及时我们安装了128M的内存条在板⼦上,我们也只能说8086拥有1MB的物理内存空间。同理我们现在⼤部分使⽤的是32位的机

⼦,32位的386以上CPU就可以⽀持最⼤4GB的物理内存空间了。

先说说为什么会有虚拟内存和物理内存的区别。正在运⾏的⼀个进程,他所需的内存是有可能⼤于内存条容量之和的,⽐如你的内存条是

256M,你的程序却要创建⼀个2G的数据区,那么不是所有数据都能⼀起加载到内存(物理内存)中,势必有⼀部分数据要放到其他介质中

(⽐如硬盘),待进程需要访问那部分数据时,在通过调度进⼊物理内存。所以,虚拟内存是进程运⾏时所有内存空间的总和,并且可能有⼀

部分不在物理内存中,⽽物理内存就是我们平时所了解的内存条。有的地⽅呢,也叫这个虚拟内存为内存交换区。关键的是不要把虚拟内存

跟真实的插在主板上的内存条相挂钩,虚拟内存它是“虚拟的”不存在,假的啦,它只是内存管理的⼀种抽象!

那么,什么是虚拟内存地址和物理内存地址呢。假设你的计算机是32位,那么它的地址总线是32位的,也就是它可以寻址

0~0xFFFFFFFF(4G)的地址空间,但如果你的计算机只有256M的物理内存0x~0x0FFFFFFF(256M),同时你的进程产⽣了⼀个不在这

256M地址空间中的地址,那么计算机该如何处理呢?回答这个问题前,先说明计算机的内存分页机制。

计算机会对虚拟内存地址空间(32位为4G)分页产⽣页(page),对物理内存地址空间(假设256M)分页产⽣页帧(pageframe),这个页和页

帧的⼤⼩是⼀样⼤的,所以呢,在这⾥,虚拟内存页的个数势必要⼤于物理内存页帧的个数。在计算机上有⼀个页表(pagetable),就是映

射虚拟内存页到物理内存页的,更确切的说是页号到页帧号的映射,⽽且是⼀对⼀的映射。但是问题来了,虚拟内存页的个数>物理内存页

帧的个数,岂不是有些虚拟内存页的地址永远没有对应的物理内存地址空间?不是的,操作系统是这样处理的。操作系统有个页⾯失效

(pagefault)功能。操作系统找到⼀个最少使⽤的页帧,让他失效,并把它写⼊磁盘,随后把需要访问的页放到页帧中,并修改页表中的映

射,这样就保证所有的页都有被调度的可能了。这就是处理虚拟内存地址到物理内存的步骤。

现在来回答什么是虚拟内存地址和物理内存地址。虚拟内存地址由页号(与页表中的页号关联)和偏移量组成。页号就不必解释了,上⾯已经

说了,页号对应的映射到⼀个页帧。那么,说说偏移量。偏移量就是我上⾯说的页(或者页帧)的⼤⼩,即这个页(或者页帧)到底能存多少数

据。举个例⼦,有⼀个虚拟地址它的页号是4,偏移量是20,那么他的寻址过程是这样的:⾸先到页表中找到页号4对应的页帧号(⽐如为

8),如果页不在内存中,则⽤失效机制调⼊页,否则把页帧号和偏移量传给MMU(CPU的内存管理单元)组成⼀个物理上真正存在的地址,

接着就是访问物理内存中的数据了。总结起来说,虚拟内存地址的⼤⼩是与地址总线位数相关,物理内存地址的⼤⼩跟物理内存条的容量相

关。

阅读(20478)|评论(0)|转发(8)|

更多推荐

虚拟内存有什么用