进程地址空间详解

news2025/7/26 7:56:06

文章目录

  • 空间布局图
    • 首先有一个问题,我们曾经学过的程序地址空间是内存吗???
  • 为什么fork()会返回两个值
  • 先来看一下一个代码的现象
    • 在这里插入图片描述
    • 在C/C++中我们看到的地址是物理地址吗?
    • 为什么操作系统不让我直接看到物理内存呢?
  • 什么是进程地址空间
  • 理解进程地址空间


空间布局图

在这里插入图片描述

首先有一个问题,我们曾经学过的程序地址空间是内存吗???

答案是 它不是内存!!!
程序地址空间的说法都不太准确,应该叫做进程地址空间!

所以对于进程地址空间是属于操作系统的概念!我们当时学C语言的时候对这部分只是有了一个浅浅的认识,方便我们的理解!

其实程序地址空间其实叫做进程地址空间,而进程是操作系统上的概念。因此,进程地址空间分为如上图所示的几个部分:

栈区(stack): 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这 >些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
堆区(heap): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。分配方式类似于链表。
数据段(静态区) ( static ) :存放全局变量、静态数据。程序结束后由系统释放。
代码段: 存放函数体(类成员函数和全局函数)的二进制代码。

为什么fork()会返回两个值

#include <iostream>
#include <unistd.h>

using namespace std;
int main()
{
    int global = 100;
    pid_t id = fork();
    if (id == 0)
    {
        // child
        cout<<"id地址"<<&id<<endl;
        global = 200;
        cout << "我是子进程pid:" << getpid() << " 我要改global,global:" << global << " global地址:" << &global << endl;
    }
    else
    {
        //father
        cout<<"id地址"<<&id<<endl;
        cout << "我是父进程pid:" << getpid() << " 我的儿子是:" << id << " global:" << global << " global地址:" << &global << endl;
    }

    return 0;
}

在调用fork创建子进程,返回时发生写实拷贝
每一个进程都有一个自己的地址空间
对于这个写实拷贝的个人理解就是,一班和二班都有一个叫小明的人,但是他俩不是一个人(因为班级不同),对应到进程地址空间里就是 虚拟地址一样但是对应的物理地址却不同(因为页表不同)
在这里插入图片描述

先来看一下一个代码的现象

#include <iostream>
#include <unistd.h>

using namespace std;
int main()
{
    int global = 100;
    pid_t id = fork();
    if (id == 0)
    {
        // child
        global = 200;
        cout << "我是子进程pid:" << getpid() 
        << " 我要改global,global:" << global
         << " global地址:" << &global << endl;
    }
    else
    {
        //father
        cout << "我是父进程pid:" << getpid()
         << " 我的儿子是:" << id << " global:" << global
          << " global地址:" << &global << endl;
    }

    return 0;
}

在这里插入图片描述

在C/C++中我们看到的地址是物理地址吗?

我们可以得出一个结论:我们在C/C++中使用的地址,绝对不可能是物理地址!!!
因为如果是物理地址,上图的情况是不可能产生的!!!

为什么操作系统不让我直接看到物理内存呢?

内存就是一个硬件,不能阻拦访问你访问!只能被动地进行读取和写入!
因此如果我们能够直接访问甚至修改物理内存,将会造成不可预料的后果,因此为了安全起见,操作系统不会让我们直接访问物理内存。
并且运用虚拟地址可以方便转换需要访问的物理地址,提高程序运行效率

什么是进程地址空间

每一个进程在启动的时候,都会让操作系统给它创建一个地址空间,该进程地址空间就是进程地址空间

每一个进程都会有一个自己的进程地址空间!!
那么操作系统要不要管理这些进程地址空间呢?
那么怎么去管理呢?
进程地址空间,其实是内核的一个数据结构,操作系统肯定会先描述在组织这些数据结构,mm_struct

理解进程地址空间

所以我们验证说程序地址空间是不准确的,准确的应该说成进程地址空间,那么我们应该怎么来理解呢?

进程地址空间在逻辑上是一个抽象的概念,我们在谈这个概念之前我们需要引入一个进程独立性。

进程独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰!
所谓的地址空间:其实就是OS通过软件的方式,给进程提供一个软件视角,认为自己会独占系统的所有资源(内存)

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

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

相关文章

SpringBoot整合RabbitMQ

RabbitMQ安装部署详情可见&#xff1a;RabbitMQ简介及在Linux中安装部署&#xff08;yum&#xff09; 一、导入pom.xml依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</versio…

简单的抓包

验证TCP/IP协议栈结构、帧结构 准备&#xff1a; 用到的软件&#xff1a;科来网络分析系统、putty 1&#xff09;准备两台虚拟机&#xff08;我这里准备windows2003、7&#xff09;&#xff0c;并让两台虚拟机可以互相通信&#xff08;配置IP&#xff0c;让他们处于同一局域网…

基于SSM的网络教学(作业)管理系统

1、项目介绍 基于SSM的网络教学&#xff08;作业&#xff09;管理系统拥有三种角色&#xff1a;管理员、教师和学生 管理员&#xff1a;教师管理、学生管理、课程管理、教学信息管理、作业管理、试卷管理、试题管理、论坛管理、系统管理、考试管理等 教师&#xff1a;课程信…

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手 步骤 一、支付宝开放平台 1、进入支付宝开放平台&#xff0c;登录&#xff0c;然后点击控制台&#xff0c;划到最下面&#xff0c;点击沙箱 2、APPID一会要用到&#xff0c;然后将接口加签方式选择为自定义密钥&a…

