【linux】:进程地址空间
文章目录
- 前言
- 一、进程地址空间
- 总结
前言
本篇文章接着上一篇文章继续讲解进程,主要讲述了进程在运行过程中是如何在内存中被读取的以及为什么要有虚拟地址的存在,CPU在运行过程中是拿到程序的虚拟地址还是真实的物理内存。
一、进程地址空间
下面我们先写一个程序用来引出问题:

先写一个.c程序和makefile文件

我们通过创建一个子进程的方式,让子进程中的全局变量val改变而父进程不会改变,这样的结果在我们的预期中应该是子进程修改了全局变量导致父进程中的这个全局变量的值也发生改变,那么我们运行起来看看结果:

我们发现全局变量val的地址是一样的,但是值却不一样了,子进程修改了全局变量,但是在父进程中为什么全局变量没有被改变呢?这是因为进程具有独立性,进程 = 内核数据结构+代码数据 也就是说每个进程的内核数据结构和代码数据也是独立的。那么val经过写时拷贝应该有两个不一样的地址才对,为什么打印出来的地址是一样呢?我们假设这是物理地址,有没有可能读取同一个变量的地址竟然会读到不同的数值呢?这是不可能的,既然是物理地址那就是唯一的,所以这一定不是物理地址!这就引入了我们今天所学习的虚拟地址,也叫线性地址。
进程地址空间本质就是一个内核数据结构,struct mm_struct{},下面我们画图描述一下:

如上图,首先一个进程中存放的是虚拟地址,在虚拟地址中又分为内核空间和用户空间,在用户空间中从低地址到高地址分别有正文代码,初始化数据,未初始化数据,堆,共享区,栈,命令行参数环境变量,而这些区域是如何划分的呢?其实很简单,只需要一个结构体即可:
就比如正文代码和初始化数据的划分只需要修改结构体中的start和end即可,像栈区的扩大堆区的缩小原理都是修改相对应区域的区间即可。那么地址空间又如何存储数据的呢?CPU和内存是用总线连接的,比如32位系统就用32根线连接,而这些线只能用0和1表示代表二进制,一共有2的32次方种排列方法。

如上图所示,进程地址空间就是一个线性范围,每个数字都是一个地址,而地址空间本质就是线性的。那么我们既然用的是虚拟地址又如何将数据保存到真实的物理内存呢?

虚拟地址通过页表+MMU映射到物理地址,MMU就是内存管理单元。也就是说进程先通过虚拟地址再由页表和MMU将虚拟地址映射找到其物理地址,这样我们就能解释为什么相同的地址却有不同的值,如下图:
父进程中大部分数据被子进程继承后两个进程都是一样虚拟地址,既然虚拟地址一样那么通过页表肯定也映射到相同的物理内存中了,当子进程要修改val 的时候是不能直接修改的,因为进程具有独立性如果子进程修改成功就会影响父进程,所以在子进程要修改的时候发生了写时拷贝,如下图:

