进程地址空间与页表方面知识点(缺页中断及写时拷贝部分原理)

谢谢阅读,如有错误请大佬留言!!
目录
谢谢阅读,如有错误请大佬留言!!
抛出总结
开始介绍
发现问题
进程地址空间(虚拟地址)
页表
物理内存与进程地址空间映射
缺页中断基本概念
写时拷贝的原理(基于缺页中断)
抛出总结
进程:何为进程进程 = 内核数据结构(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】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥另类加法…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
