Linux进程--进程地址空间
文章目录
- 一、进程地址空间
- 1.想当然的内存
- 2.实际的内存
- 1.什么是地址空间
- 2.地址空间和内存
- 3.为什么要区分两种内存
一、进程地址空间
1.想当然的内存
我们在之前的学习中了解过内存的概念,所以变量都要存在内存中我们的程序才能跑起来,那么我们肯定也见过如下的示意图。
这个图是我们在之前c语言学习的时候用来了解变量存储时观看的示意图。其中,整个地址空间的方向是从下到上地址逐渐增大的,栈区在堆区之上,两个区域对向占用空间。
然后我们来实践一个奇怪的现象。
1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5 int val=100;6 printf("this is oid val add: %p\n",&val);7 printf("this is oid val : %d\n",val);8 int d=fork(); 9 if(d<0)10 {11 printf("开辟失败\n");12 return 0;13 }14 else if(d==0)15 {16 val=200;17 printf("this is new son :%d\n",val);18 printf("this is new son add:%p\n",&val);19 }20 else21 {22 printf("this is new dad :%d\n",val);23 printf("this is new dad add:%p\n",&val);24 }25 return 0;26 }
~
我们在xshell中运行这一段代码,我们来观察观察父子进程的公共变量的地址。
我们在运行之后,输出了这一段内容,让我们大为震惊。其中可以确定的是父子进程公共变量的地址从两个进程中访问到的变量地址都是相同的,但是在变量内容发生改变的时候,从进程中查询到的地址数值竟然没有发生变化,并且在同一块地址竟然存储了两个数值,在我们的认知中,同一块物理内存是不可能存储两个数值的,所以我们断定,这个查询显示的并不是真实的物理内存空间!
2.实际的内存
实际上我们查询和分配的都不是真正的物理内存,而是一个虚拟进程地址空间。接下来我们就来详细了解了解地址空间。
1.什么是地址空间
每个进程都有自己的地址空间,也就是我们平常学习语言中所用到的所谓的地址,其本质就是一个数据结构,我们通过示意图来看。
其中地址空间就是我们用整形数字进行分界划分,每个区域都有自己相应存储的数据类型。数据表面是存储在地址空间中,实际上是存放在内存中。
其中每个进程的地址空间也都需要进行管理,于是我们在pcb中会存有地址进程空间指针,并且每个进程地址空间之间也会以链表的形式链接。
2.地址空间和内存
地址空间和内存中间通过一个映射表进行联系,这个映射表就是页表,通过页表我们的地址空间可以转换为真正的物理空间地址,存在一一对应的关系。每个进程的页表也是通过链表的形式进行连接,方便进行统一管理,同时为了保护物理内存我们的页表也是存放在CPU的寄存器中。
此时上面这段代码执行出现的情况我们就可以进行解释了:
我们在进行子进程的创建之后,我们的进程地址空间和页表都是进行浅拷贝的。也就是说在子进程刚创建好的时候,父子进程所有物理内存的地址都是共享的。可代码中,我们明明实现了变量的修改,应该会发生写时拷贝啊,为什么最后查看两个值的地址仍然是相同的呢?
这是因为进程的工作都是独立的,在创建完进程之后,我们修改变量确实是会发生写时拷贝,但是并不会改变子进程页表中的左值,只会改变右值,也就是说,实际上真正的物理内存地址已经发生改变了,只不过虚拟地址空间没有改变而已!
3.为什么要区分两种内存
让用户操作虚拟内存有下面几个好处:
- 将物理内存的管理从无序变为有序,如果是直接从物理内存上申请空间,申请的地址顺序大概率是无序的,但是进程地址空间的内存都是划分好范围,并且在申请时有严格的顺序的,比如栈区从上往下,堆区从下往上。
- 将内存管理和进程管理进行解耦,进程管理就是进程中的数据的修改,都是在页表左侧,通过虚拟地址进行,不用考虑物理内存中的顺序等等问题。内存管理就是进程执行前,提前将磁盘中的代码和数据等等复制到内存中,当需要进行开辟空间时,开辟空间也不影响左侧的进程管理。
- 保护物理内存,防止非法操作,比如野指针等等操作。
- 提高效率,一些没有必要的内存管理操作我们可以延后执行,节省时间,比如malloc和new操作,系统并不会立即去物理内存中去给你分配,而是通过先在虚拟地址分配,当你即将写入或者其他使用用途时,再真正去物理内存中分配的方法提高效率。
说到这里,我们的进程内容又得到了充实,目前看来一个进程包括他的内核数据结构和代码数据部分,其中内核数据结构包括pcb,进程地址空间和页表三个部分,对于子进程来说,内核数据结构除了pcb中特殊的一些属性之外,其余都是复制父进程。代码是共享部分和自己用if-else划分出来的一部分,数据只有写时拷贝部分。
创作不易,感谢阅读!
相关文章:

Linux进程--进程地址空间
文章目录 一、进程地址空间1.想当然的内存2.实际的内存1.什么是地址空间2.地址空间和内存3.为什么要区分两种内存 一、进程地址空间 1.想当然的内存 我们在之前的学习中了解过内存的概念,所以变量都要存在内存中我们的程序才能跑起来,那么我们肯定也见…...

C语言传递指针给函数
C 语言允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值 实例1:获取系统的时间值 能接受指针作为参数的函数,也能接受数…...

