目录
一,虚拟地址
二,进程地址空间
一,虚拟地址
#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负责将虚拟地址转化为物理地址;
二,进程地址空间