虚拟内存

虚拟内存技术
首先,虚拟地址空间的大小是由处理器的位数决定的。比如32位处理器下的虚拟地址空间大小为4G(2^32=4G),32为地址总线的条数。一般4G中并不是所有空间都可以让用户进程读写或者申请使用。用户进程可以使用的虚拟空间为03G。所有用户的34G的空间映像都是一样的,这块空间映像直接对应物理地址,属于内核态空间,用户不可访问,用于运行一些系统调度的进程。

在系统执行或者开启一个进程的时候需要加载到内存中,然后CPU才能执行。但是内存相比于硬盘来说相对很小,当计算机同时开启多个程序时候,如果都加载到内存里,内存是不够的(就拿英雄联盟来说,现在硬盘存储需要十几个G,假设内存4个G(或者8个G),是完全放不进去的,更别提运行别得程序,登个QQ啥的了)。虚拟内存技术,不是吧所要运行的进程的所有数据都加载到内存中,而是按需加载,需要执行这部分就加载进内存。这种做法的可行的原因是局部性原理。因为一个程序的代码,在执行这个程序时,不是一下执行所有的,相反有很多都执行不到,例如一些错误检测,在正常情况下是不会执行的。不过在虚拟存储空间宏观上来看,整个进程都加载到了这个空间中,即映射到虚拟空间。接下来就是将需要执行的部分加载到内存中。

既然加载到了内存中,占用的就是实实在在的物理地址,需要把虚拟地址映射到物理地址。这两个地址,虚拟地址和物理地址的产生都是由一个一个叫存储管理单元(MMU)的硬件部分完成。操作系统会把这两种地址空间都划分成大小相等的若干存储分区。虚拟空间的分区叫页,物理地址的分区叫页框。物理内存和虚拟内存被分成了页框与页之后,其存储单元原来的地址都被自然地分成了两段,并且这两段各自代表着不同的意义:高位段分别叫做页框码和页码,它们是识别页框和页的编码;低位段分别叫做页框偏移量和页内偏移量,它们是存储单元在页框和页内的地址编码。

为了让系统正确映射虚内存到物理内存。必须把页码和存放该页映像的页框填入一个叫页表的表项中,作为映射记录表。这样根据对应的偏移量就在物理内存上找到它的存储位置。即映射成功。

如果处理器访问一个虚拟内存页面,首先去页表查看是否已经映射到了物理内存中,如果在就转换为页框码加上页表中的偏移量去方位该物理地址,如果不在就意味着该虚拟内存页还没有被载入内存,就会通知操作系统:访问发生错误。操作系统首先检查该地址是否有效,如果不存在立即停止此次访问,如果存在就进行映射操作。 但是如果在进行映射操作时已经没有空闲物理页框即内存满了,就要进行交换机制,将当前不再使用或者使用较少的页出,装载新的页;此外需要对移出的页进行判断,如果没有修改直接删除,如果修改了就将它写会硬盘。这里使用的算法是计龄换页算法,即越久没有使用的页越老,交换出老的页。

在计算机中,涉及数据就要用到存储。上面用于存放页和页框信息的页表,本质是一个结构体数组,如果虚拟空间很大,那么需要用来寻访页表的内存也会大,所以还是利用局部性的思想,对页表进行分页存储,吧需要的页复制到内存,剩下的先留在硬盘中,为了管理这些页表,还建立页目录表,也就产生了一级、二级页表。

【Linux】Linux的虚拟内存详解(MMU、页表结构)
操作系统中的虚拟内存详解

不过从这篇博客中Linux 虚拟内存和物理内存的理解,讲到从编程层面来看虚拟内存和物理内存:
在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。

创建进程时,也就是说它相关的数据代码并不是直接就有,进程也不是直接就会出现在物理内存上,只是在页表上建立了映射关系,即已经给它安排了物理地址,但是还不能存到物理地址上去。等到执行才会映射过去。所以以前学习malloc函数时说使用了这个函数后系统会自动分配地址,利用好碎片空间是指在虚拟空间申请地址后与物理空间的碎片地址形成映射关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值