[Linux]进程地址空间

[Linux]进程地址空间

文章目录

  • [Linux]进程地址空间
    • 进程地址空间的概念
    • 进程地址空间的实现
    • 理解写时拷贝
    • 为什么要有进程地址空间

进程地址空间的概念

操作系统作为计算机软硬件资源管理者,当然也要管理各个进程的内存分配,因此要有描述各个进程的内存分配情况的数据结构,这个内核数据结构就是进程地址空间。在Linux操作系统中,该数据结构的变量名为mm_struct

进程地址空间的实现

为了更好的管理内存分配,mm_struct的实现采用了如下策略:

  • 作为描述内存分配情况的数据结构,会描述整个内存的空间。
  • 用连续的线性地址来描述内存中的地址。
  • 其中描述的地址都是虚拟地址。

mm_struct的伪代码如下:

struct mm_struct
{long code_begin; //代码区起始地址long code_end;	 //代码区结束地址//...long brk_begin;  //堆区起始地址long brk_end;	 //堆区结束地址long brk_begin;  //栈区起始地址long brk_end;	 //栈区结束地址
}

说明: 由于进程地址空间是通过连续的线性虚拟地址描述的内存地址,因此通过起始地址和结束地址就可以将内存中各个区域区分开来。如下图:

image-20230826134746803

虽然进程地址空间描述的是虚拟地址,但是进程要找到自己的数据和代码还是要落实到内存中的实际地址中查找,因此操作系统采用了映射的方式,将虚拟地址转换成实际的内存地址,在映射时使用了叫做页表的工具,页表中记录了虚拟地址和内存实际地址的映射,如下:

image-20230826135906135

理解写时拷贝

首先编写如下代码来观察写时拷贝现象:

