进程地址空间与页表方面知识点(缺页中断及写时拷贝部分原理)
谢谢阅读,如有错误请大佬留言!!
目录
谢谢阅读,如有错误请大佬留言!!
抛出总结
开始介绍
发现问题
进程地址空间(虚拟地址)
页表
物理内存与进程地址空间映射
缺页中断基本概念
写时拷贝的原理(基于缺页中断)
抛出总结
进程:何为进程进程 = 内核数据结构(PCB+mm_struct+页表(MMU))+ 代码和数据
开始介绍
发现问题
看一份代码
我们知道,当子进程出现写实拷贝的时候,将共享的数据拷贝一份,为子进程独立存储。
让我们运行该代码。
分析结果:1、写实拷贝前:在写实拷贝前子进程与父进程的flag数据相同,数据地址相同,无可厚非为写时拷贝前,父子进程共享一块数据空间
2、写实拷贝:子进程准备修改flag数据,先发生写实拷贝-父进程的flag数据拷贝一份,然后拷贝的空间给子进程形成独立,然后子进程的数据flag改变为222。
3、写实拷贝后,我们观察结果:子进程与父进程的flag值确实发生了不一样了,但是!!我们惊奇的发现他们的地址居然一模一样!同一个地址怎么能保存不一样的值呢??
得出结论,我们看见的地址,其实并不是直接物理内存上面的地址,这里我们看见的地址其实是进程进程地址空间(虚拟地址)。
进程地址空间(虚拟地址)
我们常见这个表其实是不是内存上面的数据区分布,其实是进程空间分布图。它其实一种结构体类型。
让我们讲个小故事更加了解虚拟内存:
有一个有钱的富翁他对他的朋友非常的好,但是他的朋友们都不知道富翁有其他朋友,以为富翁只有他一个朋友,富翁有一千万元,他对所有朋友说哎呀我的钱都可以借给你,但是你不能一下子借太多,要经过我的同意才行。富翁所有的朋友都认为自己可以向富翁借款一千万,所有他们就先规划了这一千万怎么用。富翁也可以同时放贷给许多朋友。故事先暂停一下。
这里的富翁换成物理内存,而朋友们换成进程,所有的进程都是独立的其实,但是进程都认为一个人独占了整个物理内存资源,所以就事先规划了内存使用的分布。划分了并不代表拥有,只是划分了而已
这里我们介绍一下inux的进程地址空间:struct mm_struct{} 这个结构体就是进程地址空间结构体
这里的每对数据其实就是对应着每个段的开始和结束。
但是单单只有进程地址空间也没办法,毕竟所有的进程都认为自己独占了物理内存,所以必须加上一些东西-->页表+查叶表。
页表
查页表:也就是在页表上查询数据一个硬件设施(这里我们不做过度说明)
页表:Linux在启动过程中,要首先进行内存的初始化,那么就一定要首先创建页表。我们知道每个进程都拥有各自的进程空间,而每个进程空间又分为内核空间和用户空间。
以32位计算机为例,每个进程有4G的虚拟空间,其中0-3G属于用户地址空间,3G-4G属于内核地址空间,内核地址空间是所有进程共享的,因此内核地址空间的页表也是所有进程共享的。
Linux内核中用户进程内存页表的管理是通过一个结构体mm_struct来描述的
让我们抽象的描述页表
左边是进程地址空间,而右边是物理地址空间,页表是承接进程地址空间与物理地址空间的桥梁。
接下来我们将物理内存、页表、进程地址空间建立一个初步的了解:
物理内存与进程地址空间映射
举个例子:现在我们进程中main函数地址我们需要存在物理内存中先将main虚拟地址传入页表进程空间列
然后在操作系统将该进程main函数真实地址与对应虚拟地址对应。
这样当我们需要访问main时的时候我们的操作系统就会让cpu根据该进程的页表映射关系找到实际的函数代码入口。
小知识点,为了让cpu快速在虚拟地址访问到进程入口处,我们无论是哪个进程的main函数地址都是一样的。
观察进程pid:两个不同进程加载到了内存,但是他们的main函数地址居然时相同的,发现虽然进程不同当时main函数入口是相同的,然后再从与对应的物理内存实际映射找到物理内存上该进程main实际的地址:我们的
继续观察
让我们同时运行程序
两份代码同时加载在进程,同时为R状态,但是他们的main地址居然相同,有一次的告诉我们我们取得main函数地址为虚拟地址。这些进程都有自己的PCB,mm_struct、页表,所有他们访问内存实际其实是,通过映射关系访问,而不是直接去内存访问数据
各访问各的。
缺页中断基本概念
个人理解:缺页中断就是操作系统先暂停对进程通过页表访问物理内存,然后操作系统对物理内存进行操作(拷贝父进程数据(写实拷贝),申请动态内存空间),然后再让进程操作该空间数据
我们先写份代码:
#include<iostream>
#include<unistd,h>
int main()
{int*p=new int[10];*p=10086;*(p+1)=10087;*(p+2)=10088;return 0;
}
我们向内存申请40各字节的空间。确实现在空间的使用全给我了。但是我并没有立刻使用空间,而是过了10秒才使用。如果这个空间一直等待我我写入数据的话,大大的浪费了内存的使用效率。所有操作系统会先让急需内存的进程先使用空间,当我需要写入的时候,再去给我开辟空间。
画图理解:
第一步先去申请空间:我们在进程地址空间查看是可以开辟40各字节的空间,允许开辟,然后返回空间地址值,这里我们这里申请的是虚拟地址空间,然后反馈告诉进程,申请空间成功。(其实并没有在物理内存中申请)。
第二,我们进程进入休眠状态,如果我们申请的是物理内存,那么这10秒我们申请的物理内存就要一直等待被当前进程使用,现在我们申请的只是虚拟内存,这并不占用物理内存40个字节,这样这40个字节空间可以被其他的进程先使用
当10秒过去后,我们cpu运行当前进程,需要写入数据,这时不会立刻写入数据而是,先发生中断,也叫做缺页中断。操作系统先去物理内存申请40个字节空间然后与该进程建立映射关系,然后才将数据写入空间(这里写一份可能就开辟4个字节空间,还有36字节空间不会开辟,未学习地方,以后回来补充)。
看步骤
休眠结束当我们需要在这块空间写入空间,先暂停写入
I:操作系统先在物理内存开辟空间。
II:将开辟的空间与进程地址空间建立映射关系(操作会进行到访问进程)
III、最后通过映射关系,在物理地址上写入数据
全图:
并不是所有的地址都映射在页表上:
如果是这样,4G物理内存只能跑一个进程甚至一个都跑不了。一页项有物理内存与虚拟内存,不止要4g空间。
所有页表也是按需申请页表项的。
写时拷贝的原理(基于缺页中断)
运行这段代码得到结果,我们知道发生了写实拷贝
让我们看看怎么回事
首先:这是父进程的进程信息,val存放在虚拟地址数据区,映射在物理内存上为0x00afcd。
发生创建子进程,其实就是将PCB、mm_struct、页表拷贝一份给子进程,那么还没写实拷贝前,其实所有的数据都是和父进程一模一样的。就是直接拷贝一份父进程数据给子进程。创建子进程时,将父进程的 虚拟内存
与 物理内存
映射关系复制到子进程中,并将内存设置为只读(设置为只读是为了当对内存进行写操作时触发 缺页异常
)。
他们所有数据都是一样的,映射关系也是相同的。
当我们想要改变子进程的val值会发生写实拷贝。发现该数据为在页表项为只读发生缺页中断,拷贝该物理空间数据,将映射关系改为映射拷贝的物理内存数据。
这里改变子进程页表的val权限,不会影响父进程的val权限,防止父进程创建多个子进程而导致无法发生缺页中断。
如果父进程发生写实拷贝呢?那么就是父进程改变映射关系,映射到拷贝的空间上,权限为可读可写,而原空间可能依旧有多个进程正在使用,所以原空间权限不变,不受到父进程的影响
谢谢阅读,如有错误请大佬留言!!
相关文章:

