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是用来…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