探索 Kubernetes 持久化存储之 Rook Ceph 初窥门径
在 Kubernetes 生态系统中,持久化存储是支撑业务应用稳定运行的基石,对于维护整个系统的健壮性至关重要。对于选择自主搭建 Kubernetes 集群的运维架构师来说,挑选合适的后端持久化存储解决方案是关键的选型决策。目前,Ceph、Glus…...
今日(2024 年 8 月 13 日)科技新闻
我国成功发射卫星互联网高轨卫星:该卫星的成功发射将助力我国卫星互联网的发展。中国首台中子全散射谱仪运行 3 年成果丰硕:由粤港科技合作打造的多物理谱仪,在中国散裂中子源上运行 3 年来,已完成 300 多项用户实验。该谱仪的关键…...

Unity大场景切换进行异步加载时,如何设计加载进度条,并配置滑动条按照的曲线给定的速率滑动
一、异步加载场景的过程 1、异步加载场景用到的API LoadSceneAsync 2、异步加载的参数说明 (1)默认参数:SceneManagement.LoadSceneAsync(“SceneName”); AsyncOperation task SceneManager.LoadSceneAsync("SceneName");&a…...
Selenium + Python 自动化测试16(Python基础复习)
我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。 上一篇我们讨论了使用模块化测试的测试模型,从某一程度也反映出熟练掌握一门编程语言的重要性。 为了后续进一步深入学习。本篇文章主要做下Python基础知识的复习。…...

2024新型数字政府综合解决方案(六)
新型数字政府综合解决方案通过融合人工智能、大数据、区块链和云计算技术,构建了一个全方位智能化的政务平台,旨在提升政府服务的效率、透明度和公众参与度。该方案实现了跨部门的数据互联互通与实时更新,利用先进的数据分析和自动化处理技术…...

vscode的C/C++环境配置和调试技巧
目录 1.背景 2.下载编译器 3.配置环境变量 4.安装C/C插件 5.写C语言代码并且编译成功 5.1文件操作 5.2对于两个窗口的解释 5.3C语言编译环境配置 6.创建执行文件 7.编译运行过程 8.写其他的代码的解决方案一 9.写其他的代码的解决方案二 10.同时编译多个.c文件 10…...

Python制作《扫雷》游戏-附源码,轻松看懂,简单易学
今天介绍另一款经典小游戏,扫雷,这个应该是很多人windows电脑里玩的最多的游戏了,乐趣很多,而且还有一定的技术含量在里面,今天我们就来通过python实现这个小游戏。 创建扫雷文件 打开pycharm,创建一个名…...

8路VBO转HDMI2.0支持4K60频率ITE6265芯片方案心得分享
在此之前,有人找到我这边询问能不能将智能电视主板改成机顶盒,将VBO信号转换输出位HDMI进行投屏,具体应用奇奇怪怪!但是奈何是甲方大佬。认命照做。从网上也有搜索了解过这类芯片,发现资料很少,所以有了这篇…...

【问题解决3】【已解决】Cannot determine path to‘tools.jar‘libraryfor17
前几天在IDEA运行JAVA项目时,出现这个报错。 这是因为是这个笔记本上安装的IDEA版本是“IntelliJ IDEA 2020.3.1”,与JDK17版本不兼容,这种情况下要想使得IDEA版本与JDK版本兼容,就需要升级IDEA版本或者使用JDK较低版本ÿ…...

基于Spring Boot的高效宠物购物平台
✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...

【Vue3】路由基础
【Vue3】路由基础 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本…...

掌握网络数据的钥匙:Python Requests-HTML库深度解析
文章目录 掌握网络数据的钥匙:Python Requests-HTML库深度解析背景:为何选择Requests-HTML?什么是Requests-HTML?如何安装Requests-HTML?5个简单库函数的使用方法3个场景下库的使用示例常见Bug及解决方案总结 掌握网络…...
网络安全: 模型的脆弱性,鲁棒性和隐私性
在网络安全领域,通常描述模型安全性时,会提到以下三个特性: 脆弱性(Vulnerability):指模型在某些情况下容易受到攻击或被利用的弱点。例如,模型可能对对抗性攻击或梯度泄露攻击敏感。 鲁棒性&a…...

【go语言】go-webview2用法(持续更新)
文章目录 背景核心接口和方法扩展接口遗憾的是 背景 目前为止,已经有很多优秀的electron应用。但其特点也很明显:使用htmlcssjs构建的布局很精致,但是体积不容小觑(最新版electron-egg打包出来的程序已经300MB)。 vs…...

KNN 图像识别
KNN(K-Nearest Neighbors,K最近邻)算法是一种简单而有效的分类算法,也可以用于图像识别。它的基本思想是通过计算样本之间的距离,将待分类的样本归为其在训练集中最相近的K个样本所属的类别中最常见的类别 1. 准备工作…...
基于STM32和云平台的花卉养护系统设计(微信小程序)(209)
文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】选题背景【6】国内外技术发展现状1.4 开发工具的…...

编程语言进化史
编程语言多到你想象不到。 图片来自: 程序设计语言概念 发展历史 自从1946年冯诺依曼原理被提出,计算机数据和指令是通过二进制形式以及后来的汇编语言(二进制助记符),但依然没有改变容易出错的本质。1951年Rutishauser提出的用编译程序实现高级语言的思…...

vuex的原理和使用方法
简介 Vuex 是 Vue.js 应用的状态管理模式,它为应用内的所有组件提供集中式的状态(数据)管理。可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。 Vuex的构成 state:state 是 Vuex 的数据中心,也就是说state是用来…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...