Linux操作系统学习(进程地址空间)
文章目录
- 进程地址空间
- 奇怪的现象
- 什么是进程地址空间???
- 虚拟地址是如何与物理内存联系的?
- 页表是什么呢?
- 为什么要有页表和地址空间,让进程直接访问内存不行吗?
- 现象解释
进程地址空间
在我们学习其他 编程语言时对于内存分布的概念是这样的

在Linux环境下可以验证一下。如下图所示:

奇怪的现象
我们知道fork创建一个子进程,子进程会继承父进程的代码和数据并以父进程为模板来创建自己,那么子进程的码中的变量地址也是一样的吗?
下面来验证一下:
int main()
{if(fork() == 0){int count = 5;while(count){cout << "child-> " << " count: " << count << " getval: " << getval << " &getval: " << &getval << endl;count--;sleep(2);if(count == 3){cout << "********** getval = 50 **********" << endl; getval = 50;} }}else if(fork() > 0){while(1){cout << "parent-> " << " getval : " << getval << " &getval:" << &getval << endl;sleep(2);} }return 0;
}

fork创建的子进程中,在不改变父进程的代码时他们共享的是同一份代码(继承),当子进程发生改变时,会发生写实拷贝,才会将父进程的内容复制一份给子进程
子进程和父进程因为写实拷贝值不一样,但是为什么地址还是一样的呢???
先说结论:
- 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量
- 但地址值是一样的,说明,该地址绝对不是物理地址!
- 在Linux地址下,这种地址叫做 虚拟地址
- 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理 OS必须负责将 虚拟地址 转化成 物理地址 。
什么是进程地址空间???
进程地址空间其实是操作系统给进程画的一个大饼,让每一个进程都认为自己是独占操作系统中的所有资源(独占4GB)
我们知道每个进程都会有一个task_struct(PCB)用来描述这个进程,多个进程的PCB又会组织成数据结构(队列、链表),再由OS管理这个数据结构就可以间接管理到进程。
而在每个进程创建时都会创建一个进程地址空间struct mm_struct{},同时在PCB中创建一个mm_struct的指针,也就可以对每个进程的地址空间管理了。
struct mm_struct:就是操作系统给每个进程创建一个结构体,用来记录每个进程中各个区域的开始位置起始位置等等。
如下图所示:


虚拟地址是如何与物理内存联系的?
这里又引入一个新的概念 “页表”
页表是什么呢?

页表就是记录虚拟地址对应的物理地址的一张映射表,由一些映射算法映射到物理地址上(类似哈希表)
页表还会存储各个区域划分的属性(读/写权限等等)
为什么要有页表和地址空间,让进程直接访问内存不行吗?
进程直接访问内存不是不可以,而是会有很多隐患,弊远远大于利,这里简单分为三个问题来解释:
1. 假如内存中加载了进程A、B、C,进程B的代码有越界BUG,而编译器不检查越界,就会导致进程B的的代码可以访问到进程A或进程C并修改
例如一些恶意进程,在我们手机中,微信是进程A,支付宝是进程B,还有个恶意进程C;由于中间没有任何干涉C进程直接访问内存,恶意读取进程A、B的数据如支付密码、登陆密码、账户余额等等,严重威胁信息安全
在进程添加页表、进程地址空间,由操作系统管理;而页表中的进程地址与物理地址的映射转换是由操作系统完成的,也就可以由操作系统检查页表映射位置是否匹配,权限是否匹配等问题
例如:
当进程地址中越界了,操作系统发现页表中没有对应到映射的物理地址,就会挂掉它
字符量区是只读属性的,当进程访问到常量区发生修改时,操作系统发现页表对应的物理地址是只读属性,就会挂掉该进程
2. 假如task_struct直接向内存申请了10000个字节空间,但是他没有立刻全部使用只是使用了小部分,当别人的进程申请空间时,发现空间不够了
站在操作系统的角度,如果空间申请后马上给到进程就意味着你闲置的空间,本来可以给别的进程使用,但是现在你不用也不许给别人用,空间浪费了。
2.而操作系统管理页表和进程地址空间就可以改善这个问题:
当进程申请空间时有可能是这样的:
申请空间较小,操作系统直接给它;
申请空间较大,操作系统不立马给,只是先记在页表并给进程回话 “你的内存申请我通过了”,等到进程读或写时操作系统才会去在页表中建立映射关系
例如当内存满了的时候:
进程是不知道他满了的,他申请内存时先记在了页表,操作系统只是答应它但没有马上给他;
等到进程去访问地址时,操作系统会执行一些相关的内存管理算法,把内存的整块的数据移至磁盘,把移走的数据内存地址放在页表与进程空间地址建立映射(或者在磁盘给他分一块空间)
进程申请空间,操作系统同意,但是不一定马上给他或者给他的是磁盘空间,当进程访问地址时才会去在页表中建立映射关系。这些进程都是不知道的,他只负责访问自己的虚拟地址标号,申请时记录在页表的虚拟地址部分 ,剩下的都由操作系统管理。
(类似于酒店房间预定)
- CPU怎么知道代码的第一句在哪?(指main第一句)
有了进程地址空间和页表,可以规定把进程的代码中第一句放在页表指定位置(mian的第一句)
那么每个进程都把他们代码第一句放在同一个进程地址空间(虚拟地址是连续的,只需要记第一个位置即可),CPU只去读取每个进程页表的0X1234即可找到每个进程的代码第一句的位置,剩下的工作交给操作系统和页表
(前面介绍的PCB上下文数据,PCB运行队列的出口位置,把top的PCB对应的进程的代码和数据加载到CPU中执行)
同时也可以得出:每个进程的数据和代码可以加载到内存的任意位置,大大减少了管理内存的负担
总结 :
- 没有操作系统就算有页表和进程地址空间也做不到上面的改善,因为只有被管理者,没有管理者
- 而只有操作系统没有页表和进程地址空间也无法管理这些进程与内存之间的关系,因为只有管理者,没有被管理者
- 通过添加一层软件层(OS),完成有效的对进程操作内存进行风险管理,保护物理内存以及各个进程的数据安全
- 将内存申请和内存使用的概念在时间上划分清楚,通过虚拟地址空间来屏蔽底层申请内存的过程,完成进程读写内存和OS进行内存管理的操作,达到软件层面的分离
- 站在CPU和应用层,统一了每个进程的“4GB空间”,使每个空间区域的相对位置确定
- 同时做了空间连续化处理,方便使用。
现象解释

