进程地址空间

本文探讨了进程地址空间的概念,指出程序中使用的地址为虚拟地址而非物理地址。通过代码示例展示了在Linux环境下,父子进程虽然共享虚拟地址空间,但数据独立。同时,解释了页表在虚拟地址到物理地址映射中的作用,以及编译时虚拟地址的分配。内容着重阐述了操作系统如何管理和使用内存,以及这一过程对程序执行的影响。
摘要由CSDN通过智能技术生成

目录

进程地址空间

代码验证进程地址是虚拟地址

页表和映射


进程地址空间

我们进程使用的地址不是物理地址,而是虚拟地址(线性地址)

所有的语言,如果有“地址”的概念,这个地址一定不是物理地址,而是虚拟地址

申请的字节比设置的大,叫做cookie,保存申请的属性,所以free只要传入起始地址就行

结论只在linux下有效,因为windows平台为了安全,可能会使堆栈地址不严格按照规律进行

代码验证进程地址是虚拟地址

#include<stdio.h>
#include<unistd.h>

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系统调用通过复制父进程创建一个子进程,父子进程数据独有,代码共享(在数据不发生改变的情况下父子进程资源指向同一块物理内存空间,假如数据发生变化就会产生写时拷贝,指向不同物理内存

 

页表和映射

计算机通过页表来记录虚拟地址和物理地址,然后计算机通过页表的映射,通过虚拟地址找到物理地址,来进行变量的调用

当我们代码在编译的时候,就已经被赋予了虚拟地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起慢慢变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值