页表是什么?
先通过程序引出页表
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 int g_val=100;
5 int main(){
7 pid_t pid=fork();
8 if(pid==0){
9 //child
10 printf("child[%d]:%d:%p\n",getpid(),g_val,&g_val);
11 }
12
13 else if(pid>0){
14 //father
15 printf("father[%d%d:%p\n",getpid(),g_val,&g_val);
16 }
17 else{
18 perror("fork");
19 }
20 return 0;
21 }
这张图可能还不足于说明问题,在放图:
执行结果:
从上图我们就会有疑问,为什么g_val的地址明明是一样的,为什么子进程的g_val改了而父进程中的g_val还是原值呢?
变量内容不同,那么就不是同一个变量。
变量的地址相同,说明地址不是物理地址。
物理地址用户是看不见的,有os统一管理。
这是因为显示出来的地址并不是物理地址,而是虚拟地址!!!首先引出虚拟地址空间
认识程序地址空间
引出页表
总结:父进程创建子进程的时候,不仅仅将他的代码拷贝一份,数据写时拷贝的方式来创建子进程,还会拷贝一份页表,页表是从虚拟内存向物理内存映射的桥梁,所以映射过程中g_val对应的物理地址肯定不会是同一块,所以子进程g_val改变不会影响到父进程的g_val。
页表实例应用
解释一下*NULL的后果https://mp.csdn.net/mdeditor/80074749