当前位置: 首页 > news >正文

第三部分:4---进程地址空间

目录

数组的空间分配解析:

物理地址和虚拟地址:

虚拟地址空间:

进程地址空间的本质:

为什么要有进程地址空间?

页表对进程访问内存的检查:

进程地址空间和页表如何关联起来?

进程的独立性如何体现?


 

  • BSS段从上到下包括:未初始化全局数据区、已初始化全局数据区。

  • 堆区向上增长,所以在堆区后开辟的空间要比先开辟的空间的地址高。

  • 栈区向下增长,和堆区截然相反。

数组的空间分配解析:

  • 开辟的数组存储在栈区空间中,一次在栈区中从上向下开辟一整块空间。

  • 数组首元素被分配在这块空间的最下端,也就是地址最低处,之后的数组元素依次向上存放。

  • 这样对数组++,就能够找到下一个元素(由下向上,地址变大)。

  • 对于结构体也是一样,先声明的成员所在的地址小于后声明的成员的地址。

  • 对于一个int类型的变量,也可以理解为:申请4字节大小的空间,然后将数据依次从下向上存放。变量的地址就是第一个自己的地址。

物理地址和虚拟地址:

int g_val = 0; //创建一个全局变量int main()
{pid_t id = fork();if(id < 0){perror("fork");return 0;}else if(id == 0) //如果是子进程,就将全局变量的值改为100{ g_val=100;printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);}else //如果是父进程,就直接打印全局变量的值{ sleep(3);printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);}sleep(1);return 0;
}

 

  • 父子进程操作同一个全局变量,所操作的全局变量的地址相同。但是子进程对全局变量的修改,并不会影响到父进程打印的全局变量。

  • 可以推断出父子进程操作的不是同一个全局变量,基于写时拷贝,父子进程会各自保有一份全局变量g_val。

  • 得到结论,打印得到的地址并不是物理地址,而是虚拟地址。

虚拟地址空间:

  • 子进程在创建时(通常通过 fork 系统调用)会拷贝父进程的地址空间,使得子进程拥有与父进程相同的虚拟地址空间。这意味着在父进程和子进程中,所有变量的虚拟地址是相同的。

  • 虚拟地址通过页表映射到物理地址。虽然父子进程的虚拟地址空间相同,但它们的页表是独立的。最初,父子进程的页表中的映射指向相同的物理内存地址,这样可以共享内存,从而提高效率。

  • 通过页表的不同映射,父子进程在内存中的物理地址可以不同。当进程尝试修改某个共享的全局变量或数据时,操作系统会触发写时拷贝机制。

  • 写时拷贝机制:当父进程或子进程中的某一个试图修改共享的全局变量时,操作系统会拷贝该变量所在的物理页帧,并为尝试修改的进程创建一个新的物理页。然后,操作系统将该新页帧的物理地址更新到该进程的页表中,将这个虚拟地址与新物理地址关联起来。这样,两个进程依然可以拥有相同的虚拟地址,但实际访问的是不同的物理内存,保证了数据的一致性和进程间的独立性。

进程地址空间的本质:

  • 程序地址空间的本质是操作系统内核管理的一个数据结构,它用于描述和管理一个进程所能访问的所有虚拟内存地址。

  • 地址空间中的内存区域通常被划分为多个小块,每个小块对应一个特定的用途,如代码段、数据段、堆区、栈区等。

  • 这个数据结构的核心是一个或多个结构体,这些结构体包含了对每个内存小块的描述信息,包括起始地址、结束地址、访问权限(如可读、可写、可执行)等。

  • 程序地址空间仅仅是对进程虚拟内存的逻辑描述,并不是实际的物理内存。它定义了进程在运行时可以访问哪些虚拟地址,而实际的物理内存是由操作系统通过页表等机制进行动态映射和管理的。

  • 由此可以理解“ 堆栈相对而生 ”的意义就是:不断调整堆栈在进程地址空间的起始结束位置。

为什么要有进程地址空间?

  • 进程地址空间通过页表管理加载到内存中的进程及其数据。页表负责将进程的虚拟地址映射到物理内存地址,从而实现对进程的内存管理。

  • 因此,进程控制块(PCB)无需直接关心进程及其数据在物理内存中的具体位置。页表的存在使得PCB只需关注虚拟地址和相关的状态信息,而不必追踪数据在物理内存中的具体布局。

  • 这种机制赋予了进程一个统一的视角来管理和访问内存,通过将无序的物理内存映射为有序的虚拟地址空间,操作系统为每个进程提供了一个一致且线性的内存视图。

  • 进程及其数据可以在物理内存中灵活加载,无需担心具体的加载顺序。由于页表的动态映射,操作系统可以根据需要在任何空闲的物理内存位置加载进程和数据,而虚拟地址空间的连续性和有序性则由页表负责保证。

