【Linux杂货铺】3.程序地址空间

news2024/12/28 15:00:17

1.程序地址空间的引入

        fork()函数在调用的时候子如果是子进程则返回0,如果是父进程则返回子进程的pid,在代码中我们分别在子进程和父进程读取全局变量g_val的时候居然出现了俩个不同的值。如下:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int g_val = 0;
int main()
{
  pid_t id = fork();
  if(id == 0)
  {
    g_val = 100
    int i = 5;
    while(i--)
    {
      printf("我是子进程,g_val值为:%d,g_val的地址:%p\n",g_val,&g_val);
      sleep(1);
    }
  }
  else
  {
    int i=5;
    while(i--)
    {
      printf("我是父进程,g_val值为:%d,g_val的地址为:%p\n",g_val,&g_val);
      sleep(1);
    }
  }
  return 0;                                                                                                                        }

执行结果: 

[xvjiyi@hecs-399428 20240712_pragramAddressSpace]$ ./mytest
我是父进程,g_val值为:0,g_val的地址为:0x7ffd52f7b964
我是子进程,g_val值为:100,g_val的地址为:0x7ffd52f7b964
我是父进程,g_val值为:0,g_val的地址为:0x7ffd52f7b964
我是子进程,g_val值为:100,g_val的地址为:0x7ffd52f7b964
我是父进程,g_val值为:0,g_val的地址为:0x7ffd52f7b964
我是子进程,g_val值为:100,g_val的地址为:0x7ffd52f7b964
我是父进程,g_val值为:0,g_val的地址为:0x7ffd52f7b964
我是子进程,g_val值为:100,g_val的地址为:0x7ffd52f7b964
我是父进程,g_val值为:0,g_val的地址为:0x7ffd52f7b964
我是子进程,g_val值为:100,g_val的地址为:0x7ffd52f7b964

         这个时候我们发现明明读取的地址相同为什么会读出俩个不同的值呢?既然读出了俩个值,说明这俩个值存在不同空间里,定然不可能地址相同,唯一的解释就是这个地址不是真实的地址。事实也正是这样,这里读取到的地址是虚拟地址,虚拟地址空间也就是程序地址空间的产物,接下来我们来看程序地址空间,以及虚拟地址的实现机制。

2.程序地址空间

2.1虚拟地址空间介绍

        程序地址空间本质是一个结构体(我们认为是 struct mm_struct),这个结构体记录着不同内存区间的在这个程序地址空间的相对地址(不是真正的物理地址),映射关系如下:

2.2页表

        当进程访问地址的时候访问的是虚拟地址,那我们最终是怎样访问到物理地址的呢?当进程地址空间创立时,操作系统会建立一张页表完成虚拟地址到物理地址的映射,如下:

2.3 子进程父进程访问全局变量出现俩个不同值 

         接下来我们回到开头的问题,为什么我们会在同一个地址上访问到俩个不同的值。这是因为子进程继承了父进程的地址空间,父子进程在访问这个全局变量时访问的虚拟地址是一致的,而这俩个虚拟地址映射的物理地址不同,而我们的数据是存放在物理内存中的,也就造成了同一个地址出现了俩个不同值的假象。(至于为什么会存放在不同的物理内存中在下一节进程控制中给大家讲解,为了确保进程的独立性相互之间不影响,发生了写时拷贝)。

3.扩展

3.1为什么要有地址空间

      如果没有进程地址空间,物理内存就可以被随意访问,可以随意改动不属于自己的空间,系统安全性大大降低。我们有了地址空间有以下优点:

  1. 1.当进程访问到不属于该进程的空间时,操作系统可在页表映射时拒绝进程的访问,有效杜绝了物理地址被随意访问,大大保证了物理内存和其他进程的安全。
  2. 2.将进程管理与内存管理解耦合。
  3. 3.让进程以统一的视角看待自己的代码和数据。

3.2 malloc申请空间的实质

        当进程使用malloc申请空间时,在访问页表的时候操作系统不会给你立马分配物理地址,而会发生缺页中断,在进程需要访问这块空间时才给你分配空间。

