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

1. 初识LLM API:环境配置与多轮对话演示

其实AI应用并不是一个什么很高大上的东西&#xff0c;你可以将它当作一个文字的“调库”行为&#xff0c;“调库”只需要知道库名就行了&#xff0c;这里实际也是如此。甚至你只需要知道你想问什么&#xff0c;将你的消息作为输入&#xff0c;就能从大模型得到输出。而这个“库…...

【AI编程助手】VsCode插件--通义灵码

目录 摘要 一、插件安装 二、“通义灵码” 使用 三、官网教程 四、总结 五、参考信息 摘要 通义灵码是一款强大的 AI 编程助手。它能够理解编程相关的复杂逻辑&#xff0c;为开发者提供高效、准确的代码生成与优化建议。在编程过程中&#xff0c;它可以辅助处理各种任务&…...

9月10号的学习

//界面1 头文件 signals://界面1的自定义信号void my_signal(); private slots:void on_pushButton_2_clicked();void on_pushButton_clicked(); //界面1 .cpp文件 void Widget::on_pushButton_2_clicked() {QMessageBox msg(QMessageBox::Warning,"警告","是否…...

QtC++截图支持窗口获取

介绍 在截图工具中你会发现&#xff0c;接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素&#xff0c;那么今天简单分析一下QTc如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口…...

料品档案没有配置主供应商信息

这个问题经常会出现在普通用户的面前。没有合适的工程人员去打理料品档案。信息是缺漏的。用友给出来的提示&#xff0c;也让人摸不着头脑。只能是记下来备用吧。...

springboot属性加载优先级和常见命令行属性

属性加载优先级&#xff1a; 1.SpringApplication&#xff1a;启动的main方法里注入的属性 2.PropertySource&#xff1a;通过注解 加载的数据配置文件 3.Config data file&#xff1a;application.yml/.properties 4.OS environment variable&#xff1a;环境变量 5.Command l…...

Math Reference Notes: 因式定理

文章目录 1. 因式定理的定义2. 因式定理的数学表达&#xff1a;3. 因式定理的推导4. 因式定理的含义5. 因式定理的应用6. 因式定理与余式定理的关系7. 因式定理的应用领域8.因式定理的局限性 因式定理是多项式代数中的一个重要工具&#xff0c;帮助我们通过多项式的根来因式分解…...

Kubernetes------Service

目录 一、属性说明 二、定义和基本配置 1、定义 2、创建Service 2.1、typeClusterIP 2.2、typeNodePort 2.3、固定IP访问 三、Service、EndPoint、Pod之间的关系 四、服务发现 1、基于Service中IP访问外部服务 2、基于Service中域名访问外部服务 五、Ingress的安装和使…...

C#的LINQ语句

在 C# 中&#xff0c;LINQ&#xff08;Language Integrated Query&#xff09;是一种强大的查询技术&#xff0c;它允许你使用熟悉的 C# 语法来查询数据集合。LINQ 可以用于查询各种数据源&#xff0c;包括数组、列表、数据集、SQL数据库等。 以下是一些基本的 LINQ 语句示例&…...

项目实战系列三: 家居购项目 第三部分

文章目录 &#x1f343;后台分页&#x1f345;后台分页导航 &#x1f343;首页分页&#x1f345;首页分页导航&#x1f345;首页搜索&#x1f345;两个奇怪的问题&#x1f345;会员显示登录名&#x1f345;注销登录&#x1f345;验证码 &#x1f343;后台分页 程序框架图 1.…...