【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-正则表达式匹配

【redis】redis

1.linux离线安装 解压 redis-6.2.6.tar.gz进入redis-6.2.6执行make编译执行./make install PREFIX/app/soft/redis6安装 2. 使用客户端 redis-cli 启动默认6379 redis-cli -p port指定端口 -h ip -n 仓库号 【redis-cli -p 6379 -h 192.168.23.22】 auth username#passwd 或…

低成本出租屋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;策略模式定义小细节 入口类 使用模版模式策略模式开发支付 以上使用…

基于BERT的情感分析

基于BERT的情感分析 1. 项目背景 情感分析&#xff08;Sentiment Analysis&#xff09;是自然语言处理的重要应用之一&#xff0c;用于判断文本的情感倾向&#xff0c;如正面、负面或中性。随着深度学习的发展&#xff0c;预训练语言模型如BERT在各种自然语言处理任务中取得了…

37.超级简易的计算器 C语言

超级简单&#xff0c;简单到甚至这个计算器输入都比较反人类 但是足够简单 有输入功能有Switch语句支持四种运算还能检查除数是不是0还能打印出完整的式子 #define _CRT_SECURE_NO_WARNINGS// 禁用安全警告 #include <stdio.h>int main() {double num1, num2;// 声明两…

【tokenization分词】WordPiece, Byte-Pair Encoding(BPE), Byte-level BPE(BBPE)的原理和代码

目录 前言 1、word (词粒度) 2、char (字符粒度) 3、subword (子词粒度) WordPiece Byte-Pair Encoding (BPE) Byte-level BPE(BBPE) 总结 前言 Tokenization&#xff08;分词&#xff09; 在自然语言处理(NLP)的任务中是最基本的一步&#xff0c;将文本处理成一串tok…

深入解析 MySQL 数据库:数据库时区问题

在 MySQL 数据库中&#xff0c;时区管理是一个重要且复杂的主题&#xff0c;尤其是在全球化的应用程序中。以下是关于 MySQL 数据库时区问题的深入解析&#xff1a; 1. 时区的概念 时区是指地球表面被分为若干个区域&#xff0c;每个区域的标准时间相对协调世界时 (UTC) 有所…

技术周总结 11.11~11.17 周日(Js JVM XML)

文章目录 一、11.11 周一1.1&#xff09;问题01&#xff1a;js中的prompt弹窗区分出来用户点击的是 确认还是取消进一步示例 1.2&#xff09;问题02&#xff1a;在 prompt弹窗弹出时默认给弹窗中写入一些内容 二、11.12 周二2.1) 问题02: 详解JVM中的本地方法栈本地方法栈的主要…

模拟实现STL中的list

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

spark 设置hive.exec.max.dynamic.partition不生效

spark脚本和程序中设置ive.exec.max.dynamic.partition不生效 正确写法&#xff1a; spark-submit \ --master yarn \ --deploy-mode client \ --driver-memory 1G \ --executor-memory 12G \ --num-executors 8 \ --executor-cores 4 \--conf spark.hadoop.hive.exec.max.dyna…

.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;则…

centos7.9安装mysql社区版

文章目录 场景安装 场景 今天把家里闲置的笔记本安装了centos&#xff0c;设置内网穿透做个人服务器用&#xff0c; 这里记录下安装mysql的过程 安装 安装mysql源 sudo yum install -y wget wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm sudo r…

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

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

CommandLineRunner、ApplicationRunner和@PostConstruct

在Spring Boot中&#xff0c;CommandLineRunner、ApplicationRunner 和 PostConstruct 都是常用的生命周期管理接口或注解&#xff0c;它们有不同的用途和执行时机&#xff0c;帮助开发者在Spring应用启动过程中进行一些初始化操作或执行特定任务。下面分别介绍它们的特点、使用…

【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…