页表对进程访问内存的检查:

  • 页表不仅包含虚拟地址到物理地址的映射,还包含对该映射的访问权限字段。这些权限字段通常包括可读、可写、可执行等属性,用来控制进程对内存的访问权限。

  • 当进程试图通过地址空间访问内存时,操作系统会通过页表来检查该访问请求是否符合权限要求。如果请求的地址超出合法范围(即非法地址),或访问权限不符合页表中的规定,操作系统会在虚拟地址转化为物理地址的过程中拦截该访问。

  • 这种机制为内存访问提供了安全保障。当进程试图执行非法操作时,例如读取未授权的内存区域或执行不可执行的代码段,操作系统会触发一个保护机制(如产生一个页面错误异常),并采取相应的措施(如终止进程或发出警告)。

  • 因此可以理解为什么在字符常量区的常量不能被修改:字符常量区(通常位于代码段或专门的常量区)中的常量在加载到内存时,操作系统会通过页表将这一段的访问权限设置为只读。使得任何试图修改这些常量的操作都会被操作系统拦截,并通常会导致程序崩溃或产生异常。

进程地址空间和页表如何关联起来?

  • CPU通过页表基址寄存器(CR3寄存器)直接找到页表进行地址映射。CR3寄存器中存储的是当前进程页表的物理地址,而不是虚拟地址。通过这个物理地址,CPU可以快速访问页表,从而将虚拟地址转换为实际的物理地址。

  • 每个进程都有自己独立的页表,用于管理该进程的虚拟地址空间。页表在进程的上下文中被保存,当操作系统调度器将进程切换到CPU上执行时,它会从该进程的上下文中读取页表地址,并将其加载到CR3寄存器中。

  • 在进程切换时,当前进程的页表地址会被保存到它的上下文中,随后,新的进程被加载时,其页表地址会被从其上下文中恢复并加载到CR3寄存器中。这种机制确保了不同进程在运行时可以独立地管理和访问各自的内存空间,而不互相干扰。

进程的独立性如何体现?

  • 每个进程都有自己独立的关键数据结构,包括进程控制块(PCB)、进程地址空间、页表以及分配给该进程的物理内存。这些数据结构在操作系统中被严格隔离,确保进程之间的独立性。

  • 当一个进程崩溃时,由于操作系统对进程的隔离管理,这种崩溃通常只会影响到该进程自身的数据结构,如其PCB、地址空间和与其相关联的物理内存。其他进程的执行和数据不会受到影响。

相关文章:

第三部分:4---进程地址空间

目录 数组的空间分配解析&#xff1a; 物理地址和虚拟地址&#xff1a; 虚拟地址空间&#xff1a; 进程地址空间的本质&#xff1a; 为什么要有进程地址空间&#xff1f; 页表对进程访问内存的检查&#xff1a; 进程地址空间和页表如何关联起来&#xff1f; 进程的独立…...

【Android】程序开发组件—探究Jetpack

引言 Jetpack是一个开发组件工具集&#xff0c;它的主要目的是帮助我们编写出更加简洁的代码&#xff0c;并简化我们的开发过程&#xff0c;在这么多的组件当中&#xff0c;最需要我们关注的其实还是架构组件&#xff0c;接下来就对Jetpack的主要架构组件进行学习&#xff01;…...

pytorch torch.norm函数介绍

torch.norm 函数用于计算张量的范数&#xff08;norm&#xff09;&#xff0c;可以理解为张量的“长度”或“大小”。根据范数的不同类型&#xff0c;它可以衡量不同的张量性质。该函数可以计算 向量 和 矩阵 的多种范数&#xff0c;如 L1范数、L2范数、无穷范数 等。 1. 函数…...

【lc_hot100】刷题心得

链表 二叉树 二叉树相关的题目基本都有个基本的框架&#xff0c;基本框架就是二叉树的四种遍历方法&#xff1a;前序遍历、中序遍历、后序遍历、层序遍历 往往常用的是前序遍历和中序遍历 图 图跟二叉树一样都有自己的的基本框架&#xff0c;基本框架就是图的两种遍历方法&am…...

FANUC 数控 A06B-6058-H227 伺服放大器

‌发那科伺服放大器是一种控制电机的电子装置&#xff0c;属于电机控制系统的一部分&#xff0c;用于将输入信号放大并转换成电动机可以理解的信号&#xff0c;从而实现运动控制和定位。‌ 发那科伺服放大器的主要作用包括&#xff1a; ‌实现运动控制‌&#xff1a;通过控制…...

Python将表格文件中某些列的数据整体向上移动一行

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;对其中的每一个文件加以操作——将其中指定的若干列的数据部分都向上移动一行&#xff0c;并将所有操作完毕的Excel表格文件中的数据加以合并&#xff0c;生成一个新的Excel文件的方法。 首…...

