【Linux】程序地址空间

程序地址空间回顾

  • 首先来看看概念图,有很多同学或多或少都听过图中的内容吧,但我们对他并不是很理解

使用代码来感受一下

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
 pid_t id = fork();
 if(id < 0){
 perror("fork");
 return 0;
 }
 else if(id == 0){ //child
  printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
 }else{ //parent
 printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
 }
 sleep(1);
 return 0;
}
  • 我们发现,输出出来的变量值和地址是一模一样的,很好理解呀,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。可是将代码稍加改动

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    int g_val = 0;
    int main()
    {
    pid_t id = fork();
    if(id < 0){
    perror("fork");
    return 0;
    }
    else if(id == 0){ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
    g_val=100;
    printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
    }else{ //parent
    sleep(3);
    printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
    }
    sleep(1);
    return 0;
    }

  • 我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:
  1. 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量

  2. 但地址值是一样的,说明,该地址绝对不是物理地址!

  3. 在Linux地址下,这种地址叫做虚拟地址

  4. 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理

  5. OS必须负责将 虚拟地址 转化成 物理地址

进程地址空间

  • 所以之前说'程序的地址空间'是不准确的,准确的应该说成'进程地址空间',那该如何理解呢?看图:
  • 上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!

为什么要有地址空间

  • 让进程以统一的视角看待内存。所以任意一个进程都可以通过地址空间+页表使得乱序的内存数据变得有序,分门别类规划好

  • 存在虚拟地址空间可以有哦晓得进行进程访问内存的安全检查

  • 页表的地址是物理地址,而不是虚拟地址

  • 把上下文(PCB、页表、mm_struct等)保存好,就等于将进程保存好了

  • 进程管理因为地址空间和页表的存在能够与内存管理解耦

进程和进程地址空间

  • 每一个进程运行后,都会有一个进程地址空间存在。都要在系统层面有自己的页表映射

  • 写时拷贝发生在物理内存中,由操作系统来做,不会影响上层语言

  • 空间范围:由一个极值到另一个极值,表示能访问地址的范围

  • 地址空间可以理解为操作系统给进程画的饼,它并不是真实的物理地址!

  • 地址空间也需要被操作系统管理起来,每一个进程都要有地址空间。系统中一定要对地址空间做管理

  • 区域划分:在计算机中用结构体来,且结构体中有_start和_end来区分

相关推荐
美狐美颜sdk5 分钟前
什么是美颜SDK?从几何变换到深度学习驱动的美颜算法详解
人工智能·深度学习·算法·美颜sdk·第三方美颜sdk·视频美颜sdk·美颜api
m0_4615026918 分钟前
【贪心算法1】
算法·贪心算法
dxaiofcu18 分钟前
双网卡电脑,IP地址漂移
linux·服务器·网络
Macle_Chen24 分钟前
Mac服务器上创建Docker并安装宝塔环境
服务器·macos·docker
ChinaRainbowSea28 分钟前
Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案
java·linux·运维·服务器·docker·架构
Doopny@33 分钟前
数字组合(信息学奥赛一本通-1291)
数据结构·算法·动态规划
vortex51 小时前
在Kali中使用虚拟环境安装python工具的最佳实践:以 pwncat 为例
linux·python·网络安全·渗透测试·pip·kali
原来是猿1 小时前
蓝桥备赛(13)- 链表和 list(上)
开发语言·数据结构·c++·算法·链表·list
LKAI.1 小时前
MongoDB用户管理和复制组
linux·数据库·mongodb
linux修理工1 小时前
moodle 开源的在线学习管理系统(LMS)部署
linux