Linux进程地址空间

首先来段代码

  3#include<iostream>
  4 #include<stdlib.h>
  5 using namespace std;
  6 int g_val=0;
  7 int main()
  8 {
  9   pid_t id=fork();//父进程返回子进程的pid 子进程返回0
 10   //两份进程共有一份代码,写实拷贝
 11   if(id<0)
 12   {
 13     perror("fork()");
 14     return 0;
 15   }
 16   else if(id==0)
 17   {
 18  
 19     //chlid
 20     cout<<"child:"<<getpid()<<":"<<g_val<<":"<<&g_val<<endl;
 21   }else{
 22     //fathr
 23                                               
 24     cout<<"parent:"<<getpid()<<":"<<g_val<<":"<<&g_val<<endl;
 25   }
 26   sleep(1);
 27   return 0;
 28 }

在这里插入图片描述
程序运行发现,输出出来的变量值和地址是一摸一样的,很好理解,因为子进程按照父进程为模板,父子并没有堆变量进程任何修改。
但是改一下代码

  3#include<iostream>
  4 #include<stdlib.h>
  5 using namespace std;
  6 int g_val=0;
  7 int main()
  8 {
  9   pid_t id=fork();//父进程返回子进程的pid 子进程返回0
 10   //两份进程共有一份代码,写实拷贝
 11   if(id<0)
 12   {
 13     perror("fork()");
 14     return 0;
 15   }
 16   else if(id==0)
 17   {
 18  	int g_val=100;
 19     //chlid
 20     cout<<"child:"<<getpid()<<":"<<g_val<<":"<<&g_val<<endl;
 21   }else{
 22     //fathr
 23     sleep(3);                                   
 24     cout<<"parent:"<<getpid()<<":"<<g_val<<":"<<&g_val<<endl;
 25   }
 26   sleep(1);
 27   return 0;
 28 }

在这里插入图片描述
以上代码子进程先跑完,也就是子进程先修改,完成之后,父进程再读取。但结果发现,父子进程,输出地址是一致的,但是变量内存不一样!
得出以下结论

  • 变量内容不一样,所以父子进程输出的变量觉对不是一个变量
  • 但是地址值是一样的,说明改地址绝对不是物理地址
  • 在Linux地址下,这种地址叫做虚拟地址
  • 我们在用c/c++语言所看到的地址,全部是虚拟地址!物理地址用户一概看不到,由OS统一管理,OS必须负责将虚拟地址转换为物理地址
    在这里插入图片描述由图可知,同一个变量,地址相同,其实是虚拟地址相同,内容是通过页表映射到不同的物理地址上!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值