背景
操作系统有虚拟显存与数学显存之分。在虚拟显存出现之前,程序轮询用的都是数学地址,因而程序能轮询的范围是有限的,具体程序可以轮询的范围有多大取决于CPU的地址腰线数。诸如在32位平台下,轮询的范围是2^32也就是4G,但是这是固定的,假如没有虚拟显存,且每次开启一个进程都分配下来4G的数学显存,还会出现好多问题:
为了解决上述问题,于是就出现了虚拟显存。
虚拟显存原理及与数学显存的关系
一个进程运行时会被分配4G的虚拟显存。进程有了虚拟显存后,每位进程都觉得自己拥有4G的显存空间,其实这只是每位进程觉得的。但实际上,虚拟显存对应的实际化学显存,可能只对应的分配了一点点的数学显存,实际使用了多少显存,都会对应多少化学显存。
进程得到的这4G虚拟显存是一个连续的地址空间(这也只是进程觉得),而实际上,它的数据是储存在多个数学显存碎片的,还有一部份储存在外部c盘储存器上,在须要时将数据交换进化学显存。
进程开始要访问一个地址,它可能会经历下边的过程
进程每次要访问地址空间上的某一个地址时,都须要把地址翻译为实际化学显存地址。所有进程共享一整块化学显存,每位进程只把自己目前须要访问的虚拟地址空间映射到化学显存上。进程须要晓得什么虚拟显存地址空间上的数据在化学显存上,什么不在(可能这部份储存在c盘上),若在化学显存上存在,则须要进一步晓得数据储存在化学显存上的具体位置,这都须要通过页表来记录。页表的每一个表项分两部份,第一部份记录此页是否在化学显存上,第二部份记录化学显存页的地址(假如在的话)。当进程访问某个虚拟地址的时侯,都会先去看页表,假如发觉对应的数据不在化学显存上,都会发生缺页异常。缺页异常的处理过程,操作系统立刻阻塞该进程,并将硬碟里对应的页换入显存,之后使该进程就绪,假如显存早已满了,没有空地方了,那就找一个页覆盖,至于具体覆盖的那个页,就须要看操作系统的页面置换算法是如何设计的了。
关于虚拟显存与化学显存的联系,下边这张图可以帮助我们巩固。
化学显存与虚拟显存的关系
页表的工作原理如右图
页表工作原理
cpu想访问虚拟地址所在的虚拟页(VP3),依据页表,找出页表中对应的页表项,判定有效位。若有效位为1,则DRMA缓存命中,按照化学页号,找到化学页当中的内容,返回。若有效位为0,则发生缺页异常,调用内核缺页异常处理程序。内核通过页面置换算法选择一个页面作为被覆盖的页面,将该页的内容刷新到c盘空间当中。之后把VP3映射的c盘文件内容缓存到该化学地址对应的页里面。之后将页表项中的有效位弄成1,第二部份储存了对应的数学显存也的地址。缺页异常处理完毕后,返回中断前的指令,重新执行,此时缓存命中,执行1。将找到的内容映射到高速缓存当中,CPU从高速缓存中获取该值,结束。总结
当每位进程创建的时侯,内核会为进程分配4G的虚拟显存,当进程还没有开始运行时,这只是一个显存布局。实际上并不立刻就把虚拟显存对应位置的程序数据和代码(例如.text.data段)拷贝到化学显存中,只是构建好虚拟显存和c盘文件之间的映射关系(称作储存器映射)。这个时侯数据和代码还是在c盘上的。当运行到对应的程序时,进程去访问页表,发觉页表中地址没有储存在化学显存上,而是在c盘上,于是发生缺页异常,于是将c盘上的数据拷贝到化学内存中。
另外在进程运行过程中,通过来动态分配显存时,也只是分配了虚拟显存,即为这块虚拟显存对应的页表项做相应设置,当进程真正访问到此数据时,才引起缺页异常。
可以觉得虚拟空间都被映射到了c盘空间中(事实上也是按须要映射到c盘空间上什么是物理内存和虚拟内存,通过mmap,mmap是拿来构建虚拟空间和c盘空间的映射关系的)
价值
既然每位进程的显存空间都是一致但是固定的(32位平台下都是4G),所以链接器在链接可执行文件时,可以设定显存地址什么是物理内存和虚拟内存,而不用去管这种数据最终实际显存地址,这交给内核来完成实际映射关系。
当不同的进程使用同一段代码时,例如库文件的代码,在化学显存中可以只储存一份这样的代码,不同进程只要将自己的虚拟显存映射过去就好了,这样可以节约化学显存。
在程序须要分配连续空间的时侯,只须要在虚拟显存分配连续空间,由操作系统手动完成连续的虚拟化学显存地址到分散的化学显存地址的映射,这样就可以有效的借助碎片化的化学显存。
参考与借鉴