进程地址空间与页表方面知识点(缺页中断及写时拷贝部分原理)
谢谢阅读,如有错误请大佬留言!! 目录 谢谢阅读,如有错误请大佬留言!! 抛出总结 开始介绍 发现问题 进程地址空间(虚拟地址) 页表 物理内存与进程地址空间映射 缺页中断基本…...

Photoshop如何使用滤镜之实例演示?
文章目录 0.引言1.将普通照片制作成油画效果2.使用液化滤镜修出完美身材3.用镜头光晕滤镜制作唯美的逆光人像4.用Camera Raw滤镜对偏色风景照进行调色 0.引言 因科研等多场景需要进行绘图处理,笔者对PS进行了学习,本文通过《Photoshop2021入门教程》及其…...

Flutter 组件抽取:日期(DatePicker)、时间(TimePicker)弹窗选择器【仿照】
简介 仿照《Flutter 仿ios自定义一个DatePicker》实行的日期弹窗选择器(DatePicker)、时间弹窗选择器(TimePicker) 效果 范例 class _TestPageState extends State<TestPage> {overridevoid initState() {super.initStat…...
基于opencv的YOLOV3对图片的目标检测
目录 1. 准备工作 2. utils 函数 2.1 plot_show 函数 2.2 get_prediction 函数 2.3 draw_bounding_box 绘制边界框函数...
Mermaid流程图
所有流程图都由节点,几何形状和边缘,箭头或线条组成。mermaid代码定义了这些节点和边缘的制作和交互方式。 它还可以容纳不同的箭头类型、多方向箭头以及与子图之间的链接。 1、流程图的方向 TB - 从上到下TD - 自上而下/与上到下相同BT - 从下到上RL -…...

国产!全志科技T507-H工业核心板( 4核ARM Cortex-A5)规格书
1核心板简介 创龙科技 SOM-TLT507 是一款基于全志科技 T507-H 处理器设计的 4 核 ARM Cortex-A 53 全国产工业核心板,主频高达 1.416GHz 。核心板 CPU 、ROM 、RAM、电源、晶振等所有元器件均采用国产工业级方案,国产化率 100%。 核心板通过邮票孔连接方式引出 MIPI CSI 、…...

java小记 2023-05-05
public class Test {/*** 谓类的方法就是指类中用static 修饰的方法(非static 为实例方法),比如main 方法,那么可以以main* 方法为例,可直接调用其他类方法,必须通过实例调用实例方法,this 关键…...
CentOS安装Nginx
准备工作 在安装Nginx之前,我们需要进行一些准备工作: 确认系统是否已经安装了Nginx。如果已经安装了,需要卸载掉旧版本。安装EPEL源,以获取Nginx的软件包。安装必要的依赖软件包。 卸载旧版Nginx 如果已经安装了旧版本的Ngin…...
CSS布局基础(CSS书写顺序 导航栏写法 常见问题)
CSS布局基础(CSS书写顺序 & 导航栏写法) CSS布局基础(CSS书写顺序)导航栏写法PC端网页开发一般步骤容易出问题的点 CSS布局基础(CSS书写顺序) 布局定位属性自身属性(宽高,边框&…...
打造卓越 QML 层级设计:从入门到精通
目录标题 引言:QML 层级设计的重要性1.1 什么是 QML1.2 层级设计的核心理念1.3 实际应用案例 QML 基础知识2.1 语言概述2.2 基本元素2.3 属性和信号 设计原则与规范3.1 命名规范3.1.1 标识符命名3.1.2 文件命名3.1.3 文件夹命名 3.2 代码风格3.2.1 缩进与空格3.2.2 …...

shell流程控制之条件判断练习
1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 因为如果磁盘剩余空间小于20G需要报警发送邮件给管理员,所以需要对管理员的邮箱进行设置 (1)首先…...

linux中TF启动卡制作:磁盘分区文件同步
文章目录 前言:1. 连接TF卡2. 磁盘卸载载与分区2.1 磁盘卸载2.2 创建第一个分区2.3 创建第二个分区 3. 磁盘格式化4. 文件同步5. 检查与BOOT分区启动文件拷贝总结: 前言: TF卡在linux环境下配置好相关软件后,把配置好的系统以及软…...

【操作系统OS】学习笔记:第一章 操作系统基础【哈工大李治军老师】
基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记,仅进行交流分享。 特此鸣谢李治军老师,操作系统的神作! 如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡>𖥦<)!! 主页专栏有更多࿰…...
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
网络编程中地址格式转换(inet_pton和inet_ntop函数) 地址格式转换 #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>int inet_pton(int af , const char * src ,void * dst);(1…...

庖丁解牛函数知识---C语言《2》
目录 前言: 1.嵌套调用函数 2.链式访问 3.函数的声明与定义 4.*递归 5.递归与非递归 ❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的学习,是为我们今后学习其它语言打好基础,C生万物! 开始我们的C语言之旅吧…...

Git 使用教程:最详细、最正宗手把手教学(万字长文)
目录 一:Git二:SVN与Git的的区别三、安装Git四:常规操作五:远程仓库六:创建与合并分支七:bug分支八:多人协作九:git可视化工具 Git Git 是一种分布式版本控制系统,用于…...
【华为OD机试 2023最新 】最优资源分配/芯片资源占用(C语言题解 100%)
文章目录 题目描述输入描述输出描述备注用例题目解析代码思路C语言题目描述 某块业务芯片最小容量单位为1.25G,总容量为M*1.25G,对该芯片资源编号为1,2,…,M。该芯片支持3种不同的配置,分别为A、B、C。 配置A:占用容量为 1.25 * 1 = 1.25G配置B:占用容量为 1.25 * 2 =…...
markdown二元运算符
符号markdown名称 \pm \pm正负/加减 ∓ \mp ∓\mp负正/减加 \times \times乘号 ⋅ \cdot ⋅\cdot点乘号 \div \div除号 ∣ \mid ∣\mid整除 ∤ \nmid ∤\nmid不整除 ⊕ \oplus ⊕\oplus异或...
【华为/华三】PPP
NCP network阶段 用于协商网络层参数,IPCP静态协商IP地址(即互推地址)动态协商叫做获得地址 Q:为什么PPP两端,可以不在一个网段内,也能够通信? A:因为PPP中的NCP会通过IPCP协商IP…...

【Java笔试强训 9】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥另类加法…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...