回到最开始的代码就可以解释了为什么改变值后地址还是一样的:
当fork创建完后,子进程继承父进程的代码,此时他们共享的是同一份,等于页表中存放的地址相同

而当子进程发生改变,此时会发生缺页中断和写实拷贝:
先暂停子进程,再把父进程在内存中的代码数据复制一份给子进程,之后子进程立马修改对应的数据,页表及时子进程对应的更新物理地址部分,修改完成后再继续运行。
这时子进程和父进程才各自读取各自的数据

所以当不发生改变时共享一份资源,发生改变时在复制一份给子进程,减少了资源浪费
所以进程不仅是代码和数据,更重要的是操作系统管理 —— 由数据描述的进程而组织成的数据结构(PCB进程数据块组成的进程数据结构 )
struct task_struct{mm_struct* address、页表等等};都是在描述一个进程,把每个进程的task_struct组成队列,再由操作系统管理,也就等于管理进程
再次证明管理的本质是:“先描述,在组织”
相关文章:
Linux操作系统学习(进程地址空间)
文章目录进程地址空间奇怪的现象什么是进程地址空间???虚拟地址是如何与物理内存联系的?页表是什么呢?为什么要有页表和地址空间,让进程直接访问内存不行吗?现象解释进程地址空间 在我们学习其…...
【排序】快速排序实现
目录 一、快速排序是什么? 二、左右指针法 1.实现原理 2.代码如下: 三、挖坑法 1.实现原理 2.代码如下: 四、前后指针法 1.实现原理 2.代码如下: 五、三数取中 1.实现思想 2.代码如下: 3.使用方法 总结…...
YOLOv5/v7 Flask Web 车牌识别 | YOLOv7 + EasyOCR 实现车牌识别
YOLOv7 Flask Web 车牌识别图片效果展示 本篇博文只包含源码以及使用方式,目前不同提供详细开发教程。 YOLOv7 Flask Web 车牌识别视频效果展示 YOLOv7 + EasyOCR 实现车牌识别 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更…...
【Opencv实战】几十年前的Vlog火了:黑白老照片如何上色?这黑科技操作一定要知道,复原度超高,竟美的出奇~(图像修复神级代码)
导语 哈喽大家好呀!我是每天疯狂赶代码的木木子吖~情人节快乐呀! 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 我们都知道,有很多经典的老照片…...
React源码分析(一)Fiber
前言 本次React源码参考版本为17.0.3。 React架构前世今生 查阅文档了解到, React16.x是个分水岭。 React15及之前 在16之前,React架构大致可以分为两层: Reconciler: 主要职责是对比查找更新前后的变化的组件;R…...
小樽 C++指针—— (壹) 指针变量
(壹) 指针变量 一、指针的概念与定义 二、给指针变量p赋值 三、指针变量的的、-运算 四、无类型指针 五、多重指针 C (壹) 指针变量 小明想把从李华家借来的书——《CCF中学生计算机程序设计》还给李华,但李华不在家,于是把书放到书架第3层的最右边…...
java 代码块 万字详解
概述 : 特点 : 格式 : 情景 : 细节 : 演示 : 英文 : //v,新版编辑器无手动添加目录的功能,PC端阅读建议通过侧边栏进行目录跳转;移动端建议用PC端阅读。😂一、概述 :代码块,也称为初始化块,属于类中的成员&…...
杂项-图片隐写
图片隐写的常见隐写方法: 三基色:RGB(Red Green Blue) 图片文件隐写 1.Firework 使用winhex打开文件时会看到文件头部中包含firework的标识,通过firework可以找到隐藏图片。 使用场景:查看隐写的图片文件…...
【高性价比】初学者入门吉他值得推荐购买的民谣单板吉他品牌—VEAZEN费森吉他
“在未知的世界里,我们是一群不疲不倦的行者,执念于真善美,热衷于事物的极致。我们抽丝剥茧,不断地打败自己,超越自己,我们无所畏惧终将成为巨人。”这是VEAZEN吉他官网首页上很明显的一段话,也…...
2023年浙江交安安全员考试题库及答案
百分百题库提供交安安全员考试试题、交安安全员考试真题、交安安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 50.根据《建设工程安全生产管理条例》第65条规定,施工单位有下列()行…...
【新】华为OD机试 - 跳格子(Python)
跳格子 题目 地上共有 N 个格子,你需要跳完地上所有的格子, 但是格子间是有强依赖关系的,跳完前一个格子后, 后续的格子才会被开启,格子间的依赖关系由多组 steps 数组给出, steps[0] 表示前一个格子, steps[1] 表示 steps[0] 可以开启的格子: 比如 [0,1] 表示从跳完第…...
乡村能做社区团购吗?怎么做?我走访调查后发现机会很大
乡村能做社区团购吗?怎么做?我走访调查后发现机会很大#深度触网 #社区团购 #乡村振兴##乡村旅游##县域经济##市场经济##农文旅产业振兴研究院#乡村旅游能带动农产品加工业、服务业、商贸业等相关联产业的发展 乡村能做社区团购吗?怎么做&…...
态路小课堂丨下一代数据中心100G接口第二篇——SFP-DD封装
100G光模块根据封装模式可分为QSFP28、CXP、CFP、CFP2、FCP4、DSFP和SFP-DD等。态路小课堂之前已经大量介绍了相关内容(。 态路小课堂丨下一代数据中心100G接口——DSFP态路小课堂丨100G解决方案-425G NRZ光模块态路小课堂丨什么是100G QSFP28单波光模块?…...
状态栏和导航栏高度获取
/*** 获取导航栏高度*/public static int getNavigationBarHeight(Context context){int navigationBarHeight 0;int resourceId context.getResources().getIdentifier("navigation_bar_height", "dimen", "android")if (resourceId > 0) {…...
插曲:第一桶金 1w 的来由
因为前天跟同事聊天,发现有个比较严重的认知,就是关于赚钱思维。 同事反馈说工作十来年,却没有接过私活,这里话分两头,有可能私 活钱少,但他给我的理由是:私活太麻烦,有时候不敢接&a…...
中国甲基异丁基甲醇行业头部企业市场占有率及排名调研报告
内容摘要 本文调研和分析全球甲基异丁基甲醇发展现状及未来趋势,核心内容如下: (1)全球市场总体规模,分别按销量和按收入进行了统计分析,历史数据2018-2022年,预测数据2023至2029年。 …...
streamlit自定义组件教程和组件开发环境配置
About create your own component: you can follow this tutorial streamlit tutorial 重要!以下步骤都是在教程的基础上更改的。这个教程做的很棒。 Component development environment configuration: 根据文章 https://streamlit-com…...
Windows CMD常用命令
目录 【打开CMD命令】 【网络测试命令】 ipconfig------查看本机网卡信息 ping------测试网络是否通畅 tracert------追踪路由,也可以用来查看网络连通性 telnet------查看目的主机ip的端口号是否开放 tcping------查看目的主机ip的端口号是否开放 【关于路…...
ChIP-seq 分析:数据比对(3)
读取 reads(二者含义相同,下文不做区分)1. ChIPseq reads 比对 在评估读取质量和我们应用的任何读取过滤之后,我们将希望将我们的读取与基因组对齐,以便识别任何基因组位置显示比对读取高于背景的富集。 由于 ChIPseq…...
并非从0开始的c++之旅 day2
并非从0开始的c之旅 day2一、变量1、 变量名的本质二、程序的内存分区模型1、内存分区运行之前运行之后三、栈区注意事项四、堆区1、堆区使用2、堆区注意事项五、全局变量静态变量1、静态变量2、全局变量六、常量1、全局const常量2、局部const常量七、字符串常量一、变量 既能…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...




