【Linux 11】进程地址空间

文章目录

  • 🌈 Ⅰ 虚拟地址引入
  • 🌈 Ⅱ 虚拟地址空间
  • 🌈 Ⅲ 页表 (解释 fork() 的返回值既 > 0 又 == 0)
  • 🌈 Ⅳ 什么是地址空间
  • 🌈 Ⅴ 为什么要有地址空间

🌈 Ⅰ 虚拟地址引入

  • 现在通过一段代码来观察一个现象,定义了一个全局变量 g_val = 100,然后使用 fork 创建一个子进程,让父子进程各自完成任务,在子进程中定义 count 来计数,当子进程的打印任务执行到第五次之后,让子进程讲 g_val 的值改成 300。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int g_val = 100;int main()
{printf("father is running, pid: %d, ppid: %d\n", getpid(), getppid());pid_t id = fork();  // 创建子进程if (0 == id)        // 执行子进程部分代码{   int count = 0;while (1){printf("child process, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);sleep(1);   // 每间隔一秒打印一次count++;if (5 == count){g_val = 300;printf("child process, change %d -> %d\n", 100, 300);}}}else if (id > 0)   	// 执行父进程部分代码{while (1){printf("father process, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);sleep(1);   // 每间隔一秒打印一次}}return 0;
}

在这里插入图片描述

  • 在子进程修改 g_val 的值时,父子进程的 g_val 的地址时一样的,然而在子进程讲 g_val 的值改成 300 时,能够发现父进程的 g_val 的值依然是 100。

    • 变量内容不一样,所以父子进程输出的变量绝不是同一个变量。
    • 但子进程和父进程的 g_val 的地址是却相同,说明输出的 g_val 地址绝不是一个物理地址。在 Linux 地址下,这种地址被称作虚拟地址
    • 用 C/C++ 所看到的地址,全都是虚拟地址,物理地址由操作系统 OS 统一管理。
  • OS 负责将 虚拟地址 转化成 物理地址

🌈 Ⅱ 虚拟地址空间

  • 操作系统 OS 会为每一个进程创建一个地址空间,这是一个虚拟的地址空间。

在这里插入图片描述

🌈 Ⅲ 页表 (解释 fork() 的返回值既 > 0 又 == 0)

不对公有变量进行修改时

  • 操作系统 OS 需要将虚拟地址转化为物理地址,OS 可以通过页表将虚拟地址和物理地址建立映射关系
  • 建立了映射关系之后,上层在使用虚拟地址访问时,OS 会自动拿着虚拟地址查页表,然后转化成物理地址从而访问到代码和数据。
  • 在上述代码的父子进程都有属于自己的虚拟地址空间以及页表,只不过公用同一个虚拟地址罢了。
  • 在没有进程对 g_val 的值进行修改时,父子进程的页表映射的都是同一个 g_val 的地址。

在这里插入图片描述

对公有变量进行修改时

  • 操作系统 OS 会先找到一块地址将原先的变量内容拷贝一份下来,然后再对该内容进行修改。这个因为要发生修改而拷贝内容的操作称为写时拷贝
    • 假设值为 100 的 g_val 的物理地址为 0x112233,值为 300 的 g_val 的物理地址为 0x123456 对应的映射关系如下图所示:

在这里插入图片描述

  • 如上图所示:同一个变量,值不同却地址相同,其实是虚拟地址相同,内容不同是被映射到的物理地址不同
  • 所以这也就能解释为什么 fork() 返回的 id 值既可以 > 0,又可以 = 0

🌈 Ⅳ 什么是地址空间

  • 地址空间本质是内核的一个 struct 结构体,内部的很多属性都是表示 start 和 end 的范围。
  • 每个进程都有一个地址空间,系统中可能存在多个进程,每个进程通过地址空间来访问内存,因此系统中存在着多个地址空间。地址空间需要被 OS 管理起来
  • 一旦涉及到了管理,那么就要先描述,再组织

1. 先描述

  • 地址空间本身是一个结构体对象,在 Linux 中被称为 struct mm_strunt
  • 先用结构体描述出地址空间,该结构体包含着区域信息,用于实现地址空间区域的划分。
struct mm_struct
{......
};

2. 再组织

  • 进程 PCB 里有一个指向 mm_struct 的结构体指针,来将 PCB 和 mm_struct 联系起来。

