进程地址空间

本文深入探讨Linux中进程地址空间的概念,包括早期内存分派、分段管理、分页管理和虚拟地址空间。通过实例代码展示父子进程间变量值与地址的关系,揭示虚拟地址的奥秘。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前面我们已经介绍了进程相关的基本概念,错过的童鞋们可以戳这里:
https://blog.youkuaiyun.com/Sun_Life_/article/details/88580785
这篇文章为大家总结一下Linux中进程地址空间相关知识:

进程地址空间

在这之前大家得先明白一个概念:

地址:指向内存区域的一个编号

假设我们有4GB的内存空间,我们不可能为每一个进程都分配满满4个GB的内存空间,所以我们很有必要了解一下内存的基本布局

那么系统到底是如何分配内存的呢?内存分配的方式其实经过了几次演变:

一、早期的内存分派机制

程序运行时之间装入内存,内存空间不够时需要将已运行程序的数据拷贝出来给新的程序,直接在物理内存上操作,不安全,如图:

二、分段管理机制

代码段和数据段地址从0开始,统一由OS映射管理,CPU将内存分段管理,使用虚拟地址,以偏移地址来计算,安全性高。程序运行地址确定,越界易判断,但没有解决性能问题,如图:

三、分页管理+虚拟地址空间

在之前的基础上采用页表进行分页管理,以及写实拷贝技术,大大提高了安全性和性能,如图:

虚拟地址空间mm_struct结构体中的结构及关系:

如上的分页管理+虚拟地址空间我们可以用如下代码来验证:

父进程创建一个子进程,父子进程分别打印自己的pid、value值、value地址

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

int value = 0;
 
int main()
{
  pid_t pid = fork();
  if(pid < 0){
      perror("fork");
      exit(1);
  }
  else if(pid == 0){//child
      printf("I am child: %d, value = %d, %p\n", getpid(), value, &value);
  }
  else{ //parent
      printf("I am parent: %d, value = %d, %p\n", getpid(), value, &value);
  }
  sleep(1);
  return 0;
}

结果发现父子进程打印的变量值和地址都相同,因为子进程并未对变量进行任何修改,我们在修改上述代码,在子进程中将value值改为10,再次运行:

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

int value = 0;

int main()
{
    pid_t pid = fork();
    if(pid < 0){
        perror("fork");
        exit(1);
    }
    else if(pid == 0){//child
        value = 10;
        printf("I am child: %d, value = %d, %p\n", getpid(), value, &value);
    }
    else{ //parent
        printf("I am parent: %d, value = %d, %p\n", getpid(), value, &value);
    }                                                                       
    sleep(1);
    return 0;
}

子进程中的value值已经被修改了,但是父子进程中value的地址却相同,所以:父子进程中的value不是同一个变量,但是地址一样,所以这个地址肯定不是物理地址,而是我们上面讲到的虚拟地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值