【Linux课程学习】: 进程地址空间,小故事理解虚拟地址,野指针
🎁个人主页:我们的五年
🔍系列专栏:Linux课程学习
🌷追光的人,终会万丈光芒
🎉欢迎大家点赞👍评论📝收藏⭐文章
Linux学习笔记:
https://blog.csdn.net/djdjiejsn/category_12669243.html
前言:
之前听过一遍课,但是如今还对它很模糊,不知道它到底是如何进行的。所以今天重新听课,重新学习。进程地址空间话题很大,这次也只能讲很少一部分,能对进程地址空间的宏观了解就OK。
目录
一.小实验(不是物理地址,而是虚拟地址/线性地址)
1.1实现目的和预想:
1.2修改gval的值继续进行实验:
二.虚拟地址是什么?
2.1小故事(画饼):
2.2理解虚拟地址空间:
2.3mm_struct结构体
2.4内存编址
三.页表
3.1代码共享:
3.2页表和物理地址的映射
3.3页表中的标志位
3.3.1rwx权限:
3.3.2isexit标记位:
四.为什么要有虚拟地址+页表
4.1安全和隐私保护:
4.2进程管理和文件管理解耦合:
4.3有效利用内存资源:
4.4让进程以统一的视角看待物理内存:
一.小实验(不是物理地址,而是虚拟地址/线性地址)
Linux大哥,你别骗我,我之前一直给我的时物理地址,没想到你给我一个虚拟的地址,我真的看透你了。线性
路上的一个下BUG
刚刚在进行运行代码的时候,运行结果没有输出,一直卡在那,我以为是出现什么错误了。结果是我没有换行,因为我创建了子进程,这时候的显示器文件缓冲区采取的刷新模式可能是满刷新,当缓冲区满的时候,才会进行刷新。所以一开始在显示器上没有看见东西。后面啪的一下出现很多内容。大概就是这个原因。啊哈哈哈哈哈。下面我又无知了,请原谅我。
1.1实现目的和预想:
因为之前不是说父进程和子进程的代码共享,数据会独立一份吗?现在我们创建一个子进程,打印同一个值的地址是不是一样的,按理来说,他们地址是不一样的,因为数据相互独立。但是真实的结果是如何呢?
看上面的图,我们居然发现他们的地址是一样,啊?这好像不对啊,但好像又可以理解。我们之前学C++的时候,比如字符串string的拷贝的时候,不会立马进行拷贝,不会立即复制字符串的内容,而是增加一个引用计数。这里好像也可以这样理解,如果你不对数据进行修改,那么我还是用原来的呗,你要修改的时候,我再给你申请空间,进行赋值,再让你修改呗!那么我们下面就把gval的值修改一下,看是不是地址会不一样。
好像结果不是这样的,不是要写时拷贝,是因为(Linux大哥)C语言给了我们一个虚拟的地址。
1.2修改gval的值继续进行实验:
我们每次循环让子进程的gval发生变化,他们的地址还是一样的。为什么会这样啊,这就真的不能理解的啊?上面我还能去想想可能是写时拷贝的原因,在这里写时拷贝也关不上啊!
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h> int gval=100; int main()
{ printf("我是一个进程,pid:%d , ppid:%d\n",getpid(),getppid()); pid_t id=fork(); if(id==0) { while(1) { printf("子进程,pid:%d,ppid:%d,gval:%d,&gval:%p\n",getpid(),getppid(),gval,&gval); sleep(1); } } else { while(1) { printf("父进程,pid:%d,ppid:%d,gval:%d,&gval:%p\n",getpid(),getppid(),gval,&gval);sleep(1); } }return 0; }
二.虚拟地址是什么?
这不是程序地址空间哈,这是进程地址空间。为了引入虚拟地址空间,必须把老师说的小故事在这里重复一遍。
2.1小故事(画饼):
在美国有一个大富翁,他很有钱,手上有10亿美金,并且他有很多孩子。有一天他的孩子A跑过来对他说:我想要100美元。大富翁听到以后,觉得没啥,我都有10亿美金了,这100美元能算啥,就把这100美元给了A孩子。但是还没道A孩子的手上,B孩子就冲过来把大富翁手上的100美元给抢走了,B孩子说这100美元是我先看到的,应该是我的。B孩子还没说完,C孩子就抢着说:B孩子都拿了100美元,那我要200美元。A孩子听到以后觉得很不公平,为什么最开始是我先找父亲要的钱,你们反倒比我要的多,为此A孩子说,那我最起码也要200美元。大富翁听到以后,非常头疼,不知道该怎么办?
在美国的另一边,也有一个大富翁,他很有钱,也有10亿美元,也有很多的孩子,但是这些孩子都是他的私生子,他们不知道彼此的存在,都以为大富翁只有我这一个孩子。有一天,大富翁跑到私生子A住的地方去看望A孩子,然后发现A孩子在一家上市公司上班,每天工作非常辛苦。大富翁对孩子A说,好样的!好好干,以后我10亿美金全是你的,孩子A听到以后,非常的开心,认为只要好好干,以后父亲的10亿美金全是我的。
后面大富翁又跑到B私生子那里,B孩子还在读大学,他是他们学习篮球队的主力 ,为了以后能打进NBA,每天训练也是非常的辛苦。大富翁看到以后,对B孩子说:好好打球,只要你好好打球,以后我的10亿美金也是你的。孩子B听到以后,也是非常的开心,觉得马上就能继承父亲的10亿美金了。
大富翁看望完B孩子以后,就去看望私生子C了,C孩子是女儿,现在在读高中,但是跳舞很厉害,她的梦想是去当模特。大富翁看到C孩子以后,也对C孩子说,只要你好好跳,以后我的10亿美金全部都是你的,此时C孩子很开心……当然,大富翁还有其他很多的私生子。
大富翁对每个私生子都是这么说的,每个私生子都以为自己可以拿到父亲的10亿美金,却不知道他们根本拿不到,只能拿到一部分。
以后每个孩子在找父亲要钱的时候,都会有一个潜台词,就是父亲有10亿,而且以后都是我的。
饼画多了,也需要管理。先描述,再组织。这个大富翁就是操作系统!这里的大饼就是程序地址空间!
2.2理解虚拟地址空间:
假如内存大小是4GB,一个进程过来申请了500MB,此时这个进程认为还有3.5GB可以用。但是另外一个进程也申请了500MB,这个进程也觉得它还有3.5GB可以申请,其实此时内存的真实大小只有3GB了。
2.3mm_struct结构体
理解区域划分的本质:
交代区域的开始和结束,就能进行区域划分。
mm_struct中就有每个地址区域的地址空间。有起始位置和结束位置。
PCB中,有一个mm_struct结果体指针,指向一个mm_struct结构体。
mm_struct是由谁来初始化的?信息来源是可执行程序,因为可执行程序被编译好,就有需要多大的空间等信息。可以不加载可执行程序的内容,但是这些信息必须被加载,这些属于PCB的范畴。
栈区是运行的时候,操作系统自己创建的,由操作系统决定。
物理内存延迟开辟,需要的时候,先给你虚拟地址,没有对应的物理地址,只有当真正使用的时候,才会填入物理地址形成映射。
2.4内存编址
最小内存寻址是计算机能访问的最小内存单元。内存是按字节来划分的,32位系统中地址总线通常是32了,能最大表示的地址范围是2的32次方的存储单位,2的10次方是1024,2的32次方就表示4GB大小。
用unsigned long就能表示地址的所以范围,这就是内存编码。
三.页表
3.1代码共享:
当父进程创建子进程的时候,子进程会拿父进程的PCB进行初始化,mm_struct也相同,页表也相同。页表中的代码区指向同样的物理地址,所以形成了代码共享。父子映射道同样的内存代码区域。所以子进程也是看到fork以上的代码的,只是不会执行它。
3.2页表和物理地址的映射
页表也被子进程继承,所以最开始的虚拟地址和物理地址都是和父进程一样的,用的还是父进程的代码和数据。当时当子进程的数据修改的时候,在此之前,操作系统OS会先申请空间给子进程用,然后修改子进程中的页表物理地址,虚拟地址不变。所以父子进程的有不同的页表,向上返回的虚拟地址是一样的,但是通过不同的页表能映射到不同的物理空间上去。所以就能解释上面小实验了。
在C语言中,变量名就相当于地址。
3.3页表中的标志位
页表中会有很多的标记位,下面就来谈谈rwx标记位和isexit标记位。
3.3.1rwx权限:
rwx标记位可以设置权限,比如代码区,只能是只读的,当如果要写,页表不让你从虚拟地址映射到真实的物理地址了。还有可能直接杀死进程。在代码层面,如果去修改一个只读区,编译器是识别不出来的,这是在运行时,才会去发生映射,才会报错。所以为了让编译器能检查,就引入了const。
3.3.2isexit标记位:
1.分批加载。2.挂起等操作。
表示在页表中这个映射关系是否存在,是都能在内存中找到。因为有种种原因,数据不会一直占着内存,会被放回到磁盘中,内存的大小是有限的。所以这个标记就是说是否在内存中存在。当不存在的时候,如果要进行操作,就会重新加载。所以才能跑大型程序。
四.为什么要有虚拟地址+页表
野指针就是有一个虚拟地址,在进行映射的时候,发现找不到真实的物理地址,或者权限不对,就会发生错误。操作系统就可以控制该进程终止。
可执行程序的代码和数据可以加载到物理内存的任何地址处。有页表进行映射。
4.1安全和隐私保护:
虚拟地址的设定,可以避免程序直接访问物理内存。必须通过页表的映射才能知道物理内存。页表是操作系统来管理的。防止错误程序和恶意软件篡改内存数据,增加系统的稳定性。
4.2进程管理和文件管理解耦合:
进程在进行管理的时候,操作的是虚拟地址,不要去物理地址。这样就大大降低了程序开发的复杂度。
4.3有效利用内存资源:
让进程都以为独占内存空间,但是操作系统可以进行自由切换,没用的时候,就能从内存中放到磁盘中。
4.4让进程以统一的视角看待物理内存:
代码和数据可以加载到物理内存的任意位置,但是对于mm_struct一样还是相同的数据放在一起。
无序变有序。
相关文章:

