目录

- #include
- 2 #include
- 3 int g_val = 0;
- 4
- 5 int main()
- 6 {
- 7 printf("begin....:%d\n",g_val);
- 8 pid_t id = fork();
- 9 if(id == 0)
- 10 {
- 11 int count = 0;
- 12 while(1)
- 13 {
- 14 printf("child:pid:%d,ppid:%d,[g_val:%d] [&g_val:%p]\n",getpid(),getppid(),g_val,&g_val);
- 15 sleep(1);
- 16 count++;
- 17 if(count == 5)
- 18 {
- 19 g_val = 100;
- 20 }
- 21 }
- 22 }
- 23 else if(id > 0)
- 24 {
- 25 while(1)
- 26 {
- 27 printf("father:pid:%d,ppid:%d,[g_val:%d] [&g_val:%p]\n",getpid(),getppid(),g_val,&g_val);
- 28 sleep(1);
- 29 }
- 30 }
- 31 else{
- 32
- 33 }
- 34 return 0;
- 35 }

==》任何学过的语言里面的地址都不可能是物理地址!由操作系统给我们提供的,且由于数据和代码一定在物理内存上<冯诺依曼>,需要将虚拟地址转化成我们的物理地址!(这里的转化由OS自动完成)
==》所有的程序,都必须运行起来,运行起来之后,该程序立马变成了进程!
所以虚拟地址大概率可能与进程有某种关系?
地址空间本质是进程看待内存的方式,抽象出来的一个概念,内核struct mm_struct,这样的话每个进程都认为自己独占系统内存资源
区域划分本质:将线性地址空间划分为一个个的area,[start,end]
虚拟地址本质:在[strat,end]之间的各个地址

虚拟地址到物理地址的一个转化,由操作系统来完成!
1:保护物理内存,不受到任何进程内的地址的直接访问,方便进行合法性校验
2:将内存管理和进程管理进行解耦
3:让每个进程,以同样的方式,来看待代码和数据
