【Linux】---进程地址空间

news2025/7/19 21:01:01

文章目录

  • 什么是进程地址
    • 写时拷贝
  • 为什么要有进程地址
    • 为了保护物理内存
    • 更方便进行进程和进程数据的解耦
    • 统一视角
  • 操作系统怎么管理进程地址
    • 区域划分

在之前学习C/C++的时候都会提到 地址这个概念,我们写代码时创建变量,定义函数等都会有其对应的地址空间。而地址空间也会有着各个区域的分布,例如:栈区、堆区、常量区等等。

image-20221125170414249

那么我们之前所谈的这些地址空间是不是内存的空间呢,现在来写一段代码验证一下

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

int value = 100;

int main(){
  pid_t id = fork();
  if(id < 0)
    return 1;
  else if(id == 0){
    int cnt = 0;
    while(1){
      printf("我是子进程,pid:%d,ppid:%d | value:%d,&value:%p\n", getpid(),getppid(),value, &value);
      sleep(1);
      cnt++;
      if(cnt == 10){
        value = 300;
        printf("子进程已经更改了全局变量\n");
      }    
    }
  }
  else{
    while(1){
      printf("我是父进程,pid:%d,ppid:%d | value:%d,&value:%p\n", getpid(),getppid(),value, &value);
      sleep(2);
    }
  }
  return 0;
}

以上代码,按照正常来看,如果子进程将全局变量value改变之后,那么接下来不管是子进程还是父进程打印value的值都应该是改变之后的值。接下来运行程序看看效果

image-20221125171116641

问题出现了,为什么子进程改变了变量值之后,父进程打印该变量的值没有改变,并且他们打印出变量的地址都是一样的。这也就说明不同的进程在运行的时候指向的根本就不是同一块地址空间,也就是说他们指向的就不是内存的物理地址空间,那么他们指向的是什么呢?这就是我们接下来要学习的—虚拟地址空间(进程地址空间)

什么是进程地址

通俗的理解一下虚拟地址

每一个进程在运行的时候都是会以为自己独占了整个系统资源,但其实并不是这样的。进程所占的地址空间是操作系统给它们创建出来的空间,这就是虚拟地址空间。操作系统最后都会将进程所使用的虚拟地址空间通过页表映射到物理空间上从而找到对应的虚拟地址。

所以对于我们平常写程序而言,我们所使用的都是虚拟地址

有了这各认知之后,我们再去思考上面的问题,为什么两个进程打印出来的地址相同,值却不同

根据进程独立性的性质,可以知道子进程和父进程是两个相互独立的进程,也就是说它们之间做的任何事情都是互不干扰的。因为子进程是父进程创建出来的,所以子进程的地址空间是由父进程拷贝出来的,因此在子进程还未改变变量值之前我们看到的是同样的地址和同样的值

也就是说,父子两进程一开始通过页表映射到物理地址时所指向的是同一块的空间。随后当子进程去修改空间的值时,操作系统为了确保进程之间的独立性,会自动进行写时拷贝,重新开辟一块空间并把子进程修改后的变量值写入到该空间,随后子进程通过页表映射到物理地址中指向的就不再是原来的空间了,而是新开辟的这块空间。

因此为什么我们看到的是两个进程打印出来的值不一样。因为程序中打印地址打印的是虚拟地址空间,所以我们看到两个进程打印出来的地址是一样的。

下面来看看图解

未发生改变前:

image-20221125174153383

发生改变后:

image-20221125174223933

写时拷贝

对于写时拷贝是操作系统自动处理的一个流程

在数据第一次写入到某个存储位置时,首先将原有内容拷贝出来,写到另一位置处,然后再将数据写入到存储设备中,该技术只拷贝在拷贝初始化开始之后修改过的数据

为什么要有进程地址

主要分为三个方面来考虑

为了保护物理内存

如果让进程直接的去访问物理内存,那假如进程干一些“非法”的操作,例如越界访问等,那物理内存就直接崩溃了。就跟我们的shell命令外壳一样都是为了起到保护作用

更方便进行进程和进程数据的解耦

因为进程时具有独立性的,有了进程地址空间后,进程之间的数据就不会互相干扰确保了进程的独立性

统一视角

进程地址空间可以让进程以统一的视角去看待进程对应的代码和数据等各个区域,同时也方便使用的编译器也已统一的视角进行编译