🌈 Ⅴ 为什么要有地址空间

  • 如果没有虚拟地址空间,那么进程访问的就都是物理地址,每个进程都需要记录物理地址。

  • 进程直接访问物理地址,在发生异常情况时,就有可能破坏其他空间的代码和数据

  • 以下是页表 & 虚拟地址空间存在的价值:

1. 将无序变为有序

  • 经过页表的映射,将无序的物理地址变成有序的虚拟地址,以统一的视角看待物理内存,以及自己运行的各个区域。
  • 不需要再关心正文代码、初始化数据、非初始化数据等在物理内存的哪个位置,这些东西永远在虚拟地址空间的固定位置。

在这里插入图片描述

2. 提高内存使用率

  • 如果一个进程早期在物理内存申请了一块空间,但长时间不去使用,就会造成浪费。
  • 在页表中预先弄好虚拟地址,但不实际开辟这块空间,等到需要用到这块空间时,再去物理内存中开辟,然后将开辟好的物理空间地址与预先弄好的虚拟地址 映射即可。

3. 拦截非法请求 - 保护物理内存

  • 没有地址空间:进程就能够直接访问物理内存,没人能管着你,增加了发生异常情况的概率。
  • 有了地址空间:一个进程就只会映射自己的数据 ,如果去越界访问别人的空间,那么在页表中是找不到对应的映射关系的,OS 会直接进行终止。也就是说,只要进入到访问物理内存阶段,那么一定是安全的。

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

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

相关文章

初识指针(1)<C语言>

前言 指针是C语言中比较难的一部分&#xff0c;大部分同学对于此部分容易产生“畏难情结”&#xff0c;但是学习好这部分对C语言的深入很大的帮助&#xff0c;所以此篇主要以讲解指针基础为主。 指针概念 变量创建的本质就是在内存中申请空间&#xff0c;找到这个变量就需要地址…

交互中的“互”难以产生的原因

脑机交互技术的目标是通过分析和解读大脑活动&#xff0c;将其与特定的意图、指令或行为连接起来。通过训练和分析&#xff0c;可以建立起大脑活动与特定行为或意图之间的关联模型&#xff0c;从而实现脑机交互的应用&#xff0c;例如控制外部设备、传递信息等。然而&#xff0…

Python机器学习实验 Python 数据可视化

1.实验目的 掌握 Matplotlib 数据可视化的常用方法。 2.实验内容 1. 绘制鸢尾花数据集的特征分布图 说明&#xff1a;鸢尾花是单子叶百合目花卉&#xff0c;是一种比较常见的花&#xff0c;鸢尾花的品种较多。 鸢尾花数据集最初由 Edgar Anderson 测量得到&#xff0c;而后在…

深入学习和理解Django模板层:构建动态页面

title: 深入学习和理解Django模板层&#xff1a;构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 tags: Django模板表单处理静态文件国际化性能优化安全防护部署实践 第一章&#xff1a;模板语法基础 Django模板语法介绍 Django模…

每天五分钟深度学习:数学中常见函数中的导数

本文重点 导数是微积分学中的一个核心概念,它描述了函数在某一点附近的变化率。在物理学、工程学、经济学等众多领域中,导数都发挥着极其重要的作用。本文旨在详细介绍数学中常见函数的导数,以期为读者提供一个全面而深入的理解。 数学中常见的导数 常数函数的导数 对于常数…

ctfshow 框架复现

文章目录 web 466web 467web 468web469web 470web 471web 472web 473web 474web 475web 476 web 466 Laravel5.4版本 &#xff0c;提交数据需要base64编码 代码审计学习—Laravel5.4 - 先知社区 (aliyun.com) 用第二条链子 反序列化格式 /admin/序列化串base64<?php na…

(论文阅读-多目标优化器)Multi-Objective Parametric Query Optimization

目录 摘要 一、简介 1.1 State-of-the-Art 1.2 贡献和大纲 二、定义 三、相关工作 四、问题分析 4.1 分析 4.2 算法设计影响 五、通用算法 5.1 算法概述 5.2 完备性证明 六、分段线性代价函数算法 6.1 数据结构 6.2 基本运算实现 6.3 复杂度分析 七、实验评估 …

FR-TSN4206获得“时间敏感网络产业链名录计划”测试认证证书,TSN交换机助力智能工业发展

TSN技术&#xff0c;即时间敏感网络技术&#xff0c;已成为智能工业、自动驾驶等领域的核心。它通过时钟同步、数据调度等功能&#xff0c;确保低延迟、高可靠性的数据传输。 为推动TSN技术在我国的发展&#xff0c;工业互联网产业联盟联合多家单位启动了“时间敏感网络产业链名…