【Linux课程学习】: 进程地址空间,小故事理解虚拟地址,野指针
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux学习笔记: https://blog.csdn.net/…...

解决el-select数据量过大的3种方法
在准备上线的后台管理系统中,我们发现有两个下拉框(select),其选项数据量超过 1 万条,而在测试环境中这些数据量只有几百条。这导致在页面加载时,浏览器性能出现瓶颈,页面卡顿甚至崩溃。 想了一…...

速盾:高防cdn预热指定url就只刷新这个吗?
高防CDN预热是指在网站上线或更新之前,将网站内容缓存到CDN节点服务器上,以提高用户访问网站的速度和稳定性。通常,预热可以通过指定URL来进行,而不是刷新整个网站。 预热指定URL的好处是可以选择性地进行缓存刷新,而…...

aarch64-linux-gnu-g++在windous不能用
aarch64-linux-gnu-g 是针对 ARM 64 位架构(aarch64)的交叉编译器,它通常用于在一个平台(例如 x86 的 Linux 系统)上为另一个平台(例如 ARM 设备)编译代码。aarch64-linux-gnu-g 是 Linux 环境下…...

01_Node.js入门 (黑马)
01_Node.js入门 知识点自测 从 index.js 出发,访问到 student/data.json 的相对路径如何写? A:../public/teacher/data.json B:./public/student/data.json C:../student/data.json <details><summary>答案</sum…...

