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

news2024/9/22 1:36:29

目录

数组的空间分配解析:

物理地址和虚拟地址:

虚拟地址空间:

进程地址空间的本质:

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

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

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

进程的独立性如何体现?


 

  • 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、地址空间和与其相关联的物理内存。其他进程的执行和数据不会受到影响。

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

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

相关文章

源荷储再创新!小论文轻松发!基于雨流计数法的源-荷-储双层协同优化配置研究程序代码!

前言 如何实现源与荷信息互通&#xff0c;将传统的供需信息由静态传递向能源互联转变&#xff0c;形成能源互联网&#xff0c;是今后能源革命的变革方向。新电改的出台推动了能源互联网的发展&#xff0c;储能技术作为能源互联网发展中的关键元素&#xff0c;由于储能系统投资…

每个python程序员都应该早点知道的 6 个 Python 函数

在编程中&#xff0c;默认参数的引入使得函数调用更为灵活&#xff0c;不仅允许开发者在特定情况下省略某些非必需参数&#xff0c;同时也强调了对参数与实际传递值&#xff08;即论点&#xff09;之间区别的理解&#xff0c;这对于掌握函数工作机制至关重要。 此外&#xff0…

PCL-统计滤波

本篇内容 讲解统计滤波作用及原理通过pcl实现统计滤波强烈推荐在点云处理最开始使用&#xff0c;统计滤波处理&#xff0c;再送入其他算法进行处理&#xff01;&#xff01;&#xff01; 效果&#xff1a; 1 主要原理 手动设置半径大小或者邻域点数量N&#xff08;若设置的…

“论剑”智算时代,长沙已经站在计算产业的“华山之巅”

文 | 智能相对论 作者 | 陈泊丞 共赴全新十年之约&#xff0c;长沙又来搞大事情了&#xff01; 2024互联网岳麓峰会以“AI汇湘江 数智领航未来”为主题&#xff0c;全面聚焦在“AI”时代把握数字化、网络化、智能化发展机遇&#xff0c;积极响应当前人工智能技术迅猛发展的势…

【Qt笔记】QTableWidget控件详解

目录 引言 一、QTableWidget的特点 二、QTableWidget基础 2.1 引入QTableWidget 2.2 基本属性 三、代码示例&#xff1a;初始化QTableWidget 四、编辑功能 4.1 设置单元格为只读 4.2 响应内容更改 五、选择模式 六、样式定制 七、与其他控件的交互 7.1 在单元格…

网络工程师学习笔记——无线通信网(二)

MAC子层 包含逻辑链路层&#xff08;LLC&#xff09;和介质访问控制层&#xff08;MAC&#xff09;两个子层 无线访问机制 MAC子层是提供访问机制控制 <1>CSMA/CA是类似于802.3当中的CSMA/CD且支持竞争访问 为何不适用CSMA/CD ,因为有隐藏的节点和暴露的节点&#xf…

QT天气预报

json 理论 什么是JSON? 规则 被大括号包括的是JSON对象,被中括号包括的是JSON数组. JSON数组JSON对象 实验 构建JSON 用代码实现如下json内容: //构建JSON void WirteJson() {QJsonObject rootObject;//1.插入name字段rootObject.insert("name","china&quo…

新手必看,​7款常见的短视频剪辑软件附详细教程,一看就会!

视频剪辑已经成为了我们生活和工作中常见的需求之一&#xff0c;windows视频编辑软件有很多&#xff0c;从简单的剪辑到复杂的视觉效果制作&#xff0c;不同的视频剪辑软件满足不同剪辑需求。本文将详细介绍一些广泛使用的视频制作软件&#xff0c;包括它们的功能特点以及一些高…

前海打工人的免费公园停车场

现在桂湾公园地下停车场距离前海的搬砖的写字楼近一些也好一些&#xff0c;由于主打一个免费&#xff0c;故很多情况都被预约满了。我住的地方在宝安石岩&#xff0c;提前1小时预约根本就没办法到停车场。故我最近都是停前海运动公园的地面停车场【372个停车位】。但是这个地面…