由于发生写时拷贝只改变页表中的V值不改变K值所以虚拟地址是一样的而val不一样。
那么如果没有虚拟地址空间,操作系统是如何工作的呢?
如果没有虚拟地址那么直接访问物理内存,这样的方式是不安全的,一旦我们写的代码有问题或者出现野指针的情况,不小心将其他进程的数据修改了,那么就会出现很大的问题,虚拟地址可以保证在出现野指针等情况时直接拒绝映射到物理内存,这样你就访问不到物理内存,也就不会随意访问到其他进程的数据。所以虚拟地址空间的第一个作用是:防止地址随意访问,保护物理内存与其他进程。就比如这样的代码:char* p = "hello world"这样的代码我们是不能以p[0] = 'H'这样的方式修改的,因为hello world是保存在常量区的,对应的页表中的权限为r也就是只读权限所以我们不可以去修改。
那么当我们向操作系统申请内存,操作系统立马把内存给我们还是等我们用的时候再给呢?由于操作系统不允许任何的资源浪费,所以一定是在需要的时候才给空间。当然在我们申请内存成功后和使用之前,会有一段小小的时间窗口,在这个时间内即使空间没有被使用,别人也用不了这块空间,这叫做空间的闲置状态。由于页表的存在所以我们并不关心我们的代码放在物理内存的哪个位置只要存放在物理内存就可以了,这样就有了虚拟地址的第二个优点:将进程管理和内存管理进行解耦合。 也就是说我们不用再像没有虚拟地址的时候那样直接存放在物理内存导致进程管理和内存管理在一起相互管理,有了虚拟地址就可以分开管理进程和内存。
当我们的程序再被编译的时候,没有被加载到内存,那么我们的程序内部有没有地址呢?答案是有地址。因为在编译的时候就有了相应的代码段和数据段,所以源代码在被编译的时候,就是按照虚拟地址空间的方式进行对代码和数据早就已经编好了对应的编制。那么CPU中读到的数据中涵盖的这个地址是虚拟的地址还是物理的地址呢?答案是虚拟的,因为程序在编译的时候就包含了虚拟地址,虚拟地址加载到内存后就具备了物理地址,然后通过映射就可以找到物理地址,而当程序加载到CPU中的时候CPU是看不到物理地址的,因为物理地址是由页表映射而来的,所以CPU只能看到虚拟地址。 这就引出了虚拟地址的第三个优点:可以让进程以统一的视角,看待自己的代码和数据。
总结
本篇文章的重点是如何理解虚拟内存,我们通过画图的方式展示了进程地址空间,并且提到了虚拟内存的三个优点:1.将进程管理和内存管理进行解耦合 2.防止地址随意访问,保护物理内存与其他进程 3.可以让进程以统一的视角,看待自己的代码和数据
相关文章:
【linux】:进程地址空间
文章目录 前言一、进程地址空间总结前言 本篇文章接着上一篇文章继续讲解进程,主要讲述了进程在运行过程中是如何在内存中被读取的以及为什么要有虚拟地址的存在,CPU在运行过程中是拿到程序的虚拟地址还是真实的物理内存。 一、进程地址空间 下面我们先…...
【保姆级】JMeter Mqtt 压测配置
忽然有个紧急任务要对某个服务做MQTT做压测,紧急实操下JMeter,这里记录下非专业测试员的测试过程、(▽`),欢迎👏大家检查指点( ̄∇ ̄)/下载⏬工具JMeter官方下载地址https://jmeter.apache.org/do…...
C语言数据结构初阶(4)----带头双向循环链表
我们先来看看带头双向循环链表的结构:看到这里我们可能会产生一个想法:这个链表看起来好复杂的样子,是不是它的增删改查比单链表更难写呢?嘿嘿,还真的不是这样的,双向链表的增删改查是很好写的哦࿰…...
原生javascript手写一个丝滑的轮播图
通过本文,你将学到: htmlcssjs 没错,就是html,css,js,现在是框架盛行的时代,所以很少会有人在意原生三件套,通过本文实现一个丝滑的轮播图,带你重温html,css和js基础知识。 为什么选用轮播图做示例&…...
【Linux】进程优先级(进程优先级 Linux下优先级 用top命令更改已存在进程的nice 其他概念 进程切换)
文章目录进程优先级Linux下优先级用top命令更改已存在进程的nice:其他概念进程切换进程优先级 我们作为使用者一般不关心优先级,它跟我们的调度器有很大的关系,调度器是为了跟均衡的调度进程。 什么叫做优先级? 优先级和权限是两…...
2016年chatGPT之父Altman与马斯克的深度对话(值得一看)
2016年9月,现今OpenAI CEO,ChatGPT之父,时任创投公司Y Combinator的总裁Sam Altman在特斯拉加州弗里蒙特工厂采访了埃隆马斯克。马斯克阐述了创建OpenAI的初衷,以及就他而言,对于未来最为重要的五件事。这是OpenAI的两…...
基于vscode开发vue3项目的详细步骤教程 3 前端路由vue-router
1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 4、基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAw…...
【C语言】每日刷题 —— 牛客语法篇(5)
前言 大家好,继续更新专栏 c_牛客,不出意外的话每天更新十道题,难度也是从易到难,自己复习的同时也希望能帮助到大家,题目答案会根据我所学到的知识提供最优解。 🏡个人主页:悲伤的猪大肠9的博…...
操作系统(2.1)--进程的描述与控制
目录 一、前驱图和程序执行 1.前驱图 2.程序顺序执行 2.1 程序的顺序执行 2.2 程序顺序执行时的特征 3. 程序并发执行 3.1程序的并发执行 3.2 程序并发执行时的特征 一、前驱图和程序执行 1.前驱图 前趋图:是一个有向无循环图,用于描述进程之间执行的前后…...
JAVA查看动态代理类
JAVA查看代理类 1. 代理类 class 生成 System.setProperty // jdk8及之前的设置System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");// or System.getProperties().put("sun.misc.ProxyGenerator.saveGenerated…...
Chapter2 : SpringBoot配置
尚硅谷SpringBoot顶尖教程 1. 全局配置文件 SpringBoot使用一个全局的配置文件 application.properties 或者 application.yml ,该配置文件放在src/main/resources目录或者类路径/config目录下面, 可以用来修改SpringBoot自动配置的默认值。 yml是YA…...
手撕单链表练习
Topic 1:LeetCode——203. 移除链表元素203. 移除链表元素 - 力扣(LeetCode)移除链表中的数字6操作很简单,我们只需要把2的指向地址修改就好了,原来的指向地址是6现在改为3这个思路是完全正确的,但是在链表…...
Kubuntu安装教程
文章目录Kubuntu介绍下载Kubuntu在VMware虚拟机中安装Kubuntu1. 点击“创建新的虚拟机”2. 选择“自定义(高级)”3. 按照下图所示进行设置设置网络4. 点击“自定义硬件”5. 开启虚拟机6. 进入安装界面,选择中文,之后点击“安装Kub…...
[蓝桥杯] 树状数组与线段树问题(C/C++)
文章目录 一、动态求连续区间和 1、1 题目描述 1、2 题解关键思路与解答 二、数星星 2、1 题目描述 2、2 题解关键思路与解答 三、数列区间最大值 3、1 题目描述 3、2 题解关键思路与解答 标题:树状数组与线段树问题 作者:Ggggggtm 寄语:与其…...
Matlab-Loma Prieta 地震分析
此示例说明如何将带时间戳的地震数据存储在时间表中以及如何使用时间表函数来分析和可视化数据。 加载地震数据 示例文件quake.mat包含 1989 年 10 月 17 日圣克鲁斯山脉 Loma Prieta 地震的 200 Hz 数据。这些数据由加州大学圣克鲁斯分校查尔斯F里希特地震实验室的 Joel Yelli…...
Spring Boot全局异常处理
使用注解方式处理全局异常使用 ControllerAdvice (RestControllerAdvice) 配合 ExceptionHandler适用于返回数据的请求(一般是RESTful接口规范下的JSON报文)package com.example.exception;import org.slf4j.Logger; import org.s…...
websocket每隔5秒给服务端send一次信息
websocket轮询每隔5秒给服务端send一次信息,主要功能点如下:socket 采用了定时器 setInterval() 需要清除定时器否则会报错监听了突然关闭浏览器窗口,destroyed里面直接监听 window.removeEventListener("beforeu…...
2023年中职网络安全——SQL注入测试(PL)解析
SQL注入测试(PL) 任务环境说明: 服务器场景:Server2312服务器场景操作系统:未知(关闭链接)已知靶机存在网站系统,使用Nmap工具扫描靶机端口,并将网站服务的端口号作为Flag(形式:Flag字符串)值提交。访问网站/admin/pinglun.asp页面,此页面存在SQL注入漏洞,使用排…...
利用蜜罐捕捉攻击实验(31)
预备知识 1、蜜罐的含义和作用 蜜罐(Honeypot)是一种在互联网上运行的计算机系统。它是专门为吸引并诱骗那些试图非法闯入他人计算机系统的人(如电脑黑客)而设计的,蜜罐系统是一个包含漏洞的诱骗系统,它通过模拟一个或多个易受攻击的主机ÿ…...
PyTorch深度学习实战 | 自然语言处理与强化学习
PyTorch是当前主流深度学习框架之一,其设计追求最少的封装、最直观的设计,其简洁优美的特性使得PyTorch代码更易理解,对新手非常友好。本文主要介绍深度学习领域中自然语言处理与强化学习部分。自然语言区别于计算机所使用的机器语言和程序语…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
