【Linux】—进程地址空间

大家好呀,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流哦
本文由:残念ing原创CSDN首发,如需要转载请通知
个人主页:残念ing-CSDN博客,欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:[残念ing 的【Linux】系列专栏——CSDN博客]
请添加图片描述

目录

  • 先看一个现象
  • 1 进程地址空间
    • 1.1 理解地址空间
    • 1.2 理解区域划分
    • 1.3 理解地址空间上的地址
  • 2 虚拟地址(进程地址)的运用全过程
    • 2.1 不进行数据修改时
    • 2.2 进行数据修改后(写时拷贝)
  • 3 知识点补充(了解)
    • 3.1 关于页表
    • 3.2 关于地址空间mm_struct
  • 4 为什么要有进程地址空间(虚拟地址空间)
    • 4.1 为什么遇到野指针程序就崩溃了?
  • 5 总结:

学习目标:
1 进程地址空间
2 虚拟地址(进程地址)的运用全过程
3 知识点补充(了解)
4 为什么要有进程地址空间(虚拟地址空间)
5 总结

先看一个现象

#include<stdio.h>
#include <stdlib.h>
#include <string.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){// childwhile(1)printf("我是子进程,pid : %d, ppid : %d, gval: %d, &gval: %p\n",getpid(),getppid(),gval, &gval);gval++;sleep(1);}}else{//parentwhile(1){printf("我是父进程,pid : %d, ppid : %d, gval: %d, &gval: %p\n",getpid(),getppid(),gval, &gval);sleep(1);}}}

在这里插入图片描述
我们发现gval的地址空间都是一样的,我们要知道的是整个地址一定不是物理地址,通过这个现象我们就要引出虚拟地址(线性地址)

1 进程地址空间

1.1 理解地址空间

在这里插入图片描述
目的:让每一个进程都认为自己是独占系统物理内存大小的,进程彼此之间不知道,不关心对方的存在,从而实现一点程度的隔离

所谓进程虚拟地址,其实本质上就是一个内核数据结构对象(类似PCB)

1.2 理解区域划分

本质就是:空间区域的划分,只需要知道开始和结束就可以。

1.3 理解地址空间上的地址

  1. 地址本质就是一个数字,可以被保存在usningned long(4字节)
  2. usning long total_vm 空间范围内的地址,我们可以随便用,暂时不需要记录它的地址

2 虚拟地址(进程地址)的运用全过程

在这里插入图片描述
虚拟地址+页表=虚拟内存管理方案

当建立了子进程后,子进程都是继承了父进程的地址空间结构和虚拟地址的,当在不修改数据和程序时,子进程的数据是浅拷贝了父进程的数据和代码,但是如果子进程修改了数据或着代码的话,那么物理地址会新开一个单独的空间给这个子进程,这个子进程的页表也会相应的改变。

2.1 不进行数据修改时

在这里插入图片描述

2.2 进行数据修改后(写时拷贝)

在这里插入图片描述
知识补充:
进程 = 内核数据结构(task_struct/mm_struct/页表)+ 自己的代码和数据
进程的独立性:内核数据结构各自一份、代码和数据也是独立的

3 知识点补充(了解)

3.1 关于页表

在这里插入图片描述
isexists:判断目标内容是否在内存中
作用:分批加载、挂起等操作

3.2 关于地址空间mm_struct

它是结构体变量,就必须初始化,这些初始化在可执行程序编译时,各个区域的大小信息就已经有了,这些都是从可执行程序来的。

4 为什么要有进程地址空间(虚拟地址空间)

1.虚拟地址空间+页表:保护内存
2.进程管理和内存管理在系统层面进行解耦合了
3 让进程以统一的视角看待物理内存,可执行程序和数据可以加载到物理内存的任意位置处。(将“无序”变“有序”)

4.1 为什么遇到野指针程序就崩溃了?

因为野指针运用到的地址不是物理地址,全都是虚拟地址,用户层是不可能看到物理地址的 ,看到的全都是虚拟地址,当指针指向的虚拟地址不对或与其他冲突时,对应的映射不对或者权限不对,操作系统就会杀掉这个进程。

5 总结:

地址空间的本质就是一个struct mm_struct ,里面所有的内容,都是OS系统自动完成的。我们只要把进程管理好了,地址空间就管理好了。比如:全局变量,字符串常量具有全局性,在程序运行期间都会有效,其实实际上是在地址空间中随着进程,一直存在,全局变量的虚拟地址也会一直被用户看到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode-44-通配符匹配

题解&#xff1a; 代码&#xff1a; 参考&#xff1a; (1)牛客华为机试HJ71字符串通配符 (2)leetcode-10-正则表达式匹配

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子&#xff0c;没有网络&#xff0c;开个热点&#xff1f;续航不太行。随身WIFI&#xff1f;大多是百兆级网络。找人拉宽带&#xff1f;太麻烦&#xff0c;退租的时候也不能带着走。5G CPE倒是个不错的选择&#xff0c;插入SIM卡就能直接连接5G网络&#xff0c;千…

学习日记_20241117_聚类方法(高斯混合模型)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

列出D3的所有交互方法,并给出示例

D3.js 提供了丰富的交互方法&#xff0c;可以用来增强图表的用户交互体验。以下是一些常用的交互方法及其示例&#xff1a; 1. 鼠标事件 on("mouseover", function) 用途: 当鼠标悬停在元素上时触发。示例:svg.selectAll(".bar").on("mouseover&qu…