3.3程序的加载

        程序编译在加载的时候并不是一股脑全部加载到物理内存中,而是执行多少加载多少,一边执行一边加载。(源代码在被编译时早就将源代码和数据按照程序地址空间的方式完成了编址)

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

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

相关文章

【Linux信号】阻塞信号、信号在内核中的表示、信号集操作函数、sigprocmask、sigpending

我们先来了解一下关于信号的一些常见概念&#xff1a; 实际执行 信号的处理动作 称为信号递达。 信号从产生到递达的之间的状态称为信号未决。 进程可以选择阻塞(Block)某个信号。 被阻塞的信号产生时是处于未决状态的&#xff0c;知道进程解除对该信号的阻塞&#xff0c;该…

01. 课程简介

1. 课程简介 本课程的核心内容可以分为三个部分&#xff0c;分别是需要理解记忆的计算机底层基础&#xff0c;后端通用组件以及需要不断编码练习的数据结构和算法。 计算机底层基础可以包含计算机网络、操作系统、编译原理、计算机组成原理&#xff0c;后两者在面试中出现的频…

FGF14:脑部疾病新潜力靶标

成纤维细胞生长因子14&#xff08;FGF14&#xff09;是FGF11亚家族成员&#xff0c;在神经元的所有基本特性&#xff08;内在放电、兴奋性和抑制性神经元的突触传递和可塑性&#xff09;中发挥作用。 &#xff08;数据来源AlphaFold&#xff09; FGF14由247个氨基酸组成&#x…

一键运行 ComfyUI SD3!大规模医学 VQA 评测数据集上线,涉及超 20 个人体器官和部位

为了进一步推进 AI4S 的普适化&#xff0c;HyperAI超神经策划了「Meet AI4S」系列直播栏目。第一期直播将于 7 月 17 日 19:00 准时上线&#xff01; 我们邀请到了浙江大学遥感与地理信息系统博士生丁佳乐&#xff0c;他的分享主题为「神经网络为房价的空间异质性提供新解释」&…

c# 容器变换

List<Tuple<int, double, bool>> 变为List<Tuple<int, bool>>集合 如果您有一个List<Tuple<int, double, bool>>并且您想要将其转换为一个List<Tuple<int, bool>>集合&#xff0c;忽略double值&#xff0c;您可以使用LINQ的S…

Python函数 之 变量

1.引用【了解】 定义变量的时候, 变量和数据 都会在内存开辟空间 变量所对应的内存空间中存储的是 数据所在内存的地址 (平时理解为 将数据存储到变量中即可) 变量中保存数据的地址,就称为是引用 Python 中所有数据的传递,传递的都是引用(即地址) 赋值运算符(), 会改变变量的引…

全面升级的对象创建——抽象工厂模式(Python实现和JAVA实现)

1. 引言 大家好&#xff01;在之前的文章中&#xff0c;我们探讨了简单工厂和工厂方法模式&#xff1a; 轻松创建对象——简单工厂模式&#xff08;Python实现&#xff09; 轻松创建对象——简单工厂模式&#xff08;Java实现&#xff09; 灵活多变的对象创建——工厂方法模式…

鸿蒙瀑布流和欢迎页(1)

1.瀑布流 https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-waterflow.md他有官网文档&#xff0c;有个瀑布流的案例 自定义一类实现官方瀑布流接口 // WaterFlowDataSource.ets// 实现IDataSource接口的…

开发技术-Java BigDecimal 精度丢失问题

文章目录 1. 背景2. 方法3. 总结 1. 背景 昨天和小伙伴排查一个问题时&#xff0c;发现一个 BigDecimal 精度丢失的问题&#xff0c;即 double a 1.1;BigDecimal ba new BigDecimal(a).subtract(new BigDecimal(0.1));System.out.println(ba);输出&#xff1a; 1.000000000…

做数据线的绿联,怎么做NAS就不灵了?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 姝琦 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 绿联的NAS设备最近频频出问题&#xff0c;从升级系统需要擦除数据&#xff0c;到最近的SSL私钥泄露事件&…