操作系统怎么管理进程地址

谈到管理那肯定是统一的先描述,在组织。操作系统的本身会存在着大量的进程,为了管理这些进程,操作系统会使用内核数据结构去对每一个进程管理。进程的地址空间实际上是操作系统内核的一种mm_struct的数据结构,操作系统会为每一个进程创建一个mm_struct对象。

下面来看看关于mm_struct的代码

image-20221125180758926

image-20221125180951283

区域划分

对于空间里的区域划分,是结构体里的变量去决定的

struct mm_struct{
    uint32_t code_start,code_end;
    uint32_t data_start,data_end;
    uint32_t heap_start,heap_end;
    uint32_t stack_start,stack_end;
}

end - start就是这块区域的大小,所以例如我们利用new开辟一块在堆上的空间,其实就是在调整堆区域对应的end值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

成为数字游民,他们为何「All in Web3」?

成为数字游民&#xff0c;他们为何「All in Web3」&#xff1f; “早上好&#xff0c;夜之城。” 赛博朋克承载着一代人对未来世界的遐想。今年上映的「赛博朋克&#xff1a;边缘行者」中&#xff0c;主人公大卫面临着不夜城旧有制度的高压和控制&#xff0c;对旧有秩序不断发…

C++STL-string类的实现(下)

文章目录1. 流插入和流提取1.1 流插入1.2 流提取2. 现代写法的拷贝构造和赋值函数2.1 现代写法的拷贝构造2.1 现代写法的赋值函数3. string类的迭代器实现3.1 正向迭代器1. 流插入和流提取 1.1 流插入 可能有的同学会这样去写&#xff1a;以一个字符串形式来输出。还有的人会这…

《CTFshow - Web入门》03. Web 21~30

Web 21~30web21知识点题解web22知识点题解web23知识点题解web24知识点题解web25知识点题解web26知识点题解web27知识点题解web28知识点题解web29知识点题解web30知识点题解web21 知识点 tomcat 认证爆破burpsuite暴力破解&#xff08;Sniper&#xff09;之custom iterator使用…

用Numba:一行代码将Python程序运行速度提升100倍

用Numba&#xff1a;一行代码将Python程序运行速度提升100倍 在《用PyPy加速Python程序》中我们看到&#xff0c;PyPy通过JIT技术可以将Python的运行速度平均提高3-4倍。但即便是提升后&#xff0c;Python的执行速度依然无法与C/C/Rust同日而语。并且PyPy对Python程序的优化对…

【计算机毕业设计】33.快递取件预约系统源码

一、系统截图&#xff08;需要演示视频可以私聊 摘 要 本论文主要论述了如何使用JSP技术开发一个快递取件预约系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论…

GEO振弦式钢筋计适用范围

适用范围 钢筋计&#xff1a;用于监测岩土工程混凝土建筑物的应力&#xff0c;适用于长期埋设在水工建筑物或其他建 筑物内部&#xff0c;测量结构物内部的钢筋应力。 锚杆应力计&#xff1a;钢筋计用于测量锚杆应力时&#xff0c;成为锚杆应力计。装上锚杆应力计的锚杆称…

Flink部署之Yarn

Flink部署之Yarn 一、环境准备 1、Flink 是一个分布式的流处理框架&#xff0c;所以实际应用一般都需要搭建集群环境。 需要准备 3 台 Linux 机器。具体要求如下&#xff1a; 系统环境为 CentOS 7.5 版本。安装 Java 8。安装 Hadoop 集群&#xff0c;Hadoop 建议选择 Hadoop…

ORB-SLAM2 ---- Tracking::TrackReferenceKeyFrame函数

目录 1.函数作用 2.步骤 3.code 4.函数解析 4.1 将当前帧的描述子转化为BoW向量 4.2 总体解释 1.函数作用 用参考关键帧的地图点来对当前普通帧进行跟踪。 2.步骤 Step 1&#xff1a;将当前普通帧的描述子转化为BoW向量 Step 2&#xff1a;通过词袋BoW加速当前帧与参考帧…

PG::Covfefe

