【进程地址空间】

目录

  • 上层用户看到的地址
    • 父进程创建子进程对代码区的同一变量修改
  • 进程地址空间
    • 进程地址空间需要划分
  • 页表

上层用户看到的地址

一个系统中的进程是与其他进程共享内存和CPU的。如果某个进程不小心写入另一个使用该内存的进程,进程就可能以某种完全和程序逻辑无关的方式运行,造成进程崩溃。

父进程创建子进程对代码区的同一变量修改

在这里插入图片描述
父进程创建子进程,刚开始子进程要继承父进程的代码和数据,没有其他的代码和数据。父进程的资源都是给子进程共享的。我们发现父子进程对同一变量num进行不一样的操作,且相互不影响,因为进程是相互独立的,但是取地址发现他们的地址变量是一致的。着就说明了父子进程对应的全局num的取地址变量不是真实的物理地址,是虚拟的地址。这是因为父进程创建子进程的时候,拷贝了父进程的一个表,叫进程地址空间。因为是拷贝的,所以他们虚拟地址一样,上层用户看到同样的地址,实际上,进程还要通过一个叫页表的表来映射虚拟地址和物理内存的关系,一旦父子进程对数据有修改的操作,操作系统会为第一个改变数据的进程在物理地址重新找到一个可以使用的物理内存,改变页表的映射关系。这样进程就保证了独立性。
在这里插入图片描述
页表映射到物理内存是随机的。不会在意分别的规则。

进程地址空间

在这里插入图片描述
栈向下使用,堆向上使用

上述图片不是进程的内存,是保存了进程的代码和数据的地址的一张线性表,从下往上增加,都是地址数据。这是为了有效管理主存的一个抽象概念。当程序运行的时候,程序的代码和数据在进程中其实已经被编译成为一系列的指令地址来对应代码和数据。进程地址空间有效的对物理内存进行了保护。在Linux系统的虚拟内存就是上图组织的,系统为每个进程创建这样的一个虚拟内存。计算机通过虚拟内存加偏移量来寻找内存位置。

进程地址空间需要划分

进程需要被描述成一个task_struct结构体对象,并以一定的数据结构来对进程进行管理,进程地址空间也应该如此,Linux进程地址空间其实就是进程task_struct结构体的一个对象,叫mm_struct。

在这里插入图片描述

引用深入理解计算机系统

struct task_struct {//进程控制块//....................//....................struct mm_struct *mm, *active_mm;//....................
}
struct mm_struct {//进程地址空间struct vm_area_struct * mmap;	
}
struct vm_area_struct {//进程地址空间的划分struct mm_struct * vm_mm;	/* The address space we belong to. *///属于哪个进程地址空间unsigned long vm_start;		/* Our start address within vm_mm. *///起始位置unsigned long vm_end;		/* The first byte after our end addresswithin vm_mm. *///结束位置的第一个字节/* linked list of VM areas per task, sorted by address */struct vm_area_struct *vm_next;//链表结构组织
}

vm_area_struct结构体会对进程地址进行划分,如果计算机为32位,进程地址空间就会有4GB,vm_area_struct会对这4GB空间大小进行划分。划分是为了更好的管理内存,把有序的进程地址空间通过页表映射的方式找到无序物理内存。更好的管理内存空间。更安全的使用内存。进程管理和内存管理解耦。
得出结论:进程地址空间被描述为一个结构体对象,是进程task_struct的一个对象,然后以链表形式组织起来。

页表

页表存在于物理内存的一个页表条目数组(Page Table Entry,PTE),页表的作用是让物理内存和虚拟地址有映射的关系。 每个进程都有自己的独立页表,且页表不仅仅只是一份。虚拟内存地址和物理内存地址之间需要一个叫MMU(内存管理单元)的硬件进行翻译。每个页表都有一个标记为,标记为位0或1,如果位1,表示虚拟内存有映射到物理内存的关系是否存在。一个进程有一个一级页表和可能多个的二级页表。在一个32位的计算机当中,在32个bit位当中,前10个bit位做为一级页表的映射关系,但一级页表不映射到物理内存,映射到二级页表当中,10个bit位可以映射1024个二级页表,然后二级页表用继续用10个bit位计算,就可以映射到物理地址,每个二级页表也可以映射1024个物理地址空间,然后1024个二级页表一起就可以映射到1024 * 1024 个物理地址空间。在物理内存当中,以4GB
的为例,内存会以4KB位大小的页框来划分该物理内存。就会有1024*1024个页框。后12位的bit则表示的是偏移量。
在这里插入图片描述

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

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

相关文章

Apache Commons开源的工具库介绍

Apache Commons 是 Apache 软件基金会主持的一个项目,旨在提供一系列可重用的 Java 组件。这些组件覆盖了从数据封装、文本处理到网络通信等各个方面,是 Java 开发中常用的一系列工具库。Apache Commons 项目下的各个库通常以 "commons-" 开头…

css3实现动画无限循环