【新书速递】使用MATLAB进行雷达系统分析和设计(第四版)(2022)

来源&#xff1a;公众号高山防务 一、目录 目录 1雷达定义和术语 1.1雷达系统分类和波段 1.1.1高频&#xff08;HF&#xff09;和甚高频&#xff08;VHF&#xff09;雷达&#xff08;A和B波段&#xff09; 1.1.2超高频&#xff08;UHF&#xff09;雷达&#xff08;C波段&am…

如祺出行破发,萝卜快跑走红:网约车平台何去何从?

文&#xff1a;互联网江湖 作者&#xff1a;刘致呈 Robotaxi第一股真的来了&#xff1f; 这两天自动驾驶圈儿热度不断&#xff0c;先是萝卜快跑热搜停不下来&#xff0c;然后广汽旗下网约车平台如祺出行就在港股成功上市。 招股书里&#xff0c;如祺出行自己定义自己是一家“…

机器学习——关于极大似然估计法的一些个人思考(通俗易懂极简版)

最近在回顾机器学习的一些相关理论知识&#xff0c;回顾到极大似然法时&#xff0c;对于极大似然法中的一些公式有些迷糊了&#xff0c;所以本文主要想记录并分享一下个人关于极大似然估计法的一些思考&#xff0c;如果有误&#xff0c;请见谅&#xff0c;欢迎一起前来探讨。当…

昇思25天学习打卡营第9天|MindSpore静态图加速

打卡 目录 打卡 AI编译框架运行模式 动态图模式PyNative 手动控制动态图运行示例-全局context 静态图模式Graph 手动控制静态图运行示例-全局context ​编辑 jit 装饰器加速图编译-例 jit函数变换方式加速图编译-例 jit 加速某个部分的神经网络模块-例 静态图的语法…

基因组、染色体和基因水平上可视化拷贝数变异(CNVs)

1.CNVmap简介 CNVmap是一种用于在基因组、染色体和基因水平上可视化拷贝数变异&#xff08;CNVs&#xff09;的工具。CNVkit和CNVpytor是一种检测全基因组拷贝数变异和变异的软件&#xff0c; 该工具的输入是从CNVkit / CNVpytor工具获得的**.cns和.cnr文件格式**。可用于CNV-…

云动态摘要 2024-07-12

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 数据库上云优选 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系产品新用户低至首年6折起! [免费体验]智能助手ChatBI上线 腾讯云 2024-07-02 基于混元大模型打造,可通过对话方式生成可视化…

基于stm32+小程序开发智能家居门禁系统-硬件-软件实现

视频演示&#xff1a; 基于stm32智能家居门禁系统小程序开发项目 视频还有添加删除卡号&#xff0c;添加删除指纹&#xff0c;关闭继电器电源等没有演示。 代码Git&#xff1a; https://github.com/Abear6666/stm32lock 总体功能&#xff1a; 本门禁系统主要解锁功能分别为卡…

Argo CD入门、实战指南

1. Argo CD概述 1.1 什么是 Argo CD Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。 1.2 为什么选择 Argo CD 应用程序定义、配置和环境应具有声明性并受版本控制。应用程序部署和生命周期管理应自动化、可审计且易于理解。 2. Argo CD基础知识 在有效使用 Ar…

MySQL数据库day7.11

一&#xff0c;SQL概述 1.1 SQL语句语法 MySQL 数据库的 SQL 语句不区分大小写&#xff0c;关键字建议使用大写&#xff0c; 以分号结尾。例如&#xff1a; SELECT * FROM user; 使用 /**/ 、 -- 、 # 的方式完成注释 /* 多行注释 */ -- 单行注释 # 单行注释 SELECT * FRO…

296个地级市GDP相关数据(2000-2023年)

GDP相关数据&#xff1a;衡量地区经济活动的综合指标 国内生产总值&#xff08;GDP&#xff09;是衡量一个国家或地区经济规模和发展水平的核心指标。它反映了在一定时期内&#xff0c;所有常住单位生产活动的最终成果。 GDP的种类及其含义&#xff1a; 名义GDP&#xff1a;按…