一 . 进程地址空间
上述的空间就是进程地址空间,是内存吗?
二 . 来段代码判断我们语言使用的空间到底是什么?
#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)
{ //child
g_val = 100;
printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
}
else
{ //parent
g_val = 200;
printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
}
sleep(1);
return 0;
}
parent[2995]: 200 : 0x80497d8
child[2996]: 100 : 0x80497d8
我们发现,父子进程,输出地址是一致的,但是变量内容不一样!
由此可知:上述的进程地址空间不是内存空间。
三 . 解释上述情况
内存地址是真实的物理地址,而进程地址空间是虚拟地址。
怎么实现虚拟地址到物理地址的转换的?如何解释父子进程,输出地址是一致的,但是变量内容不一样?
1. 上述的拷贝被称为写时拷贝(数据被修改),发生在物理内存上。
2.写时拷贝由操作系统来做。
3.不影响上层语言。