我是靠谱客的博主 多情云朵,最近开发中收集的这篇文章主要介绍进程的物理地址空间,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一般在Linux下将内存主要划分为已下主要部分,如下图所示,我们知道一个进程的物理空间因该指的是一个进程的活动范围,通过一下代码我i们来观察一下进程中的地址变化。
在这里插入图片描述

#include<stdio.h>
  2 #include<unistd.h>
  3 
  4 int gar_val=100;
  5 
  6 
  7 int main()
  8 {
  9 
 10   pid_t pi=fork();
 11 
 12   if(pi==0)
 13   {
 14   // gar_val=1000;// 这行子进程先不修改变量数据
 15     while(1)
 16     {
 17 
 18       sleep(1);
 19       printf("Child: gar_val:  %d P: %pn",gar_val,&gar_val); 
 20     }
 21   }
 22   else if(pi>0)
 23     {
 24       sleep(1);                                                                                                                                                                                              
 25       while(1)
 26       {
 27         sleep(2);
 28        printf("Parent: gar_val: %d P :%pn", gar_val,&gar_val);
 29        }
 30 
 31     }
 32 
 33   return 0;
 34 
 35 }

程序运行结果:
在这里插入图片描述
从程序中我们可以看到系统调用fork函数创建子进程后,父进程和子进程同时访问变量gar_val,并且父子进程访问变量gar_val的值以及地址变量都相同,是因为子进程是父进程的一份拷贝。但是当我们删除注释的哪一行代码,在子进程中修改gar_var的值程序运行的结果如下
在这里插入图片描述
而这时我们在子进程中修改变量数据后,变量gar_var的值变为1000了,而在父进程变量gar_val的值还是100并且父子进程的变量地址也没有变,这是什么原因造成了同一块地址空间的内容所存储的数据不一样的,这样我们将根据可以看出,变量内容不一样,所以父子进程输出的变量绝对不是同一个变量,但地址值是一样的说明该地址绝对不是物理地址、在Linux地址下,这种地址叫做虚拟地址。
那么什么是地址空间?地址空间是是一种数据结构,又操作系统对每一个进程分配一个地址空间,用来管理每个进程执行代码时对物理内存空间的使用。
为什么要有地址空间呢?是因为如果我们直接访问内存空间,有可能会出现野指针,从而写坏别的进程的数据,导致别的进程奔溃。
那么地址空间是如和运行的?首先我们先回答上面刚出现的问题,由于子进程是父进程的一份拷贝,所以子进程的进程物理地址空间和父进程的物理地址空间一样,由于在子进程更改了gar_var变量,而虚拟地址没有发生变化,所以由操作系统在内存重新开辟一块空间用来存储子进程的数据,同使再由操作系统通过页表完成虚拟和物理地址的转换,所以父子进程的地址空间一样但是他们指向内存的地址是不一样的。
在这里插入图片描述

最后

以上就是多情云朵为你收集整理的进程的物理地址空间的全部内容,希望文章能够帮你解决进程的物理地址空间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(26)

评论列表共有 0 条评论

立即
投稿
返回
顶部