linux----进程地址空间


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、空间分布

二、栈和堆的特点

(1)栈堆相对而生,堆是向上增长的,栈是向下增长的。

验证:堆是向上增长的

这里我们看到申请的堆,依次进行申请,堆的地址是向上增长的。

栈:向下增长(32位机器和64位机器)

验证:

这里为什么说要32位机器。对64位机器来说,栈是向下增长的,这个说法也许是不正确的。

至于为什么,这个为什么?64位对内存的分布进行了改进。下面打印的结果和32位地址结果相反


三.物理内存和虚拟内存

上面我们提到内存的空间分布是真实的物理内存吗?

我们创建子进程,父子进程代码共享,当一方发生写入时,就会发生写实拷贝,父子进程数据独立。

 这里我们发现,父子进程打印的值是不同的,这里我们可以理解,但是地址为什么是一样的,一个内存地址一样,值不一样,说明这个不是真正的物理内存,这个是虚拟地址。

1.地址空间和区域划分

我们知道地址空间的大小是4GB,1GB是属于内核空间,3GB是用户空间,这里我们讨论是属于(用户空间的3GB)操作系统将这个3GB根据用户进程的需要进行分配,每个用户进程都对所分配的空间独立使用权,比如栈,堆中的一部分。地址空间就是大蛋糕,区域划分就是分蛋糕,分配的对象就是进程。

操作系统要对进程地址空间进行管理,在linux中地址空间就是一个内核数据结构:struc mm_struct{}。进程的task_struct里有个指针,指向这个struct mm_struct{}.

这个里面描述了,可以使用的地址空间的范围。起始地址和结束地址之间的都是可以被使用的区域。

虚拟地址如何转换为物理内存?通过页表进行映射,这个过程是操作系统帮我们做的。

2.为什么要有虚拟地址空间

1.可以让申请的物理内存分布,通过虚拟地址让无序变为有序。

2.可以有效的进行安全检查,页表中其实还有权限字段,规定了数据是否可读可写。字符常量区权限就是只读,如果发生修改的转化,编译器识别到就会显示错误。

 3.将进程管理和内存管理进行解耦。

内存管理是操作系统帮我们做的,申请内存(分配),填充数据或者加载程序(是否有内容)。一个进程如果要对物理内存进行访问,首先要通过虚拟地址,在cpu中寄存器CR3中存储者页表的物理地址,硬件MMU进行虚拟到物理转化的过程中,先要通过页表字段查看内存是否分配和内存是否有内容,没内容或者被分配,这个进程就会被停止访问内存,将操作权限转交给操作系统,这时操作系统就会进行内存的分配和填充数据或者程序,将虚拟内存映射到分配的物理内存,这个过程也叫缺页中断,分配填充完,进程就可以继续访问。进程不参与内存管理,操作系统管理内存分配。

总结:一个进程有自己的页表,自己的空间地址,有自己的task_struct.进程的独立性通过页表的虚拟地址映射物理地址来体现。进程的切换也是不影响其他进程,因为进程的上下文数据在切换时就会被进程带走包括寄存器的内容,等到进程重新被调度,恢复上下文数据包括寄存器中的进程原来的内容。

3.如何理解父子进程变量地址相同而值不同

fok()创建子进程,子进程要以父进程为模板拷贝页表,地址空间。如果一方发生写入的时候,操作系统就会修改页表重新将物理内存映射到虚拟地址上,这也为什么上面的同一个变量打印的虚拟地址是相同的,值是不一样的。真实的物理地址我们是看不到,c++/或者c,我们可以看到的都是虚拟地址。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记一次Windows状态栏不显示问题

文章目录 🪟解决方案☁️单次处理☁️有效处理 🪟现象🪟尝试的操作⭐END🌟跋🌟交流方式 🪟解决方案 ☁️单次处理 重启explorer.exe 命令行操作 注意,使用命令行操作的时候,出现…

链动 2+1 模式 S2B2C 商城小程序源码:创新价格盈利模式探索

摘要:本文深入探讨了价格盈利模式的两种类型,即价格返利模式和动态定价盈利模式。通过引入链动 21 模式 S2B2C 商城小程序源码,分析其在实现这两种价格盈利模式方面的优势和应用场景,为朋友圈卖货及电商领域的发展提供新的思路和方…

QT菜单之快捷菜单设计

快捷菜单又称为上下文菜单,通常在用鼠标右击的时候弹出。创建快捷菜单的方法和创建菜单栏菜单类似。 效果图: 一、将MainWindow类对象的ContextMenuPolicy属性设置为customContextMenu。 打开mainWindow.ui,在属性视图上找到ContextMenuPoli…

一文掌握python单元测试unittest(二)

接上篇:https://blog.csdn.net/qq_38120851/article/details/141642215 目录 四、参数化测试 1、使用 subTest 2、使用装饰器 3)使用第三方库parameterized 五、跳过测试 1、使用 unittest.skip() 或 unittest.skipIf() 装饰器: 2、使用 setUp() 方法中的断言来跳过整…

EasyCVR智慧公园视频智能管理方案:赋能公园安全管理新高度

随着城市化进程的加速,智慧城市建设已成为提升城市管理效率、增强居民生活质量的重要途径。智慧公园作为智慧城市的重要组成部分,其安全与管理水平直接影响着市民的休闲娱乐体验。EasyCVR智慧公园视频智能管理方案,正是基于这一背景应运而生&…