记一次搞校园网的经历
接教室的校园网,到另一个屋子玩电脑,隔墙想放大一下AP的信号,发现死活不行 这是现状 由于校园网认证的存在,无法用桥接,桥接需要路由器有IP,而这个IP无法用未刷机的路由器来打开校园网页面认证 解决 将一…...

沃德云商协系统微信小程序PHP+Uniapp
“多组织”的云服务平台,打造总商会、总协会、总校友会、工商联等多组织无障碍沟通合作平台,让各大分会、各大分校友会、分组织实现轻松管理,线上宣传展示、商机挖掘、会员管理、会员服务、跨界交流等, 借助沃德云商协平台系统,让…...

Leecode刷题C语言之可以被进一步捕获的棋子数
执行结果:通过 执行用时和内存消耗如下: 代码如下: int numRookCaptures(char** board, int boardSize, int* boardColSize) {int cnt 0, st 0, ed 0;int dx[4] {0, 1, 0, -1};int dy[4] {1, 0, -1, 0};for (int i 0; i < 8; i) {for (int j…...

【算法】数组中,求K个最大值
已知:数组 [8, 9, 15, 20, 3, 5, 7, 2, 6],求第8个最大值是哪个值? function quickSort(arr, targetIndex, start) {if (arr.length < 1) return arr[0];let left [];let right [];const mid Math.floor(arr.length / 2);const midNum…...

Postman自定义脚本Pre-request-script以及Test
这两个都是我们进行自定义script脚本的地方,分别是在请求执行的前后运行。 我们举两个可能经常运用到的场景。 (一)请求A先执行,请求B使用请求A响应结果作为参数。如果我们不用自定义脚本,可能得先执行请求A,然后手动复制响应结果…...

Lua中实现HTTP请求的User-Agent自定义
User-Agent(用户代理)是HTTP请求头的一部分,用于描述发出请求的客户端的信息,包括浏览器类型、版本和操作系统等。自定义User-Agent对于开发者来说是一个重要的功能,它可以帮助服务器识别请求来源,也可以模…...

工业节能水泵如何节能?
在现代工业生产中,水泵作为一种重要的流体输送设备,广泛应用于各个领域。无论是在制造业、化工、能源,还是在污水处理、灌溉等行业,水泵在保证生产流程顺畅的同时,也消耗了大量的能源。 一、工业水泵系统的能耗现状 …...

第四篇:k8s 理解Service工作原理
什么是service? Service是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。 简单来说K8s提供了service对象来访问pod。我们在《k8s网络模型与集群通信》中也说过k8s集群中的每一个Pod(最小调度单位)都有自己的IP地址,都…...

P3131 [USACO16JAN] Subsequences Summing to Sevens S
题目描述 Farmer Johns NN cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to take a photo of a contiguous group of cows but, due to a…...

大数据技术Kafka详解 ② | Kafka基础与架构介绍
目录 1、kafka的基本介绍 2、kafka的好处 3、分布式发布与订阅系统 4、kafka的主要应用场景 4.1、指标分析 4.2、日志聚合解决方法 4.3、流式处理 5、kafka架构 6、kafka主要组件 6.1、producer(生产者) 6.2、topic(主题) 6.3、partition(分区) 6.4、consumer(消费…...

【CKA】Kubernetes(k8s)认证之CKA考题讲解
CKA考题讲解 0.考试101 0.1 kubectl命令⾃动补全 在 bash 中设置当前 shell 的⾃动补全,要先安装 bash-completion 包。 echo "source <(kubectl completion bash)" >> ~/.bashrc还可以在补全时为 kubectl 使⽤⼀个速记别名: al…...

android WebRtc 无法推流以及拉流有视频无声音问题
最近在开发使用WebRtc进行视频通话和语音通话,我使用的设备是MTK的手机,期间后台的技术人员几乎没法提供任何帮助,只有接口和测试的web端,有遇到不能推流。推流成功网页端有画面有声音,但是安卓端有画面,没…...

【5G】Spectrum 频谱
频谱是移动运营商的关键资产,可用的频谱是定义移动网络容量和覆盖范围的重要因素。本章讨论了5G的不同频谱选项、它们的特性以及5G早期部署阶段的预期频谱。5G是首个旨在利用大约400 MHz到90 GHz之间所有频段的移动无线系统。5G还设计用于在许可、共享和非许可频谱带…...

Flink学习连载文章11--双流Join
双流 Join 和两个流合并是不一样的 两个流合并:两个流变为 1 个流 union connect 双流 join: 两个流 join,其实这两个流还是原来的,只是满足条件的数据会变为一个新的流。 可以结合 sql 语句中的 union 和 join 的区别。 在离线 Hive 中&…...

R语言 | 峰峦图 / 山脊图
目的:为展示不同数据分布的差异。 1. ggplot2 实现 # 准备数据 datmtcars[, c("mpg", "cyl")] colnames(dat)c("value", "type") head(dat) # value type #Mazda RX4 21.0 6 #Mazda RX4 Wag …...

16-03、JVM系列之:内存与垃圾回收篇(三)
JVM系列之:内存与垃圾回收篇(三) ##本篇内容概述: 1、执行引擎 2、StringTable 3、垃圾回收一、执行引擎 ##一、执行引擎概述 如果想让一个java程序运行起来,执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。 简…...

解决Windows与Ubuntu云服务器无法通过Socket(udp)通信问题
今天在写Socket通信代码的时候,使用云服务器自己与自己通信没有问题,但是当我们把客户端换为Windows系统的时候却无法发送信息到Linux当中,耗时一上午终于搞定了😒。 问题: 如上图,当我在windows的客户端…...

Mysql 中的锁机制
在 MySQL 中,锁是一种机制,用于管理并发访问以确保数据的一致性和完整性。MySQL 支持多种类型的锁,主要分为以下几类: 全局锁:锁定整个数据库,适用于备份等操作,期间禁止所有其他操作。表级锁&…...

12月第1周AI资讯
阅读时间:3-4min 更新时间:2024.12.2-2024.12.6 目录 OpenAI CEO Sam Altman 预告“12天OpenAI”系列活动 腾讯HunyuanVideo:130亿参数的开源视频生成模型 李飞飞的World Labs发布空间智能技术预览版 中科院联手腾讯打造“AI带货王”AnchorCrafter OpenAI CEO Sam Alt…...

【音频识别】数据集合集!
本文将为您介绍经典、热门的数据集,希望对您在选择适合的数据集时有所帮助。 1 Chenyme-AAVT 更新时间:2024-08-23 访问地址: GitHub 描述: 这是一个全自动(音频)视频翻译项目。利用Whisper识别声音,AI…...

Nginx核心配置详解
一、配置文件说明 nginx官方帮助文档:nginx documentation nginx的配置文件的组成部分: 主配置文件:nginx.conf子配置文件: include conf.d/*.conffastcgi, uwsgi,scgi 等协议相关的配置文件mime.types:…...

智能工厂的设计软件 用“力force”的性质构造智能体原型
本文要点 在“智能工厂的设计软件”中 我将对力的研究分为三个领域:经典力学,相对论力学和量子力学,每个研究领域都涉及到force自身性质所具有两个侧面: 明示高度内聚的不可观测的内部表征-“互相性”(哲学性质/哲学…...

Apache AGE:基于PostgreSQL的图数据库
Apache AGE(A Graph Extension)是一个基于 PostgreSQL 的图数据库。它以扩展插件的形式提供,可以在利用 PostgreSQL 先进的 SQL 查询功能和事务支持的同时,享受图数据库的灵活性和可扩展性。 Apache AGE 最初由 Bitnine Global In…...

RabbitMQ延迟消息的实现
RabbitMQ延迟队列的实现 延迟消息是什么延迟消息的实现死信交换机代码实现 延迟消息插件 延迟消息是什么 延迟消息是将消息发送到MQ中,消费者不会立即收到消息,而是过一段时间之后才会收到消息,进行处理。在一些业务中,可以用到延…...

SAP在中国:助力企业跨越成长的新篇章
在当今这个数字化转型风起云涌的时代,每一个企业都在寻求更高效、更智能的管理方式,以期在激烈的市场竞争中脱颖而出。在这场变革中,SAP作为全球领先的企业管理软件解决方案提供商,正以其卓越的产品与服务,在中国这片充…...