进程虚拟地址空间

目录

1进程虚拟地址空间

1.1 C语言当中的程序地址空间图(32位操作 系统为例)

2.虚拟地址

2.1奇怪的现象:

2.2进程虚拟地址空间

2.2.1什么是虚拟地址:

2.2.2为什么要有虚拟地址空间

5.页表

5.1页表是如何工作的

5.2如何通过虚拟地址+页表的方式找到具体的物理地址

5.3那么fork创建子进程的时候会不会拷贝页表?

6、内存空闲问题

6.1什么是内存空闲问题

6.2解决办法:离散分配


  • 1进程虚拟地址空间

  • 1.1 C语言当中的程序地址空间图(32位操作 系统为例)

  • 2.虚拟地址

  • 2.1奇怪的现象:

    • 我们先看一个现象我们定义一个全局变量,然后让再创建一个父子进程,分别让父子进程打印全局变量的地址
    • 执行代码可以发现父子进程打印出来的地址一致,我们也可以理解因为是一个全局变量的嘛。但是我们往下看
    • 那么既然是一个全局变量那我们再子进程中修改这个全局变量那么在父进程中打印出来的这个全局变量的值也应该被修改
    • 我们运行代码但是发现只有子进程当中的g_val值被改变,而父进程中的g_val还是原来的值。
    • 我们可以发现他们两个的地址相同,但是打印出来的变量内容竟然不一样,这其实是因为我们看到的他们的地址其实不是真实的物理地址,而是操作系统给我们虚拟出来的虚拟地址 
  • 2.2进程虚拟地址空间

    • 2.2.1什么是虚拟地址:

      • 我们在C/C++语言中所看到的地址都是虚拟地址,物理地址,用户一概看不到,由OS统一管理OS需要负责将程序当中的虚拟地址,转化为物理地址。操作系统为每一个进程都虚拟出来一个4G的虚拟地址的空间(32位操作系统),程序在访问的时候,使用的是虚拟地址进行访问,既然是操作系统虚拟出来的地址,所以不能直接用来存储数据,存储数据皇室在真实的物理内存中。
      • 既然操作系统为每个进程都虚拟出一个4G的内存那我们内存才多少个G,那么多进程我们肯定不能真的为每个进程都虚拟出来4G的真实地址。其实并不是每个虚拟地址都对应一个物理地址,而是说在使用的时候,操作系统才对应一个真实的物理地址。所以我们的程序员只关心我们的虚拟地址就行了,当我们使用虚拟地址时操作系统就会帮我们映射。
  • 2.2.2为什么要有虚拟地址空间

  • 为什么操作系统需要给每一个进程都虚拟出来一个进程 地址空间呢?为啥不直接让进程访问物理内存,这样不是更加快-点
    • 原因1:
      • 因为各个进程访问同一个物理地址空间,就会造成不可控。在有限的内存空间中,进程是不清楚哪-个内存被其他进程使用, 那些内存是空闲的, 没有办法知道。所以,这种场景下,冒昧的使用,一定会导致多个进程在访问物理内存的时候,出现混乱。所以内存由操作系统统一管理起来,但是又不能采用预先直接分配内存的方式, 给进程 。
    • 不能采用直接分配内存的原因:
      • 因为0S也不清楚进程能使用多少内存,使用多久。所以,就虚拟给每一 个进程分配了4G的地址(虚拟地址)当进程真正要要保存数据,或者申请内存的时候,操作虚拟地址,让操作系统在给进程进行分配。这样就比较合理(同时也会节省很多空间,毕竟谁 用才分配真正的物理内存)。每一个进程都无感的使用拿到的虚拟地址,背后就是0S进行 了转换(就是后面说到的页表映射)。
  • 为什么32位操作系统,给进程分配的是 4G的虚拟地址空间?
    • 因为:32为操作系统总共有32根地址线,每 个地址线能模拟的数字为0/1,所以, 最小就是0x00000000,最大就是0xFFFFFFFF。64位同理。
  • 5.页表

  • 5.1、页表是如何工作的

    • 映射关系:
    • 将虚拟地址空间分为一页一页,将物理内存分为一块一块,使用页表将页和块映射起来。
  • 5.2如何通过虚拟地址+页表的方式找到具体的物理地址

    • 虚拟地址=页号+,页内偏移
    • 页号,=虚拟地址/,页的大小
    • 页内偏移=虚拟地址者页的大小
  • 5.3那么fork创建子进程的时候会不会拷贝页表?

    • 会,每个进程都有 自己的页表,子进程最初的页表映射的内容就是来自于父进程,后面子进程在运行的时候,可能就会有不同的映射关系写到自己的页表当中。这也就解释了我们一开始的问题。
  • 6、内存空闲问题

  • 6.1什么是内存空闲问题

    • 就是如果我们的内存连续使用的话,那么假如当一个程序使用完之后要释放时,释放之后下一个程序要使用一个比他大的空间
  • 6.2.解决办法:离散分配

    •  

       看到这里了,如果感觉对你有帮助不如点个赞再走,万分感谢!!!

 

 

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月半木斤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值