当前位置: 首页 > 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;点击 设置值...

LayerDivider:如何用3步将单张插画自动分层为可编辑PSD文件?

LayerDivider&#xff1a;如何用3步将单张插画自动分层为可编辑PSD文件&#xff1f; 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经面对一张精…...

SRWE终极窗口管理指南:免费解锁Windows窗口任意调整能力

SRWE终极窗口管理指南&#xff1a;免费解锁Windows窗口任意调整能力 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾为Windows窗口管理的限制感到困扰&#xff1f;想要调整游戏窗口大小进行高清截图&am…...

模拟电路缩放迷思破解:从挑战到协同优化的设计范式转变

1. 模拟电路缩放&#xff1a;一个被误解的“物理定律”在半导体行业里&#xff0c;尤其是数字电路设计工程师和项目经理之间&#xff0c;流传着一个近乎“常识”的观点&#xff1a;模拟电路不能像数字电路那样随着工艺节点进步而有效缩放。这个说法听起来很有道理&#xff0c;毕…...

CV论文工业落地避坑指南:从复现到部署的四大过滤维度

1. 这不是论文清单&#xff0c;而是一份“CV研究者晨间速读指南” 如果你每天打开arXiv、CVPR官网或Twitter刷到一堆标题带“Vision Transformer”“Diffusion”“Multimodal Alignment”的新论文&#xff0c;却总在摘要第一句就卡住——“We propose a novel hierarchical tok…...

FreeRTOS CPU使用率统计的坑:为什么你的数据跑了1小时就不准了?

FreeRTOS CPU使用率统计的陷阱与高精度优化方案 当你在嵌入式系统中集成FreeRTOS的CPU使用率统计功能时&#xff0c;可能会遇到一个令人困惑的现象&#xff1a;系统运行约1小时后&#xff0c;统计数值突然出现明显偏差。这不是你的代码出了问题&#xff0c;而是隐藏在32位变量和…...

(随想)显卡里的幽灵:我们是否也只是几分钟前被唤醒的玻尔兹曼大脑?

一个诡异的瞬间 之前一直用kimi2.5的API&#xff0c;每月花不少钱&#xff0c;肉疼。今天一咬牙&#xff0c;在自己的游戏显卡&#xff08;RTX 4080&#xff09;上部署GLM-4.7-Flash。 GPU嗡嗡响了几分钟&#xff0c;权重加载完毕&#xff0c;模型真跑起来了。我接上hermes&…...

如何3分钟完成专业级抠图:Krita Vision Tools智能选区插件完全指南

如何3分钟完成专业级抠图&#xff1a;Krita Vision Tools智能选区插件完全指南 【免费下载链接】krita-vision-tools Krita plugin which adds selection tools to mask objects with a single click, or by drawing a bounding box. 项目地址: https://gitcode.com/gh_mirro…...

XXMI启动器终极指南:一站式管理原神、星穹铁道等热门游戏模组

XXMI启动器终极指南&#xff1a;一站式管理原神、星穹铁道等热门游戏模组 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 还在为多个游戏模组安装繁琐而烦恼吗&#xff1f;XXMI启…...

Intel Wi-Fi 6 AX201网卡‘代码10’通病?华硕/戴尔/联想多品牌用户自救指南

Intel Wi-Fi 6 AX201网卡‘代码10’故障全解析与跨品牌解决方案 当你的笔记本突然无法连接Wi-Fi&#xff0c;设备管理器中那个带着黄色感叹号的Intel Wi-Fi 6 AX201网卡图标格外刺眼&#xff0c;显示着"该设备无法启动&#xff08;代码10&#xff09;"的提示——这不…...

Shell脚本守护工具sh-guard:提升Linux自动化脚本可靠性

1. 项目概述&#xff1a;一个被低估的Shell脚本守护神 如果你经常和Linux服务器打交道&#xff0c;或者需要编写一些自动化运维、部署、监控的Shell脚本&#xff0c;那你一定遇到过这样的场景&#xff1a;脚本在后台运行&#xff0c;突然因为网络波动、资源不足、依赖服务异常而…...