目录

我们进程使用的地址不是物理地址,而是虚拟地址(线性地址)
所有的语言,如果有“地址”的概念,这个地址一定不是物理地址,而是虚拟地址
堆申请的字节比设置的大,叫做cookie,保存申请的属性,所以free只要传入起始地址就行
结论只在linux下有效,因为windows平台为了安全,可能会使堆栈地址不严格按照规律进行
- #include
- #include
-
- int val = 0;
-
- int main()
- {
- int ret = fork(); //创建父子进程
- if(ret == 0)
- {
- val = 100; //修改全局变量
- printf("i am child,pid:%d,val:%d,valaddress:%p\n",getpid(),val,&val);
- }
- else
- {
- sleep(3);
- printf("i am parent,pid:%d,val:%d,valaddress:%p\n",getpid(),val,&val);
- }
- return 0;
- }

我们发现val的地址都在同一区域,但是他们的val值却不一样
这说明了我们所看到的的并不是物理地址,而是虚拟地址
fork系统调用通过复制父进程创建一个子进程,父子进程数据独有,代码共享(在数据不发生改变的情况下父子进程资源指向同一块物理内存空间,假如数据发生变化就会产生写时拷贝,指向不同物理内存

计算机通过页表来记录虚拟地址和物理地址,然后计算机通过页表的映射,通过虚拟地址找到物理地址,来进行变量的调用
当我们代码在编译的时候,就已经被赋予了虚拟地址