目录
一,虚拟地址
二,进程地址空间
一,虚拟地址
#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
  pid_t id = fork();
  if(id<0)                                                                      
  {
    perror("fork");
    return 0;
  }
  else if(id==0)
  {
    printf("child[%d],g_val=%d,&g_val=%p\n", getpid(),g_val,&g_val);
  }
  else
  {
    printf("parent[%d],g_val=%d,&g_val=%p\n", getpid(),g_val,&g_val);
  }
  return 0;
}
//运行结果,父子进程中变量g_val地址一样;
parent[118812],g_val=0,&g_val=0x601050
child[118813],g_val=0,&g_val=0x601050#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
  pid_t id = fork();
  if(id<0)                                                                      
  {
    perror("fork");
    return 0;
  }
  else if(id==0)
  {
    g_val = 100;
    printf("child[%d],g_val=%d,&g_val=%p\n", getpid(),g_val,&g_val);
  }
  else
  {
    sleep(3); //保证子进程先计算完;
    printf("parent[%d],g_val=%d,&g_val=%p\n", getpid(),g_val,&g_val);
  }
  return 0;
}
//运行结果,父子进程中变量g_val地址仍是一样,但值确不一样;
child[119390],g_val=100,&g_val=0x601058
parent[119389],g_val=0,&g_val=0x601058
由以上两个程序说明
- 变量g_val值不一样,说明父子进程中此变量一定不是同一变量;
- 变量g_val地址一样,说明父子进程中此地址一定不是物理地址;
在Linux中,此地址称为虚拟地址;
- C/C++中所看到的地址,均为虚拟地址;
- 用户是看不到物理地址的,物理地址统一由OS管理;
- OS负责将虚拟地址转化为物理地址;
二,进程地址空间




