设计模式-参考的雷丰阳老师直播课

一般开发中使用的模式为模版模式策略模式组合&#xff0c;模版用来定义骨架&#xff0c;策略用来实现细节。 模版模式 策略模式 与模版模式特别像&#xff0c;模版模式会定义好步骤定义好框架&#xff0c;策略模式定义小细节 入口类 使用模版模式策略模式开发支付 以上使用…

模拟实现STL中的list

目录 1.设计list的结点 2.设计list的迭代器 3.list类的设计总览 4.list类的迭代器操作 5.list类的四个特殊的默认成员函数 无参的默认构造函数 拷贝构造函数 赋值运算符重载函数 析构函数 6.list类的插入操作 7.list类的删除操作 8.list.hpp源代码 1.设计list的结点…

.NET SDK 各操作系统开发环境搭建

一、Win10&#xff08;推荐&#xff09; 1、VS 2022 社区版 # 下载地址 https://visualstudio.microsoft.com/zh-hans/downloads/ 2、.NET 6 SDK # 下载地址 https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 3、Hello World 如果需要使用旧程序样式时&#xff0c;则…

IDEA怎么定位java类所用maven依赖版本及引用位置

在实际开发中&#xff0c;我们可能会遇到需要搞清楚代码所用依赖版本号及引用位置的场景&#xff0c;便于排查问题&#xff0c;怎么通过IDEA实现呢&#xff1f; 可以在IDEA中打开项目&#xff0c;右键点击maven的pom.xml文件&#xff0c;或者在maven窗口下选中项目&#xff0c;…

【Golang】——Gin 框架中的模板渲染详解

Gin 框架支持动态网页开发&#xff0c;能够通过模板渲染结合数据生成动态页面。在这篇文章中&#xff0c;我们将一步步学习如何在 Gin 框架中配置模板、渲染动态数据&#xff0c;并结合静态资源文件创建一个功能完整的动态网站。 文章目录 1. 什么是模板渲染&#xff1f;1.1 概…

力扣 LeetCode 144. 二叉树的前序遍历(Day6:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归&#xff08;中左右&#xff09; class Solution {List<Integer> res new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {recur(root);return res;}public void recur(TreeNode roo…

高级 SQL 技巧讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; SQL&#xff08;结构化查询语言&#xff09;是管理和操作数据库的核心工具。从基本的查询语句到复杂的数据处理&#xff0c;掌握高级 SQL 技巧不仅能显著提高数据分析的效率&#xff0c;还能解决业务中的复…

pom中无法下载下来的类外部引用只给一个jar的时候

比如jar在桌面上放着,操作步骤如下&#xff1a; 选择桌面&#xff0c;输入cmd ,执行mvn install:install-file -DgroupIdcom -DartifactIdaspose-words -Dversion15.8.0 -Dpackagingjar -Dclassifierjdk11 -Dfilejar包名称 即可把jar包引入成功。

【软件测试】设计测试用例的万能公式

文章目录 概念设计测试用例的万能公式常规思考逆向思维发散性思维万能公式水杯测试弱网测试如何进行弱网测试 安装卸载测试 概念 什么是测试用例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包…

在连通无向图中寻找欧拉回路(Eulerian Circuit)

在连通无向图中寻找欧拉回路(Eulerian Circuit) 问题描述解决方案概述算法步骤伪代码C代码示例如何在迷宫中找出一条路示例:在简单迷宫中应用欧拉回路结论问题描述 给定一个连通无向图 $ G = (V, E) $,我们需要找到一条路径,该路径正向和反向通过 $ E $ 中的每条边恰好一…

ANSYS Maxwell:3PH 感应电机 - 第 1 部分 - 力与热耦合

在此博客中&#xff0c;我们使用 Ansys RMxprt 创建了 3PH 感应电机的 1D 模型&#xff0c;并从设计中自动开发具有所有设置、边界条件和激励的麦克斯韦模型。 ANSYS RMxprt 1D 模型 - 3PH 感应电机设计 请参阅上一篇博客下面的链接&#xff0c;了解如何设置电机设计的 RMxp…

【linux】网络基础 ---- 数据链路层

用于两个设备(同一种数据链路节点)之间进行传递 数据链路层解决的问题是&#xff1a;直接相连的主机之间&#xff0c;进行数据交付 1. 认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准&#xff1a; 既包含了数据链路层的内容, 也包含了一些物理层的内容…

递归(二)---力扣22括号生成,力扣78求子集

22. 括号生成https://leetcode.cn/problems/generate-parentheses/ 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))&quo…

数据分布之指数分布(sample database classicmodels _No.10)

数据分布之指数分布&#xff08;sample database classicmodels _No.10&#xff09; 准备工作&#xff0c;可以去下载 classicmodels 数据库具体如下 点击&#xff1a;classicmodels 也可以去 下面我的博客资源下载 https://download.csdn.net/download/tomxjc/88685970 文章…

C++语言之类与对象1

什么是类 类是一种抽象的数据类型&#xff0c;作为对象的蓝图或模板&#xff0c;它将具有相同属性和行为的对象进行统一抽象封装。其中属性描述对象的特征&#xff0c;如 “汽车” 类中的颜色、品牌等&#xff1b;方法则定义对象可执行的操作&#xff0c;像 “汽车” 类的启动、…