虚拟内存

虚拟内存


一、起源

我们先看看以前的“虚拟内存”,哈哈,其实以前是没有“虚拟内存”这个东西存在的;我们扒一下他们的历史:
先讲一个故事:
一间办公室,只有一个工位可以使用,也就是意味着,每次只能有一个人能办公,其他人想要办公部就的排队,等待;随后,在办公间设立了很多的工位,每一个工位对应一个地址,每个人根据自己的编号找到自己的工位地址,这样大大的提升了效率,而且互补干扰;
同理,我们的虚拟内存也是一样的;
在没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G的物理
产生的问题:

  • 物理内存是有限的,当多个进程需要同时运行的时候,就会出现需要多个4G内存的情况,如果不够,则进程需要等待,就比如我们上面说的办公室一样;
  • 由于是直接访问物理内存的,所以进程中的内存是可以被修改的,不安全也不合理;

二、进程资源分配

一个进程,它在被执行前其实是一个可执行程序。这个程序是被放在磁盘上的,当它要被执行的时候,它先被加载到内存当中,然后再放入到寄存器中,最后再让cpu执行该程序,这个时候一个静态的程序就变成了进程。
每个进程运行的时候,都会拿到4G的虚拟内存,在32位Linux下,其中3G是交给用户的,1G是交给内核的,而task_struct就是存储在这1G的内核系统空间中。

  • 每个进程都有各自的私有用户空间(0-3G),这个空间对系统中的其他进程是不可见的。
  • 最高的1GB内核空间则为所有进程以及内核所共享。
  • 这个1G的内核空间,是因为进程需要调用一些系统调用,来交给内核跑,程序的一部分逻辑可能是要交给内核去跑的,所以一部分虚拟地址必须要留给内核使用。
  • 虚拟地址空间, 其实就是用户空间。

在这里插入图片描述


三、进程访问地址过程

1. 每个进程的4G内存空间只是虚拟内存空间,每次访问内存空间的某个地址,都需要把地址翻译为实际物理内存地址
2. 所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。

3. 进程要知道哪些内存地址上的数据在物理内存上,哪些不在,还有在物理内存上的哪里,需要用页表来记录
4.页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址(如果在的话)
5. 当进程访问某个虚拟地址,去看页表,如果发现对应的数据不在物理内存中,则缺页异常
6.缺页异常的处理过程,就是把进程需要的数据从磁盘上拷贝到物理内存中,如果内存已经满了,没有空地方了,那就找一个页覆盖,当然如果被覆盖的页曾经被修改过,需要将此页写回磁盘、

在这里插入图片描述
在这里插入图片描述

四、虚拟内存的优点

应用虚拟内存机制有很多优点:

1.既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处
2.当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存
3.在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片


想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:C++后台服务器开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值