#include <stdio.h>
#include <unistd.h>
#include <assert.h>int main()
{int val = 100;pid_t id = fork();assert(id >= 0);if (id == 0){//子进程while(1){printf("我是子进程,pid:%d, ppid:%d, val:%d, &val:%p\n", getpid(), getppid(), val, &val);sleep(1);val = 200;}}else if (id > 0){while(1){printf("我是父进程,pid:%d, ppid:%d, val:%d, &val:%p\n", getpid(), getppid(), val, &val);sleep(1);}}return 0;
}

将如上代码编译运行查看现象:

image-20230826141508478

  • 在子进程修改val变量的值后,子进程的val值改变不影响父进程的val值。
  • 父子进程的val地址相同,但是值不同。

以上这种父子进程在代码共享同一个变量,当任意一方试图写入,双方便各自使用一份副本,称为写时拷贝。

首先,由于进程地址空间的地址都是虚拟地址,因此出现了父子进程在同一个地址上读取的数据不同。在子进程创建时,使用的进程地址空间和页表都是复制的父进程的,如下:

image-20230826142401503

在子进程修改val时,操作系统就会为了子进程重新开辟一段空间,来记录修改后的值,然后将页表中映射的实际地址修改来实现写时拷贝,如下:

image-20230826142642452

为什么要有进程地址空间

为了理解为什么要有进程地址空间,首先要了解一下两点知识:

malloc的本质

由于内存资源是有限的,操作系统作为了减少内存空间的浪费,在malloc申请内存时,只会在页表的虚拟地址中填入地址,而页表中实际内存地址的位置是空出来的,等待进程要使用的时候,再分配一块空间,将实际地址填入页表中。这样做避免了进程申请空间但是没有使用空间时,造成的空间浪费。

可执行程序的地址空间

源代码被编译的时候,就是按照虚拟地址空间的方式进行了早已编好的对应编址的方式编译代码和数据。

在Linux系统下,可以使用objdumop -S 可执行程序名查看程序的虚拟地址:

image-20230826155041035

进程在开始执行后,首先CPU执行的是虚拟的入口地址,该地址内容中也包含地址,CPU会通过入口地址中记录的内容开始进行页表的跳转,然后正常的执行进程的代码和数据。

为什么要有进程地址空间

首先,我们要知道如果没有进程地址空间,操作系统的工作方式。在没有进程地址空间时,也就不会有页表,进程加载到内存后,CPU按照进程内部的代码顺序执行。如下:

image-20230826150931606

  • 其一,在这种情况下,在执行进程的代码时,如果代码存在问题,出现了野指针的访存操作,CPU也就会进行错误的访问操作。而有了进程地址空间后,也就有了页表,在访问任何数据时,都要通过页表的映射,而页表中不仅仅存储了地址的映射关系,还存储了某一地址的读写权限等,如果使用的是野指针,页表就会进行拦截。
  • 其二,在这种情况下,进程要是想将数据按照全局区,静态区之类的分区就要在物理内存中找到实际的整块地址来用于划分,以至于进程的管理和内存的管理需要协同工作。但是有了进程地址空间和页表后,进程只需要关系进程地址空间中的地址是否能按照区域划分即可,而物理内存只需要找到空间即可,无论在内存中的具体哪个位置,因为最终的数据访问都是经过页表的映射的,同样的进程的管理和内存的管理得到了解耦。
  • 其三,在这种情况下,代码和数据要单独进行区分。有了进程地址空间和页表后,进程要访问代码和数据只需要通过进程地址空间,而在所有的进程地址空间中,代码和数据的分区地址的都是相同的,以至于所有的进程看自己的进程地址空间时的看法是一样的。

总结:

  1. 防止地址随意访问,保护物理内存和其他进程。
  2. 将进程管理和内存管理解耦。
  3. 让所有进程以统一的视角看待代码和数据。

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

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

相关文章

【Docker 】Docker 客户端,容器使用,启动容器,启动已停止运行的容器,停止一个容器,进入容器

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

C语言学习系列-->看淡指针(3)

文章目录 一、字符指针变量二、数组指针变量2.1 概述2.2 数组指针初始化 三、二维数组传参本质四、函数指针五、typedef关键字六、函数指针数组 一、字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* 一般使用&#xff1a; #include<stdio.h>int main…

【力扣每日一题】2023.8.28 插入区间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 和昨天的题大差不差&#xff0c;我们仍然是有一堆区间&#xff0c;题目给我们一个新的区间&#xff0c;要我们把新区间插入到原本的区间数…

安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计WebPack打包器第三方库JQuery安装使用安全检测

文章内容 环境搭建-NodeJS-解析安装&库安装安全问题-NodeJS-注入&RCE&原型链案例分析-NodeJS-CTF题目&源码审计打包器-WebPack-使用&安全第三方库-JQuery-使用&安全 环境搭建-NodeJS-解析安装&库安装 Node.js是运行在服务端的JavaScript 文档参考…

Nginx详解 第三部分:Nginx高级配置(附配置实例)

Part 3 一、网页的状态页二、Nginx第三方模块2.1 echo 模块 三、变量3.1 内置变量3.1.1 常用内置变量3.1.2 举个例子 3.2 自定义变量 四、自定义访问日志 (优化)4.1 自定义访问日志的格式4.2 自定义json 格式日志 五、Nginx压缩功能&#xff08;重要&#xff09;六、HTTPS 功能…

【JUC系列-03】熟练掌握Atomic原子系列基本使用

JUC系列整体栏目 内容链接地址【一】深入理解JMM内存模型的底层实现原理https://zhenghuisheng.blog.csdn.net/article/details/132400429【二】深入理解CAS底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132478786【三】熟练掌握Atomic原子系列基本…

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 &#x1f388; 模型网站&#x1f388; 仿真系列&#x1f388; 国风系列&#x1f388; 卡通动漫系列&#x1f388; 3D系列&#x1f388; 一些好用的lora模型 &#x1f388; 模型网站 由于现在大模型超级多&#xff0c;导致每种画风的模型太多&#xff0c;那么如何选择最…

代码随想录算法训练营第四十六天 | 139.单词拆分

代码随想录算法训练营第四十六天 | 139.单词拆分 139.单词拆分 139.单词拆分 题目链接 视频讲解 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典…

9.Redis数据结构之整数数组

Redis中的Set与Java中的HashSet一样&#xff0c;无序且存储元素不重复。 Redis的集合对象Set使用了intset和hashtable两种数据结构存储。intset我们可以理解为数组,hashtable就是普通的哈希表(key为Set集合中元素的值&#xff0c;value为null)。当value是整数值时&#xff0c;且…

中文乱码处理

&#x1f600;前言 中文乱码处理 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x1f609; 在csdn获奖荣誉: &#x1f3c…

自动化备份方案

背景说明 网上有很多教程&#xff0c;写的都是从零搭建一个什么什么&#xff0c;基本上都是从无到有的教程&#xff0c;但是&#xff0c;很少有文章提及搭建好之后如何备份&#xff0c;这次通过请教GitHub Copilot Chat&#xff0c;生成几个备份脚本&#xff0c;以备后用。 注…

linux之《进程》

文章目录 进程基础pcb状态优先级 进程的调度常见的调度算法 进程的通信方式 进程基础 pcb 操作系统在创建进程时&#xff0c;会给进程分配一块PCB&#xff08;process control block 进程控制块&#xff09;&#xff0c;对应linux上就是task_struct结构体&#xff0c;PCB里面…

时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化

时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVD分解重构算法&#xff0c;MATLAB程序&#xff0c;奇异值分解 (Singular Value Decompo…

解析直播美颜SDK功能算法:肤色识别、特征增强与实时渲染

在这个数字化时代&#xff0c;美颜技术在直播中的应用愈发受到重视&#xff0c;为主播和观众创造更加美好的视觉体验。本文将深入探讨直播美颜SDK 的核心功能算法&#xff0c;包括肤色识别、特征增强与实时渲染&#xff0c;揭示其背后的技术原理与工作机制。 一、肤色识别算法…

STM32电源名词解释

STM32电源架构 常用名词 VCC Ccircuit 表示电路&#xff0c;即接入电路的电压。 VDD Ddevice 表示器件&#xff0c; 即器件内部的工作电压。 VSS Sseries 表示公共连接&#xff0c;通常指电路公共接地端电压。 VDDA Aanalog 表示模拟&#xff0c;是模拟电路部分的电源。主要为…

【Python Flask+Nginx】实现HTTP、WS (两步实现,简单易懂)

目录 一、创建Flask应用 二、部署Nginx 2.1 下载Nginx 2.2 修改Nginx配置文件 2.3 启动Nginx 三、测试 一、创建Flask应用 首先我写了如下一个基于Flask的Demo&#xff0c;该Demo包含两个接口一个是HTTP接口&#xff08;http://127.0.0.1:5000&#xff09;&#xff0c…

[ACL2023] Exploring Lottery Prompts for Pre-trained Language Models

Exploring Lottery Prompts for Pre-trained Language Models 文章链接 清深的工作&#xff0c;比较有意思的一篇。作者先给出假设&#xff0c;对于分类问题&#xff0c;在有限的语料空间内总能找到一个prompt让这个问题分类正确&#xff0c;作者称之为lottery prompt。为此&…

Axure RP软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Axure RP是一款专业的原型设计工具&#xff0c;它能够帮助用户创建高保真度的交互式原型。 Axure RP具有以下特点&#xff1a; 强大的交互设计功能&#xff1a;Axure RP提供了丰富的交互设计工具&#xff0c;用户可以通过拖拽和…

17.2 【Linux】通过 systemctl 管理服务

systemd这个启动服务的机制&#xff0c;是通过一支名为systemctl的指令来处理的。跟以前 systemV 需要 service / chkconfig / setup / init 等指令来协助不同&#xff0c; systemd 就是仅有systemctl 这个指令来处理而已。 17.2.1 通过 systemctl 管理单一服务 &#xff08;s…

Python 中具有漂移的指数布朗运动;模拟股票价格的未来分布,以预测股票的未来价值

一、说明 随机过程是由概率定律生成的一系列事件或路径。也就是说&#xff0c;随机事件可以随着时间的推移而发生&#xff0c;但受特定的统计和概率规则的约束。主要的随机过程是随机游走或布朗运动。这个过程可以用来预测许多变量&#xff0c;这些变量似乎遵循随机趋势&#x…