【Bio】基础生物学 - 细胞膜 cell membrane

文章目录1. 细胞膜1.1 内平衡1.2 选择透过性1.3 流动镶嵌模型Ref1. 细胞膜 没有细胞膜&#xff0c;就没有细胞。 不论是否有细胞壁&#xff0c;所有的细胞都有细胞膜&#xff0c;也叫做 质膜 (plasma membrane)\blue{\text{质膜 (plasma membrane)}}质膜 (plasma membrane)。…

RabbitMQ系列【10】死信队列

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录概念创建死信交换机、队列过期导致死信拒接消费长度限制概念 无法被消费的消息被称为死信&#xff0c;存放死信的队列也就是死信队列。 由于某些特定的原因导致队列中的某些消息无法被消费&am…

【数据结构】c++栈的应用:波兰式、逆波兰式和中缀表达式计算器

********************************************************************************************************* 本文作者科大MF22某班Noah懒羊羊同学&#xff0c;为大家提供一个作业思路&#xff0c;请勿直接copy&#xff01;&#xff01;&#xff01;一起进步学习~ ********…

Mac 通过docker安装MinIO

前言 最近MeterSphere出了新版本&#xff0c;新版本架构是这样的&#xff08;如下图&#xff09;。采用了SpringCloudSpringBoot 微服务的架构的。跟以往相比&#xff0c;多了一个新的组件&#xff0c;MinIO。也就是分布式存储。 关于MinIO 1、MinIO是什么&#xff1f; 官方…

[附源码]java毕业设计某互联网公司人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【C语言】操作符详解

目录 1、操作符分类 2、算术操作符 3、移位操作符 (二进制) 3.1 左移操作符 3.2 右移操作符 4、位操作符 5、赋值操作符 6、单目操作符 6.1 单目操作符介绍 6.2 sizeof和数组 7、关系操作符 8、逻辑操作符 9、条件操作符 10、逗号表达式 11、下标引用、函…

微信对账单功能开发(V2)

下载交易账单接口开发 应用场景&#xff1a; 商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致&#xff0c;通过对账单核对后可校正支付状态。 注意&#xff1a; 1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易…

Azure Integrator Delphi版

Azure Integrator Delphi版 Azure Integrator包括表、队列和Blob等标准Windows Azure结构的实现&#xff0c;使开发人员能够快速轻松地将基于云的数据存储、队列管理、表配置等添加到任何桌面、Web或移动应用程序中。 Azure Integrator功能 用于访问Windows Azure表、Blob和队列…

python folium 实现地图平台制作

python实现泸定地震点观测平台制作 数据来自[走天涯徐小洋地理数据科学]&#xff0c;原始数据来自微博中国地震台网 的正式测定数据。 以下是地震点的数据&#xff1a; MagnitudeDateTimeLongitudeLatitudeDepth6.82022-9-512:52102.0829.59163.12022-9-65:28102.0729.64113…

[附源码]java毕业设计览宏公司会议管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

01. 信息搜集:Web 1~10

Web 1~10web1知识点题解web2知识点题解web3知识点题解web4知识点题解web5知识点题解web6知识点题解web7知识点题解web8知识点题解web9知识点题解web10知识点题解web1 知识点 查看网页源码&#xff1a;ctrl u 或 F12 开发注释未及时删除 题解 查看网页源码即可。 web2 知识…

学习UI设计,哪些软件是必学的

UI设计软件的学习并不重要。许多设计软件功能相似&#xff0c;操作相似&#xff0c;设计效果相似&#xff0c;此时我们只需要选择相同类型的软件进行深入学习&#xff0c;当我们掌握软件时&#xff0c;使用其他类型的软件基本上不会有太大的困难。 ​一、位图软件&#xff1a; …

spring-data-mongodb生成的Query语句order字段顺序错误

前言&#xff1a; 最近在实现一个需求的时候&#xff0c;需求要求查询的数据需要根据播放量倒叙、创建时间倒叙来排序&#xff0c;考虑到播放量、创建时间都有可能是相同的&#xff0c;就会出现排序不稳定的情况&#xff0c;于是就加入了"_id"作为第三个排序字段&am…

Unity程序在VR一体机(Android)上卡死(闪退)后怎么办?——用adb查看android上某Unity app的debug信息

一、之前面临的困境 Unity的程序build到android一体机后&#xff0c;仿佛进入了一个黑箱子&#xff0c;你既看不到脚本的debug报错信息&#xff0c;也看不到任务管理器里的内存和CPU使用情况&#xff1f;如果黑屏、闪屏、花屏怎么办&#xff1f; 最近面临的一个问题就是&…

【快速上手系列】使用七牛云+webuploader实现对象云存储(OSS)

【快速上手系列】使用七牛云webuploader实现对象云存储&#xff08;OSS&#xff09; 步骤 一、七牛云配置 1、新建存储空间 进入七牛云&#xff0c;注册登录&#xff0c;进入控制台&#xff0c;选择对象存储 Kodo 选择空间管理——新建空间&#xff08;免费30天&#xff0…

[附源码]java毕业设计企业人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…