nmap -Pn -p- -T4 --min-rate1000 192.168.205.10 nmap -Pn -p 22,80,31337 -sCV 192.168.205.10 先查看31337端口的robots.txt目录&#xff0c;几个隐藏文件未发现可利用的地方 dirb对31337路径的枚举中发现了.ssh 访问后发现存在私钥 下载id_rsa和id_rsa.pub 得知用户名为…

Vscode-Git graph怎么看?

VScode可以使用插件查看git提交图谱&#xff0c;这个图谱看起来眼花缭乱&#xff0c;今天花时间看懂了&#xff0c;在这里分享一下。 在Vscode插件中搜索git graph安装 打开git项目&#xff0c;在左下角可以看到git graph 在右侧可以看到按照时间分布的commit&#xff0c;代表…

Java JSP JAVAweb在线考试系统源码网上考试系统源码(ssm考试管理系统)

JSP在线考试系统源码网上考试系统源码&#xff08;ssm考试管理系统&#xff09;

PLC中ST编程的IF判断

如果判断条件是如果...否则...的时候&#xff1b; 如果wData的值是16进制的FFFF&#xff0c;十进制的65535&#xff1b;就执行IF中的语句&#xff0c;否则就执行ELSE中的&#xff1b; 当wData的值为0时&#xff0c;因不符合IF的判断条件&#xff0c;执行了ELSE中的语句&#x…

MySQL索引底层数据结构

索引简介 索引是一个排好序的数据结构&#xff0c;包含着对数据表里所有记录的引用指针&#xff0c;如下图所示。索引文件和数据文件一样都存储在磁盘中&#xff0c;数据库索引的目的是在检索数据库时&#xff0c;减少磁盘读取次数。 常见的索引数据结构包括二叉树、红黑树、…

node多版本控制

今天遇到一个问题&#xff1a; 下载了一个vue项目&#xff0c;一直卡在npm install阶段&#xff0c;折腾了半天&#xff0c;发现是版本太高了&#xff0c;需要降低一下版本&#xff0c;但是其他项目需要高版本的&#xff0c;这不就冲突了&#xff1b; 找到了一个node多版本控制…

基于SSM的亲子活动平台的搭建与实现(源码+数据脚本+论文+技术文档)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

葡萄糖-聚乙二醇-刀豆球蛋白A,ConcanavalinA-PEG-Glucose

葡萄糖-聚乙二醇-刀豆球蛋白A&#xff0c;ConcanavalinA-PEG-Glucose 中文名称&#xff1a;葡萄糖-刀豆球蛋白A 英文名称&#xff1a;Glucose-ConcanavalinA 别称&#xff1a;刀豆球蛋白A修饰葡萄糖&#xff0c;ConA-葡萄糖 存储条件&#xff1a;-20C&#xff0c;避光&…

数据结构复习题

数据结构课程复习纲要 核心知识点 从数据结构的逻辑结构、存储结构和数据的运算三个方面去掌握线性表、栈、队列、串、数据、广义表、数和图等常用的数据结构。掌握在各种常用的数据结构上实现的排序和查找运算。对算法的时间和空间复杂度有一定的分析能力。针对简单的应用问…

Python:每日一题之四平方和

题目描述 四平方和定理&#xff0c;又称为拉格朗日定理&#xff1a; 每个正整数都可以表示为至多 4 个正整数的平方和。 如果把 0 包括进去&#xff0c;就正好可以表示为 4 个数的平方和。 比如&#xff1a; 5 0^2 0^2 1^2 2^2&#xff1b; 7 1^2 1^2 1^2 2^2&am…

CF385D Bear and Floodlight

题意简述&#xff08;翻译&#xff09; 在平面直角坐标系上&#xff0c;沿直线从 (l,0)(l,0)(l,0) 走到 (r,0)(r,0)(r,0) 。有 nnn 盏灯&#xff0c;第 iii 盏灯位于 (xi,yi)(x_i,y_i)(xi​,yi​) &#xff0c;可以照亮的角度为 aia_iai​ &#xff08;注意不是弧度制&#xf…

浅尝辄止:数据库--数仓大数据平台--数据中台

很久没有更新博客了&#xff0c;今天主要是想谈一谈自己工作几年总结的心得。 1.浅尝辄止 数据库&#xff1a;基于mysql&#xff0c;oracle来实现数据库分析&#xff08;存储在数据库&#xff0c;使用数据库语言直接分析&#xff0c;最后成报表形式&#xff09;。 数仓&大…