第三部分: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---进程地址空间
目录 数组的空间分配解析: 物理地址和虚拟地址: 虚拟地址空间: 进程地址空间的本质: 为什么要有进程地址空间? 页表对进程访问内存的检查: 进程地址空间和页表如何关联起来? 进程的独立…...

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

pytorch torch.norm函数介绍
torch.norm 函数用于计算张量的范数(norm),可以理解为张量的“长度”或“大小”。根据范数的不同类型,它可以衡量不同的张量性质。该函数可以计算 向量 和 矩阵 的多种范数,如 L1范数、L2范数、无穷范数 等。 1. 函数…...
【lc_hot100】刷题心得
链表 二叉树 二叉树相关的题目基本都有个基本的框架,基本框架就是二叉树的四种遍历方法:前序遍历、中序遍历、后序遍历、层序遍历 往往常用的是前序遍历和中序遍历 图 图跟二叉树一样都有自己的的基本框架,基本框架就是图的两种遍历方法&am…...
FANUC 数控 A06B-6058-H227 伺服放大器
发那科伺服放大器是一种控制电机的电子装置,属于电机控制系统的一部分,用于将输入信号放大并转换成电动机可以理解的信号,从而实现运动控制和定位。 发那科伺服放大器的主要作用包括: 实现运动控制:通过控制…...

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

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

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

嵌入式实时操作系统(RTOS):原理、应用与发展
摘要:本文围绕嵌入式实时操作系统(RTOS)展开。首先介绍嵌入式系统与实时操作系统的概念,阐述嵌入式 RTOS 的体系结构。接着分析其关键特性,包含任务管理(如任务的创建与删除、调度、同步与通信)…...
C#里使用位图容器BitArray
由于经常需要操作一些位表示的数据结构,那么就需要采用位图的管理方式。 在C#里就是使用BitArray来管理位图数据结构,这样就比较方便处理。 这个类可以有多种构造函数,可以满足绝大部分的要求。 比如从网络协议里传送过来的字节流,就可以直接写入到里面,就可以直接获取…...
如何在 Kali Linux 上安装 pip3
如何在 Kali Linux 上安装 pip3 在 Kali Linux 上安装 pip3 的过程非常简单。按照以下步骤,你可以轻松完成安装并开始使用 pip3 管理 Python 软件包。 步骤 1:打开终端 首先,打开你的 Kali Linux 终端。 步骤 2:更新软件包列表…...
5.2 排列与代数余子式
一、求行列式的方法 计算机是利用主元计算行列式的。本节介绍其它两种计算行列式的方法。一是 “大公式”(big formula),它使用了全部 n ! n! n! 个排列计算;二是 “代数余子式公式”(cofactor formula)&…...

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

聚类案例——汽车是否值得购买
对汽车是否值得购买,进行聚类分析: 1、数据指标解释: buying, 购买费用 maint, 维修费用 doors, 车门数量 person, 乘坐人数 lug_boot, 行李箱容量 safety, 安全性 2、对数据进行转换 将字符串转换映射量化为数字 数据加载:…...
网络编程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数据库吗可以吗? "是的,可以一次性恢复多个 SQL 数据库。通常情况下,只要备份文件的名称与相应的数据库匹配,且没有附加的日期或时间信息,就可以通过有效的 T-SQL 脚本来完成恢复。如果你希望…...

炸裂!新版 SD WebUI Forge 出图速度更快!支持最新Flux 模型!(保姆级安装教程)
大家是不是经常为SD WebUI卡顿、爆显存而苦恼?一启动SD 电脑就开始发烫, 尤其低显存用户屡屡"中招",不得不一遍遍重启。作为AI绘画的必备工具,WebUI却还有这么多"坑",着实让人不爽!😠 好消息是,…...
laserOdometry.cpp源码注释
本博客用于a-loam源码学习,用于和slam初学者一起学习。 #include <cmath>#include <nav_msgs/Odometry.h>#include <nav_msgs/Path.h> //这两行代码是C中包含头文件的指令,它们用于在ROS(Robot Operating System…...

STM32时钟配置图详解
一图概述: 左侧输入时钟源 Input Frequency (LSE/LSI/HSI/HSE) LSE (Low-Speed External):外部32.768 kHz晶体振荡器,通常用于RTC(实时时钟)。LSI (Low-Speed Internal):内部低速时钟,频率为…...

Vscode——调试时,修改变量值
第一步:点击变量,鼠标右键 第二步:点击 设置值...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...