Android 车载应用开发指南 - CarService 详解(下)

车载应用正在改变人们的出行体验。从导航到娱乐、从安全到信息服务,车载应用的开发已成为汽车智能化发展的重要组成部分。而对于开发者来说,如何将自己的应用程序无缝集成到车载系统中,利用汽车的硬件和服务能力,是一个极具挑战性…

【Docker】01-Docker常见指令

1. Docker Docker会下载镜像,运行的时候,创建一个隔离的环境,称为容器。 docker run -d \ # 创建并运行一个容器,-d表示后台运行 --name mysql \ # 容器名称-p 3307:3306 \ # 端口映射,宿主机端口映射到容器端口-e TZ…

Cilium + ebpf 系列文章-什么是ebpf?(一)

前言: 这篇非常非常干,很有可能读不懂。 这里非常非常推荐,建议使用Cilium官网的lab来辅助学习!!!Resources Library - IsovalentExplore Isovalents Resource Library, your one-stop destination for ins…

linux命令:显示已安装在linux内核的模块的详细信息的工具modinfo详解

目录 一、概述 二、使用方法 1、基本的使用语法 2、常用选项 3、输出字段 4、获取帮助 三、示例 四、实际用途 1、诊断问题 2、模块依赖 3、参数配置 五、其他事项 一、概述 modinfo 是 Linux 系统中的一个工具,用于显示有关已安装内核模块的详细信息。…

中间件:maxwell、canal

文章目录 1、底层原理:基于mysql的bin log日志实现的:把自己伪装成slave2、bin log 日志有三种模式:2.1、statement模式:2.2、row模式:2.3、mixed模式: 3、maxwell只支持 row 模式:4、maxwell介…

MySQL多版本并发控制MVCC实现原理

MVCC MVCC 是多版本并发控制方法,用来解决读和写之间的冲突,比如脏读、不可重复读问题,MVCC主要针对读操作做限制,保证每次读取到的数据都是本次读取之前的已经提交事务所修改的。 概述 当一个事务要对数据库中的数据进行selec…

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后: MyBatis 的官方文档:https://mybatis.p2hp.com/ 关于 MyBa…

828华为云征文|使用Flexus X实例安装宝塔面板教学

目录 一、Flexus X实例简介 1.1 概述 1.2 产品规格 二、切换操作系统 2.1 Huawei Cloud EulerOS 2.0 标准版 2.2 切换镜像 三、部署宝塔面板 3.1 安装宝塔面板 3.2 放通安全组规则 3.3 登录宝塔面板 四、使用感受 4.1 柔性算力随心配 4.2 一直加速一直快 4.3 越用…

【小程序】微信小程序课程 -2 快速上手

目录 1、快速上手基本概念 1.1 小程序常用组件 1.2 tabbar配置 1.3 尺寸单位 1.4 样式 1.4.1 全局样式 app.wxss 1.4.2 局部样式 xx.wxss 2、首页案例 2.1 button组件使用 2.2 swiper swiper-item 2.3 tips效果 2.4 引入矢量图 2.5 flex(布局&#…

Java中List、ArrayList与顺序表

List、ArrayList与顺序表 List什么是List常用方法介绍List的使用 ArrayList与顺序表线性表顺序表接口的实现 ArrayList简介ArrayList的使用ArrayList的构造ArrayList的常见操作ArrayList的遍历ArrayList的扩容机制 ArrayList的具体使用杨辉三角简单的洗牌算法 ArrayList的问题及…

2024.9.26 作业 +思维导图

一、作业 1、什么是虚函数?什么是纯虚函数 虚函数:函数前加关键字virtual,就定义为虚函数,虚函数能够被子类中相同函数名的函数重写 纯虚函数:把虚函数的函数体去掉然后加0;就能定义出一个纯虚函数。 2、基…

前台项目启动/打包报错 Error: error:0308010C:digital envelope routines::unsupported

在package.json中修改启动/打包语句 如图,我这里是打包时候报错,就在build里前面加上 set NODE_OPTIONS--openssl-legacy-provider && 再次打包,成功。

刷题计划 day10 栈与队列上【用栈实现队列】【用队列实现栈】【有效的括号】【删除字符串中的所有相邻重复项】

⚡刷题计划day10栈与队列继续,可以点个免费的赞哦~ 往期可看专栏,关注不迷路, 您的支持是我的最大动力🌹~ 目录 ⚡刷题计划day10继续,可以点个免费的赞哦~ 往期可看专栏,关注不迷路, 您的…

Vue引入js脚本问题记录(附解决办法)

目录 一、需求 二、import引入问题记录 三、解决方式 一、需求 我想在我的Vue项目中引入jquery.js和bootstrap.js这种脚本文件,但发现不能单纯的import引入,问题如下。 二、import引入问题记录 我直接这么引入,发现控制台报错TypeError: …

使用kaggle命令下载数据集和模型

点击用户头像,点击Settings: 找到API,点击create new token,将自动下载kaggle.json: 在用户目录下创建.kaggle文件夹,并将下载的kaggle.json文件移动到该文件夹: cd ~ mv Downloads/kaggle.j…