要在CSS3中实现动画的无限循环,你可以使用animation 属性和 infinite 关键字。以下是一个示例: keyframes myAnimation {0% { /* 起始状态 */ }50% { /* 中间状态 */ }100% { /* 结束状态 */ }}.element {animation: myAnimation 2s infinite; /* 设置动…

团簇束流沉积技术:氢气传感器守护安全与环境的利器

在当今日益增长的能源需求背景下,氢气作为一种清洁、高效的能源载体,正逐渐受到广泛关注。然而,氢气的易燃易爆特性也带来了不小的安全隐患。因此,精确、快速地监测氢气泄漏成为了确保生产安全和环境监测的重中之重。基于团簇束流…

《凤凰架构》 -分布式事务章节 读书笔记

分布式事务严谨的定义:分布式环境下的事务处理机制 CAP定理:在一个分布式系统中,涉及共享数据问题时,以下三个特性最多只能同时满足两个 一致性:代表数据在任何时刻、任何分布式节点中看到的都是符合预期的&#xff0…

HarmonyOS创建一个ArkTS卡片

创建一个ArkTS卡片 在已有的应用工程中,创建ArkTS卡片,具体操作方式如下。 创建卡片。 根据实际业务场景,选择一个卡片模板。 在选择卡片的开发语言类型(Language)时,选择ArkTS选项,然后单…

【LNMP】云导航项目部署及环境搭建(复杂)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍1.1项目环境架构LNMP1.2项目代码说明 二、项目环境搭建2.1 Nginx安装2.2 php安装2.3 nginx配置和php配置2.3.1 修改nginx文件2.3.2 修改vim /etc/p…

制造业客户数据安全解决方案(数据防泄密需求分析)

机械行业是历史悠久的工业形式,与国民经济密切相关,属于周期性行业,是我国最重要的工业制造行业之一。即使网络经济与IT信息技术在世界范围内占据主导地位,依然离不开一个发达的、先进的物质基础,而机械行业正是为生成…

【kubernetes】二进制部署k8s集群之,多master节点负载均衡以及高可用(下)

↑↑↑↑接上一篇继续部署↑↑↑↑ 之前已经完成了单master节点的部署,现在需要完成多master节点以及实现k8s集群的高可用 一、完成master02节点的初始化操作 二、在master01节点基础上,完成master02节点部署 步骤一:准备好master节点所需…

Three.js加载PLY文件

这是官方的例子 three.js webgl - PLY 我在Vue3中使用&#xff0c;测试了好久始终不显示点云数据。在网上查询后发现ply文件要放置在public目录下才行 <el-row><el-button type"primary" class"el-btn" click"IniThree1">PLY</…

docker部署seata1.6.0

docker部署seata1.6.0 Seata 是 阿里巴巴 开源的 分布式事务中间件&#xff0c;解决 微服务 场景下面临的分布式事务问题。需要先搭建seata服务端然后与springcloud的集成以实现分布式事务控制的过程 &#xff0c;项目中只需要在远程调用APi服务的方法上使用注解 GlobalTransa…

使用logicflow流程图实例

一.背景 需要使用流程引擎开发项目&#xff0c;没有使用flowable、activiti这类的国外流程引擎&#xff0c;想使用国内的引擎二次开发&#xff0c;缺少单例模式的流程画图程序&#xff0c;都是vue、react、angluer的不适合&#xff0c;从网上找了antx6、logicflow、bpmn.js。感…

架构设计:数据库扩展

引言 随着业务的发展和用户规模的增长&#xff0c;数据库往往会面临着存储容量不足、性能瓶颈等问题。为了解决这些问题&#xff0c;数据库扩展成为了一种常见的解决方案。在数据库扩展的实践中&#xff0c;有许多不同的策略和技术可供选择&#xff0c;其中包括水平拆分、垂直…

【MySQL 探索之旅】初始MySQL数据库

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

【LeetCode每日一题】 单调栈的案例84 柱状图中最大的矩形

84 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释…

Conmi的正确答案——将JAVA中maven的.m2文件夹放到D盘

系统&#xff1a;WIN11 1、将.m2文件夹移动到D盘 移动后&#xff1a; 2、创建目录链接 mklink /j "C:\Users\Administrator\.m2" "D:\.m2"至此&#xff0c;maven默认的jar包会加载到D盘的.m2文件夹

Ubuntu环境安装MySQL数据库

1.安装过程 打开终端&#xff08;Terminal&#xff09;窗口&#xff0c;使用以下命令更新系统软件包&#xff1a; sudo apt update ubuntu环境安装mysql-server和mysql开发包&#xff0c;包括mysql头文件和动态库文件&#xff0c;命令如下&#xff1a; sudo apt-get instal…

vue复用组件出现data-v-xxx乱码无法通过css修改指定样式

vue复用组件出现data-v-xxx乱码无法通过css修改指定样式解决方案如下 选择需要修改的样式 给最高级父级元素定义新的classname 与原有样式保持相同级联 修改指定样式 .demo_parent .demo_son .demo_grandson[data-v-73a2ee76]{ padding: 0; border-radius: 3px; background: #…

分享数字孪生潭江流域建设与实践论文

数字孪生潭江流域建设 广东省水利厅 以支撑江门市沿线水工程精准联调联控&#xff0c;提升水旱灾害防御能力为首要任务&#xff0c;融合多信息源预报、GIS等技术&#xff0c;建立气象-水文-水动力集一体的复杂流域入库径流预报及其洪涝延伸预报模型平台&#xff0c;构建具有“…

HTMLElement.click()的回调触发踩坑

先看看以下代码 const el document.getElementById("btn") el.addEventListener("click", () > {Promise.resolve().then(() > console.log("microtask 1"));console.log("1"); }); el.addEventListener("click", (…

Spring Boot 手写starter!!!

原因&#xff1a;为什么要手写starter&#xff1f;&#xff1f;&#xff1f; 原因&#xff1a;简化功能。 实例&#xff1a;以分页为例&#xff1a;写一个starter。 1.首先定义一个PageX注解。 Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented p…