【Linux】进程地址空间
文章目录
- 🎪 进程地址空间
- 🚀1.写时拷贝与虚拟地址
- 🚀2.地址空间引入
- 🚀3.地址空间的意义
- ⭐3.1 虚拟地址寻址
- ⭐3.2 虚拟地址意义
🎪 进程地址空间
地址空间(address space)表示任何一个计算机实体所占用的内存大小。比如外设、文件、服务器或者一个网络计算机。地址空间包括物理空间以及虚拟空间。在32位平台下,程序地址空间大小是2^32也就是4GB.

补充:
命令:
set / unset
功能:查看环境变量 / 取消用户环境变量
set可以显示当前用户环境变量(通常比env显示的更详细),unset可以取消用户自己设置的本地变量和环境变量
🚀1.写时拷贝与虚拟地址
先来看一段测试代码:
test.c:
#include <stdio.h>
#include <assert.h>
#include <unistd.h>int g_value = 100; //全局变量int main()
{pid_t id = fork();assert(id >= 0);if(id == 0){//childwhile(1){printf("我是子进程, 我的id是: %d, 我的父进程是: %d, g_value: %d, &g_value : %p\n",\getpid(), getppid(), g_value, &g_value);sleep(1);g_value=200; // 只有子进程会进行修改}}else{//fatherwhile(1){printf("我是父进程, 我的id是: %d, 我的父进程是: %d, g_value: %d, &g_value : %p\n",\getpid(), getppid(), g_value, &g_value);sleep(1);}}
}

可以看到对于全局变量g_value,父子进程的地址相同,即使子进程改变了g_value的值,父进程的该变量值依然没变,而且地址也跟子进程一样!所以说该地址是物理地址吗?如果是,那么怎么可能对于同一个地址,读取到不同的数值?显然,我们语言级别上打印出来的地址绝对不是物理地址,而是——虚拟地址,关于写时拷贝和虚拟地址已经讲过——进程描述与进程状态.
🚀2.地址空间引入
假如有一个大富翁,他总共有10亿的资产,他一共有四个私生子,他对每个私生子说以后等他老了,就把这10亿的资产送给他,可实际上这真能实现吗,这其实也是我们所说的画饼,每个私生子并不知道其它人的存在,每个人都以为自己将来能继承10亿的资产。

实际上,操作系统也是如此,操作系统也就是大富翁,而内存就是它拥有的资产,而私生子就是进程,在每个进程的视角看来,它们都是独自享有所有的内存,可实际上这是操作系统为它们画的饼,而这个饼也就是进程地址空间,也被称为虚拟地址、线性地址,在Linux下叫struct mm_struct
那么上图中的堆区,栈区,代码区,数据区该如何理解呢?每个进程分的地址空间,实际上就是对线性地址空间的划分,即:
struct area{int start;int end;
}
即对线性地址空间的划分也就是对结构体内start和end的修改,栈区的向下调整和堆区的扩大即修改对应的边界值
🚀3.地址空间的意义
地址空间相当于一层媒介,它的本质实际上也是软件层,操作系统先通过虚拟地址找到物理地址。
⭐3.1 虚拟地址寻址
虚拟地址最终会转换为物理地址,那么是怎么转换的呢?

这样便对我们上面的例子有了解释,子进程在修改g_value的值的时候,操作系统会写时拷贝,即将该变量拷贝到一块新的物理地址上,但是虚拟地址并没有发生变化,而寻址的过程是OS通过虚拟地址,查找页表和MMU(内存管理单元),,通过其映射到两块不同的物理地址块上
而fork()函数的双返回值问题也就有了答案,返回的本质就是写入,谁先返回,OS就让谁通过虚拟地址发生写时拷贝
⭐3.2 虚拟地址意义
为什么要有地址空间呢?原因有以下三点:
1. 防止地址随意访问,保护物理内存与其他进程
试想,如果没有地址空间,那么进程的PCB指针就会随意的访问内存,如果因为人工代码失误,造成野指针问题,恰好访问了另一个进程的物理内存,修改了下一个进程的数据,那么就可能导致该进程故障,安全性较低.
而有了虚拟地址,即使恶意访问,页表在寻址的时候也会匹配该物理块是否能被该用户访问,如果不能,页表将会终止访问,这时,我们的编译器控制台就会提示野指针越界,所以,虚拟地址的引入提高了安全性.
2. 将进程管理与内存管理进行解耦合
我们先思考一个问题,当向系统申请空间的时候,OS是立即分配给你,还是需要的时候再给你?
- OS一般不允许任何的浪费或者不高效
- 进程在申请内存后不一定立马使用
- 在申请成功后,如果这个进程不立即使用,那么是不是在这一段时间内就会有一小段物理块处于闲置状态(自己不用,其它进程也不能用)
如果不止一个进程这样,成千上万个进程都这样,是不是就会造成大量内存空间的浪费,所以,当我们使用malloc分配空间的时候,OS一般不会立即分配给你,而是在虚拟地址上分配一块空间,但实际上这块空间并没有映射到物理地址上,而是在使用的时候页表才会映射到物理内存上分配空间。这就实现了进程管理和内存的管理的解耦合
3. 可以让进程以统一的视角,看待自己的数据和代码
程序在被编译的时候没有被加载到内存,我们程序内部也是有地址的,这个地址也是虚拟地址,源代码在被编译的时候,就是按照虚拟地址空间的方式进行,对代码和数据早就已经编好了对应的编址.OS通过虚拟地址寻址找到代码和数据存放的物理地址,在进程的视角看来,自己都享有整个内存空间,视角相同,进程的代码和数据必须一直在内存吗?可以边加载边执行,因为有虚拟地址的空间的存在,需要加载到内存时缺页中断,换出内存
相关文章:
【Linux】进程地址空间
文章目录🎪 进程地址空间🚀1.写时拷贝与虚拟地址🚀2.地址空间引入🚀3.地址空间的意义⭐3.1 虚拟地址寻址⭐3.2 虚拟地址意义🎪 进程地址空间 地址空间(address space)表示任何一个计算机实体所…...
Qt音视频开发17-vlc内核回调拿图片进行绘制
一、前言 在众多播放器中,支持的种类格式众多,并支持DVD影音光盘,VCD影音光盘及各类流式协议,提供了sdk进行开发,这点是至关重要的,尽管很多优秀的播放器很牛逼,由于没有提供sdk第三方开发&…...
安装配置DHCP
本次实验采用CentOS71.检查在安装DHCP之前先使用rpm命令查看系统中已有的DHCP软件包rpm -qa | grep dhcp由此可知,系统中尚未安装DHCP软件包2.安装我们可以使用yum命令为系统安装DHCP软件包yum -y install dhcp安装完成后再次检查可以看到DHCP软件包3.配置dhcp配置文…...
MarkDown中写UML图的方法
目录序UML图之顺序图顺序图的四个要素关于消息箭头的语法Mermaid中顺序图的简单例子样例用小人表示对象为对象设置别名激活对象UML图之类图类图中常见的关系关于不同类型关系的语法Mermaid中类图的简单例子样例类定义的两种方式为类定义成员双向关系的表示多重性关系的表示UML之…...
Axure8设计—动态仪表盘
本次分享的的案例是Axure8制作的动态仪表盘,根据设置的数值,仪表盘指针旋转到相应的值位置 预览地址:https://2qiuwg.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87502161 一、制作原型 1、首先创建空白页…...
【C++】类和对象的六个默认成员函数
类的6个默认成员函数构造函数概念特性析构函数概念特性拷贝构造函数概念特征拷贝构造函数典型调用场景:赋值运算符重载运算符重载赋值运算符重载取地址及const取地址操作符重载类的6个默认成员函数 到底什么是类的6个默认成员函数呢?相信大家一定对此怀…...
4、算法MATLAB---认识矩阵
认识矩阵1、矩阵定义和基本运算1.1 赋值运算符:1.2 等号运算符:1.3 空矩阵1.4 一行一列矩阵1.5 行矩阵(元素用空格或逗号分隔)1.6 列矩阵(分号表示换行)1.7 m行n列的矩阵:行值用逗号间隔&#x…...
vue3+rust个人博客建站日记2-确定需求
反思 有人说过我们正在临近代码的终结点。很快,代码就会自动产生出来,不需要再人工编写。程序员完全没用了,因为商务人士可以从规约直接生成程序。 扯淡!我们永远抛不掉代码,因为代码呈现了需求的细节。在某些层面上&a…...
Linux安装云原生网关Kong/KongA
目录1 概述2 创建服务器3 安装postgres4 安装kong5 安装node6 安装KONGA1 概述 Kong Kong是一款基于OpenResty(NginxLua模块)编写的高可用、易扩展的开源API网关,专为云原生和云混合架构而建,并针对微服务和分布式架构进行了特别…...
Vue学习笔记(2)
2.1 事件处理 2.1.1 事件监听器 JavaScript:通过获取DOM对象再往DOM对象上使用addEventListener注册监听事件 const btn document.querySelector(#my-button) btn.addEventListener(click, function() {alert(点击事件!) })jQuery:通过$选择器绑定对象…...
2023年三月份图形化四级打卡试题
活动时间 从2023年3月1日至3月21日,每天一道编程题。 本次打卡的规则如下: 小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 小朋友做完题目后,截图到朋友圈打卡并把打卡的截图发到活动群…...
Python操作Excel
Python中对Excel文件的操作包括:读、写、修改。如果要对其进行如上的操作需要导入Python的第三方模块:xlrd、xlwd、xlutils,其分别对应Python的读、写、修改的操作 一、安装Python的第三方模块 二、操作Excel的基本步骤 1、导入响对应的模…...
Codeforces Round #853 (Div. 2) C. Serval and Toxel‘s Arrays【统计次数,算贡献】
链接 传送门 分析 这道题想法其实很简单,样例的计算方法一定要看懂。以样例1为例,根据他的操作方法可以得到两个新的数组,和一个原来的数组,总共三个数组。 1 2 3 4 2 3 4 5 3 他们两两配对去重,求出总的value。由于每…...
微信小程序-1:比较两数的大小
程序来源》微信小程序开发教程(第二章) 主编:黄寿孟、易芳、陶延涛 ISBN: 9787566720788 程序运行结果: <!--index.wxml--> <view class"container"> <text>第一个数字:&…...
数据结构——树
深度优先/广度优先遍历深度优先:访问根节点对根节点的 children 挨个进行深度优先遍历const tree {val: "a",children: [{val: "b",children: [{val: "d",children: [],},{val: "e",children: [],},],},{val: "c&quo…...
【华为OD机试模拟题】用 C++ 实现 - 找到它(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明找到它题目输入输出示例一输入输出示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD …...
python中yield的使用
在 Python 中,yield 是一个关键字,它用于定义生成器函数。生成器函数是一个特殊的函数,可以返回一个迭代器,当生成器函数被调用时,它不会立即执行,而是返回一个生成器对象,通过迭代生成器对象可…...
GO进阶(4) 深入Go的内存管理
Go语言成为高生产力语言的原因之一自己管理内存:Go抛弃了C/C中的开发者管理内存的方式,实现了主动申请与主动释放管理,增加了逃逸分析和GC,将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计ÿ…...
【C++】类与对象理解和学习(下)
放在专栏【C知识总结】,会持续更新,期待支持🌹建议先看完【C】类与对象理解和学习(上)【C】类与对象理解和学习(中)本章知识点概括Ⅰ本章知识点概括Ⅱ初始化列表前言在上一篇文章中,…...
【Neo4j】Spring Data Neo4j APi阅读随笔
引言 关于Spring boot整合Neo4j的官方api翻译&学习随笔 (TOC) 一、准备工作 1.注入依赖 <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId></dependency>2.配置yml文件 这里是本…...
OpenClaw Dashboard:AI智能体集群的实时可视化指挥中心设计与部署
1. 项目概述:OpenClaw Dashboard,一个为AI智能体集群打造的实时指挥中心如果你正在运行一个OpenClaw智能体集群,或者对构建多智能体系统感兴趣,那么你很可能面临一个共同的痛点:如何清晰地掌控全局?当几十甚…...
Midjourney未来三年风格演进路径图(2024–2026关键拐点全标注)
更多请点击: https://intelliparadigm.com 第一章:Midjourney 2026年审美趋势总览 2026年,Midjourney 的视觉语言正经历一场由技术理性与人文温度共同驱动的范式迁移。V7引擎全面启用动态语义权重调节(DSWR)ÿ…...
Tarjan算法:从DFS序到强连通分量的寻路指南(附C++实战与缩点技巧)
1. 从迷宫探索到强连通王国:Tarjan算法的生活隐喻 想象你正在探索一座巨大的迷宫,手里拿着粉笔和记事本。每走到一个新的岔路口,你就在墙上标记数字(第一个到的路口标1,第二个标2...),这就是DFS…...
在vSphere ESXi 7.0上跑MacOS Big Sur?这份保姆级避坑指南帮你一次搞定
在vSphere ESXi 7.0上部署macOS Big Sur的深度避坑指南 虚拟化环境中运行macOS一直是技术爱好者和企业开发者的热门需求。本文将深入探讨在vSphere ESXi 7.0平台上安装macOS Big Sur时可能遇到的各种技术难题及其解决方案,帮助您避开那些让大多数用户头疼的"坑…...
FanControl完整指南:3步掌握Windows风扇控制,告别噪音烦恼
FanControl完整指南:3步掌握Windows风扇控制,告别噪音烦恼 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/Git…...
ExplorerPatcher:彻底改造你的Windows界面体验,打造个性化高效工作环境
ExplorerPatcher:彻底改造你的Windows界面体验,打造个性化高效工作环境 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher …...
用AI写论文怎么不被判AI?写作prompt+降AI工具双层防御攻略!
用AI写论文怎么不被判AI?写作prompt降AI工具双层防御攻略! 用 AI 写论文最稳的姿势是「双层防御」——写作端用降 AI 提示词预防(0 成本但有能力上限) 写完用降 AI 工具兜底(4.8 元/千字双降到位)。 这两…...
2026 年 Redis 面试题全解析:原理 + 实战 + 高频考点
Redis 高频面试题全解析(2026 最新版) Redis 作为后端开发高并发、高可用架构的核心组件,是面试中必问的核心考点。本文从基础入门、核心原理、高并发实战、高可用架构、进阶运维五大模块,整理大厂高频面试题与标准答案ÿ…...
如果你的消费观和价值观不一致,就会产生“花钱买后悔“的内耗:你的钱花对了吗?
消费观与价值观 目录 消费观与价值观 一、核心定义与层级关系 1. 价值观:人生的"底层操作系统" 2. 消费观:价值观在金钱领域的"应用程序" 二、底层原理逻辑:从进化到社会 1. 价值观的形成原理:三重塑造 2. 消费观的运行原理:价值兑换模型 3. 为什么会…...
如何轻松解密Widevine加密视频:完整免费指南
如何轻松解密Widevine加密视频:完整免费指南 【免费下载链接】video_decrypter Decrypt video from a streaming site with MPEG-DASH Widevine DRM encryption. 项目地址: https://gitcode.com/gh_mirrors/vi/video_decrypter 还在为付费视频无法离线保存而…...
