C/C++ 程序虚拟地址空间
把程序的虚拟地址空间分成两部分,运行也分为两种状态:
1、用户空间(3G) <> 用户态
2、内核空间(1G) <> 内核态
#include <stdio.h>
#include <unistd.h>
int g_count = 100;
int main()
{
pid_t ret = fork();
if (ret > 0)
printf("father: %d, %p\n", g_count, &g_count);
else if (0 == ret)
printf("child: %d, %p\n", g_count, &g_count);
return 0;
}
打印结果
#include <stdio.h>
#include <unistd.h>
int g_count = 100;
int main()
{
pid_t ret = fork();
if (ret > 0)
{
sleep(1); //先让子进程执行
printf("father: %d, %p\n", g_count, &g_count);
}
else if (0 == ret)
{
g_count = 200;
printf("child: %d, %p\n", g_count, &g_count);
}
return 0;
}
打印结果
通过该示例得出以下结论:
值不同,说明父子进程输出的绝不是同一个变量,地址相同,说明该地址绝不是物理地址!而是由操作系统封装出来的一层虚拟地址,也就是说物理地址对用户来讲是不可见的,由 OS 负责虚拟地址和物理地址间的转换
进程虚拟地址空间
“程序虚拟地址空间”其实是不准确的,准确的应该说成是“进程虚拟地址空间”
上图就足以证明同一个变量,地址相同其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址上