【Linux】进程地址空间

文章目录

从下面的图片和代码当中可以看出子进程对全局变量进行修改,而父进程的值却没有变,这也就说明进程具有独立性,两个值互相并不影响是使用写实拷贝的原因。
它们的值不行同,但地址确是相同的,如果这个地址是物理地址的话是不可能的,所以这里表面使用的是虚拟地址或线性地址。

在这里插入图片描述
在这里插入图片描述

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<assert.h>
  4 
  5 
  6 int a=100;
  7 int main()
  8 {
  9   pid_t pt=fork();
 10   while(1)
 11   {
 12     assert(pt>=0);
 13     if(pt==0)
 14     {
 15       printf("我是子进程,pid是%d,ppid是%d,全局变量的值是%d,地址是%p\n",getpid(),getppid(),a,&a);
 16       a++;
 17       sleep(1);
 18     }
 19     if(pt>0)
 20     {
 21 
 22       printf("我是父进程,pid是%d,ppid是%d,全局变量的值是%d,地址是%p\n",getpid(),getppid(),a,&a);
 23       sleep(1);                                                                                                                                                                              
 24     }
 25 
 26   }
 27 }


==============================================================================

在这里插入图片描述

在进程地址空间的这个结构体中所限制的区域,就是虚拟地址或者线性地址
pcb和地址空间之间的交互是通过虚拟地址交互的,页表的作用就是将虚拟地址映射到物理地址上。

在这里插入图片描述

下面的图片也就证实了,为什么一个地址可以有两个值,通过这个也可以理解为什么创建子进程的时候会有两个pid,原因就是在函数返回前都已经执行完了,子进程也是创建好了,之后就是谁先返回,谁就让OS发生写实拷贝。
在这里插入图片描述

如果没有虚拟地址,计算机是如何工作的

这样会因为野指针问题和越界问题导致计算机工作出错,而有了虚拟地址,多了个软件层,需要先进行页表映射,就会多了层保障,虽然用了虚拟地址,但是并不能保证就不会出错。但是已经变得安全多了。
I
在之前C语言当中,char* str=“hello”;是不可修改的,原因也就是在地址映射的时候权限是只读的。

在这里插入图片描述
malloc的本质

当OS申请内存时,是申请时就给开辟空间还是需要时在开辟空间?答案是在需要时在开辟空间。
OS是不允许任何一点浪费和不高效的。
当malloc开辟空间时,先将虚拟地址弄出来,物理地址并不开辟空间,这属于缺页中断。当要用时在开辟空间,在这个空挡之间物理地址也是可以给别人开辟空间,这也就说明物理地址开辟空间并不遵循什么规矩。
进程管理内存管理进行解耦合
在这里插入图片描述

在这里插入图片描述

地址空间可以让进程以统一的视角看待代码和数据。
虚拟地址的策略不只会影响OS(就是防止一些野指针和越界),它还会让编译器遵守该规则,编译器当中使用的都是虚拟地址。
CPU读到的数据也是虚拟地址。
当程序还没有加载到内存当中他就有了地址(虚拟地址),后来加载到物理内存当中他就有了两套地址,
在加载到cpu当中,使用的地址是虚拟地址。

在最后可以了解一下ELF格式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值