基于YOLOv8的PCB缺陷检测算法,加入一种基于内容引导注意力(CGA)的混合融合方案(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;针对基于YOLOv8的PCB缺陷检测算法进行性能提升&#xff0c;加入各个创新点做验证性试验。 1&#xff09;提出了一种基于内容引导注意力(CGA)的混合融合方案&#xff0c;mAP0.5由原始的0.966提升至0.975 1.PCB缺陷…...

如何在红米手机中恢复已删除的照片?(6 种方式可供选择)

凭借出色的相机和实惠的价格&#xff0c;小米红米系列已成为全球知名品牌。但是&#xff0c;最近有些人抱怨他们在 红米设备上丢失了许多珍贵的图片或视频&#xff0c;并希望弄清楚如何从小米手机恢复已删除的照片。好吧&#xff0c;在小米设备上恢复已删除的视频/照片并不难。…...

嵌入式实时操作系统(RTOS):原理、应用与发展

摘要&#xff1a;本文围绕嵌入式实时操作系统&#xff08;RTOS&#xff09;展开。首先介绍嵌入式系统与实时操作系统的概念&#xff0c;阐述嵌入式 RTOS 的体系结构。接着分析其关键特性&#xff0c;包含任务管理&#xff08;如任务的创建与删除、调度、同步与通信&#xff09;…...

C#里使用位图容器BitArray

由于经常需要操作一些位表示的数据结构,那么就需要采用位图的管理方式。 在C#里就是使用BitArray来管理位图数据结构,这样就比较方便处理。 这个类可以有多种构造函数,可以满足绝大部分的要求。 比如从网络协议里传送过来的字节流,就可以直接写入到里面,就可以直接获取…...

如何在 Kali Linux 上安装 pip3

如何在 Kali Linux 上安装 pip3 在 Kali Linux 上安装 pip3 的过程非常简单。按照以下步骤&#xff0c;你可以轻松完成安装并开始使用 pip3 管理 Python 软件包。 步骤 1&#xff1a;打开终端 首先&#xff0c;打开你的 Kali Linux 终端。 步骤 2&#xff1a;更新软件包列表…...

5.2 排列与代数余子式

一、求行列式的方法 计算机是利用主元计算行列式的。本节介绍其它两种计算行列式的方法。一是 “大公式”&#xff08;big formula&#xff09;&#xff0c;它使用了全部 n ! n! n! 个排列计算&#xff1b;二是 “代数余子式公式”&#xff08;cofactor formula&#xff09;&…...

java框架第五课(终极版本)SpringBoot

一.关于SpringBoot (1)回忆Spring 传统的Spring由Spring 框架(ioc,aop)加mybatis加Springweb组成&#xff0c;虽然相比原生的java程序Spring框架帮我们大大减少了代码量&#xff0c;减少了冗余&#xff0c;提高了开发效率但是由于Spring框架下的配置和相关的jar包依赖过多&am…...

聚类案例——汽车是否值得购买

对汽车是否值得购买&#xff0c;进行聚类分析&#xff1a; 1、数据指标解释&#xff1a; buying, 购买费用 maint, 维修费用 doors, 车门数量 person, 乘坐人数 lug_boot, 行李箱容量 safety, 安全性 2、对数据进行转换 将字符串转换映射量化为数字 数据加载&#xff1a…...

网络编程9.10

使用数据库完成工人管理系统: ubuntuubuntu:DB$ ubuntuubuntu:DB$ cat 2.c #include <myhead.h> #include <sqlite3.h> #include <string.h>typedef struct {int id;char name[20];double salary; } Worker;int do_insert(sqlite3 *ppDb) {Worker work;pri…...

如何在SQL Server中恢复多个数据库?

一次性恢复多个 SQL数据库吗可以吗&#xff1f; "是的&#xff0c;可以一次性恢复多个 SQL 数据库。通常情况下&#xff0c;只要备份文件的名称与相应的数据库匹配&#xff0c;且没有附加的日期或时间信息&#xff0c;就可以通过有效的 T-SQL 脚本来完成恢复。如果你希望…...

炸裂!新版 SD WebUI Forge 出图速度更快!支持最新Flux 模型!(保姆级安装教程)

大家是不是经常为SD WebUI卡顿、爆显存而苦恼?一启动SD 电脑就开始发烫&#xff0c; 尤其低显存用户屡屡"中招",不得不一遍遍重启。作为AI绘画的必备工具&#xff0c;WebUI却还有这么多"坑"&#xff0c;着实让人不爽!&#x1f620; 好消息是&#xff0c;…...

laserOdometry.cpp源码注释

本博客用于a-loam源码学习&#xff0c;用于和slam初学者一起学习。 #include <cmath>#include <nav_msgs/Odometry.h>#include <nav_msgs/Path.h> //这两行代码是C中包含头文件的指令&#xff0c;它们用于在ROS&#xff08;Robot Operating System&#xf…...

STM32时钟配置图详解

一图概述&#xff1a; 左侧输入时钟源 Input Frequency (LSE/LSI/HSI/HSE) LSE (Low-Speed External)&#xff1a;外部32.768 kHz晶体振荡器&#xff0c;通常用于RTC&#xff08;实时时钟&#xff09;。LSI (Low-Speed Internal)&#xff1a;内部低速时钟&#xff0c;频率为…...

Vscode——调试时,修改变量值

第一步&#xff1a;点击变量&#xff0c;鼠标右键 第二步&#xff1a;点击 设置值...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...