全球视频云创新挑战赛算法赛道第一名比赛攻略

关联比赛: “新内容 新交互”全球视频云创新挑战赛--算法挑战赛道 Richardzuo比赛攻略 赛题背景与理解 视频物体分割&#xff08;Video Object Segmentation&#xff09;是计算机视觉最近两三年兴起的⼀个研究领域&#xff0c;其⽬的是从视频所有图像帧中把感兴趣的物体区域…

指针 (五)

一 . 字符指针变量 在指针的类型中&#xff0c;有一种是字符指针&#xff1a;char * &#xff0c;用法如下&#xff1a; 下面我们通过一道试题来加深理解&#xff1a; 看着这个运行结果&#xff0c;是不是跟自己心中预想的答案有一些出入呢&#xff1f;下面为诸君解读一下&…

VS中.NET项目中央包管理和多目标框架配置

引言 通常我们在做项目时会给不同的程序员分配不同的功能模块进行各自开发&#xff0c;当然要遵守一定的约定或同一的框架设计。这在同一个工程中就会出现不同的项目类库需要引用&#xff0c;而这些类库可能会引用一些Nuget包&#xff0c;对于这些包的管理如果都在每个项目中去…

凸优化学习(1)——什么是凸优化、凸集、凸函数

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

铲屎官都该知道的除浮毛神器——希喂、美的、352宠物空气净化器

为什么明明在南方&#xff0c;却能感受到北方柳絮漫天飞舞&#xff0c;鼻子被堵住的感觉&#xff1f;这都是家里的猫咪在作怪。最近我感觉家里的空气特别闷&#xff0c;打开窗户通风了很久都没什么用就没去管了。早上起来的时候鼻子异物感很重&#xff0c;甚至还咳嗽不止&#…

Android TextView 学习备忘

android:gravity 与 android:layout_gravity&#xff1a; Android TextView文本位置_mob649e8166858d的技术博客_51CTO博客https://blog.51cto.com/u_16175509/8597723

【重学 MySQL】三、RDBMS 和非 RDBMS

【重学 MySQL】三、RDBMS 和非 RDBMS 关系型数据库&#xff08;RDBMS&#xff09;关系型数据库的核心概念关系型数据库的优点关系型数据库的缺点 非关系型数据库&#xff08;非 RDBMS&#xff09;定义与特点主要特点常见类型应用场景优缺点NoSql 的演变早期阶段&#xff08;20世…

langgraph tool如何发送自定义事件

在工具调用过程中&#xff0c;如何将中间状态返回到的stream&#xff0c;可以使用from langchain_core.callbacks import dispatch_custom_event方法实现。示例如下 from langchain_core.callbacks import dispatch_custom_event from langchain_core.tools import tooltool d…

分布式技术概览

文章目录 分布式技术1. 分布式数据库&#xff08;Distributed Databases&#xff09;2. 分布式文件系统&#xff08;Distributed File Systems&#xff09;3. 分布式哈希表&#xff08;Distributed Hash Tables, DHTs&#xff09;4. 分布式缓存&#xff08;Distributed Caching…

QT 联合opencv 易错点

https://blog.csdn.net/qq_51699436/article/details/135777911 网上已经有大量优秀切详尽的文章来讲述QT联合opencv了&#xff0c;我把容易出错的点列出来备忘 1、在进行opencv进行编译时&#xff0c;要确认好是32位还是64位&#xff0c;因为在创建QT项目的时候QT和opencv要匹…

Vue(7)——工程化开发

目录 工程化开发 组件化开发 普通组件的注册使用 局部注册 全局注册 组件三大组成部分说明 template style script 组件通信 父子关系 prpo prpos校验 类型校验 其他校验 prop与data、单向数据流 工程化开发 工程化开发模式&#xff1a;基于构建工具的环境…