Amazon EKS创建EFS存储卷

1、创建Amazon EFS CSI 驱动程序 亚马逊相关文档 在 Select trusted entity&#xff08;选择受信任的实体&#xff09;页面上操作 在 Add permissions&#xff08;添加权限&#xff09;页面上筛选AmazonEFSCSIDriverPolicy操作 记得将AmazonEBSVolumePolicy添加到我们创建的…

Colab/PyTorch - Getting Started with PyTorch

Colab/PyTorch - Getting Started with PyTorch 1. 源由2. 概要2.1 PyTorch是什么&#xff1f;2.2 为什么学习PyTorch&#xff1f;2.3 PyTorch库概览 3. 步骤4. 预期&展望5. 总结6. 参考资料 1. 源由 世界在发展&#xff0c;为其服务的技术也在不断演变。每个人都要跟上技…

Docker-Compose 容器集群的快速编排

Docker-compose 简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&…

2024阿里云ctf-web-chain17学习

agent jdk17依赖有h2思路清晰打jdbc attack <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.aliba…

AI图书推荐:ChatGPT在真实商业世界中的应用

《ChatGPT在真实商业世界中的应用》 (Unleashing The Power of ChatGPT: A Real World Business Applications)首先概述了ChatGPT及其在对话式人工智能领域的影响。接着&#xff0c;你将深入了解ChatGPT的技术方面&#xff0c;理解机器学习算法和自然语言处理如何在后台工作。然…

Raft共识算法笔记,MIT6.824,

处理leader和follow的一个重要思路是多数投票&#xff0c;确保系统中存在奇数个服务器&#xff08;例如3台&#xff09;。进行任何操作都需要来自多数服务器的同意&#xff0c;例如3台服务器中的2台。如果没有多数同意&#xff0c;系统会等待。为什么多数投票有助于避免脑裂问题…

【Linux】目录和文件相关的命令,补充:centos7系统目录结构

【Linux】Linux操作系统的设计理念之一就是“一切皆文件”&#xff08;Everything is a file&#xff09;&#xff0c;即将设备、文件等都当作“文件”处理。 “文件”主要类型有&#xff1a;目录&#xff08;即文件夹&#xff09;&#xff0c;链接文档&#xff08;即快捷方式…

【论文复现】Graph Attention Networks图注意力神经网络

图注意力神经网络 前言一、论文解读1.1 模型架构1.2 数学推导 二、代码复现2.1 数据准备2.1.1 数据转化2.1.2 创建数据集 2.2 模型构建2.2.1 参数设置2.2.2 模型代码2.2.3 pytorch官方GAT源码实现 2.3 模型训练 三、结果展示3.1 复现结果3.2 论文结果 四、代码细节代码链接 前言…

【Python项目】基于opencv的的【疲劳检测系统】

技术简介&#xff1a;使用Python技术、OpenCV图像处理库、MYSQL数据库等实现。 系统简介&#xff1a;用户可以通过登录系统平台实现实时的人脸照片的拍摄和上传&#xff0c;结合上传图像的内容进行后台的图像预处理和运算分析&#xff0c;用户可以通过照片分析界面查看到当前检…

数学中的极值

在数学领域中&#xff0c;极值是一个重要的概念&#xff0c;它不仅在纯数学理论研究中占据核心地位&#xff0c;还在实际应用中发挥着巨大作用。从微积分的基本定理到优化问题的求解&#xff0c;从物理学的能量守恒到经济学的边际分析&#xff0c;极值理论无处不在。本文将详细…

【MySQL】第一次作业

【MySQL】第一次作业 1、在官网下载安装包2、解压安装包&#xff0c;创建一个dev_soft文件夹&#xff0c;解压到里面。3、创建一个数据库db_classes4、创建一行表db_hero5、将四大名著中的常见人物插入这个英雄表 写一篇博客&#xff0c;在window系统安装MySQL将本机的MySQL一定…

求解亲和数

【问题描述】 古希腊数学家毕达哥拉斯在自然数研究中发现&#xff0c;220的所有真约数&#xff08;即不是自身 的约数&#xff09;之和为&#xff1a; 1245101120224455110284。而284的所有真约数为1、2、4、71、142&#xff0c;加起来恰好为220。人 们对这样的数感到很惊奇&am…