页表和虚拟地址空间

页表是什么?

先通过程序引出页表

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 int g_val=100;
  5       int main(){
  7         pid_t pid=fork();
  8      if(pid==0){
  9   //child
 10   printf("child[%d]:%d:%p\n",getpid(),g_val,&g_val);
 11           }
 12 
 13      else if(pid>0){
 14        //father
 15        printf("father[%d%d:%p\n",getpid(),g_val,&g_val);
 16                     }
 17      else{
 18       perror("fork");
 19         }
 20    return 0;
 21      }          

这里写图片描述
这张图可能还不足于说明问题,在放图:这里写图片描述
执行结果:这里写图片描述
从上图我们就会有疑问,为什么g_val的地址明明是一样的,为什么子进程的g_val改了而父进程中的g_val还是原值呢?

变量内容不同,那么就不是同一个变量。
变量的地址相同,说明地址不是物理地址。
物理地址用户是看不见的,有os统一管理。
这是因为显示出来的地址并不是物理地址,而是虚拟地址!!!首先引出虚拟地址空间

认识程序地址空间

这里写图片描述

引出页表

这里写图片描述
总结:父进程创建子进程的时候,不仅仅将他的代码拷贝一份,数据写时拷贝的方式来创建子进程,还会拷贝一份页表,页表是从虚拟内存向物理内存映射的桥梁,所以映射过程中g_val对应的物理地址肯定不会是同一块,所以子进程g_val改变不会影响到父进程的g_val。

页表实例应用

解释一下*NULL的后果https://mp.csdn.net/mdeditor/80074749

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值