吃透进程地址空间,理清OS内存管理机制

Linux进程地址空间与页表详解

在这里插入图片描述

在这里插入图片描述

一、前言

Hello,大家好。本文要给大家带来的是有关Linux中的进程地址空间的讲解

  • 首先我们来看着一张图,相信有学习过 C/C++内存管理 的同学一定可以清楚下面的这张图。知道内存中划分了很多的区域,包括 栈区、堆区、静态区、只读常量区、代码段、共享区等等
  • 但是呢却不知道为什么要存在这样一个分布?以及为什么要这样来分布?

在这里插入图片描述
💬 在本文中我将会带大家去理解一下这个进程地址空间

二、细说进程地址空间

1、一段测试的代码

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <assert.h>
  4 
  5 int g_val = 100;    // 全局变量
  6 
  7 int main(void)
  8 {
   
   
  9     pid_t id = fork();
 10     assert(id >= 0);
 11     while(1)
 12     {
   
   
 13         if(id == 0)
 14         {
   
   
 15             // child
 16             printf("我是子进程,我的id是:%d, 我的父进程是:%d, g_val = %d, &g_val = %p\n",     getpid(), getppid(), g_val, &g_val);
 17             sleep(1);
 18         }                                                                                   
 19         else
 20         {
   
      
 21             // father
 22             printf("我是父进程,我的id是:%d, 我的父进程是:%d, g_val = %d, &g_val = %p\n",     getpid(), getppid(), g_val, &g_val);                                                         23             sleep(2);               
 24         }            
 25     }    
 26     return 0;
 27 }  
  • 然后我们来看执行的结果,可以发现因为fork()的原因,在返回结果的时候进行了分流,继而父子进程所在的分支就都被执行了,因为父子进程所访问的都是同一个全局变量,所以我们所看到打印出来的结果的值都是一样的,而且地址也都是一样的

在这里插入图片描述

那现在我对上面的代码做一个小小的修改~

  • 在子进程内部我们去修改一下这个g_val的值
if</
评论 36
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

烽起黎明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值