Linux学习:进程(4)程序地址空间(笔记)

news2025/1/17 3:39:00

目录

  • 1. Linux下各种资源的内存分布
  • 2. 物理地址与虚拟(线性)地址
  • 3. 程序地址空间的区域划分
  • 4. 地址映射与页表
  • 5. 缺页中断

1. Linux下各种资源的内存分布

在这里插入图片描述

2. 物理地址与虚拟(线性)地址

  1. 在有关进程创建的初步学习中,我们了解了fork函数创建子进程的方式。此种进程的创建方式使得同一个变量在不同的进程可以有不同的值,我们初步了解的原因,为子进程进行了写时拷贝,重新开辟了一块空间来存放值。
  2. 那么,既然是不同的地址空间,那么父子进程中的同名变量的地址一定是不同,可事实是这样我们,接下来我们进行相关验证。
int main()
{
     pid_t id = fork();
     int i = 0;
      
     if(id)
     {
         i = 10;
         while(1)
         {
             printf("this is father process i=%d,&i=%p\n", i, &i);                                                                                                                     
             sleep(2);
         }
     }
     else
     {
         i = 20;
         while(1)
         {
             printf("this is children process i=%d,&i=%p\n", i, &i);
             sleep(2);
         }
     }
 
     return 0;
}

在这里插入图片描述

  1. 运行结果如上,父子进程中的同名变量居然是同一块地址空间,一块地址空间是绝对无法存储两个数据的,可为什么这里却又显示它们的地址空间相同呢。
  2. 事实上,我们使用取地址操作得到的地址并非是真实的物理地址,而是虚拟的程序地址空间中的地址。
  3. Linux操作系统中,会在真实物理地址空间与每个程序之间生成一块虚拟的地址空间,每一个程序都有一块独属于自己的程序虚拟地址空间。我们取地址操作所获得的资源地址,只是其在这块虚拟地址空间上的地址,这些虚拟地址只是真正物理地址在这块空间上的映射。

在这里插入图片描述

3. 程序地址空间的区域划分

  1. Linux32位操作系统下,程序地址空间的大小都为4GB,与指针的物理地址空间大小相同。
  2. 程序地址空间也是一种数据结构对象,操作系统对计算机软硬件资源的管理方式都是信息管理,先描述对应事物的信息,然后再将其组织起来。
  3. 程序地址空间的信息属性:
    <1> 程序地址空间要做到的就是模拟一份与物理地址空间大小相同的虚拟空间。
    <2> 其次要能够对整块区域进行区域划分,来区分存储不同程序资源。
    <3> 在这一过程中,也要能够做到对越界资源的检测。
//大致的数据结构
struct area
{
	int code_start;
	int code_end;
	
	int init_start;
	int init_end;

	int uninit_start;
	int uninit_end;

	//.......
}
  1. 通过如上此种数据结构,对数据越界的检测也就编程了对数据区域的比对,而扩大与缩小区域,也就变成了结构内成员数据的增大与缩小。
  2. 程序地址空间不具有数据存储的能力,数据是存储在物理内存中的。

4. 地址映射与页表

  1. 前面我们已经提及,虚拟地址只是物理地址映射,可是映射方式具体是什么呢,在实现上是怎么做从而达成了这一目的的呢。
  2. 在虚拟地址与物理地址之间有一张记录它们映射关系的记录表,我们称之为页表。
  3. 在程序被执行的过程中,CPU获取对应进程真实地址空间的方式,为通过MMU硬件模块中的CR3寄存器中记录的页表地址,以虚拟地址空间为key值从而直接通过页表找到映射的真实物理地址。

在这里插入图片描述

  1. 虚拟地址空间与地址映射存在的意义:
    <1> 使得原本因进程众多,切换调度而无序的物理地址空间变成了有序的虚拟地址空间,让所有进程都可以以统一的视角看待内存,大大提高了进程运行的效率。
    <2> 使得物理地址存储数据的实现与虚拟地址程序运行的实现区分开来,互不干涉,达到了方便设计与解耦合的效果。

5. 缺页中断

  1. 有了程序地址空间,我们再来了解一下动态空间管理的相关操作(malloc/new)。我们使用malloc/new申请款空间后,空间真的被开辟出来了吗?
  2. 当我们程序地址空间的堆区上申请了空间之后,物理空间上,我们所需的空间并不一定立刻会被开辟出来,在我们未对这段空间进行写入操作时,这段空间并不会被申请出来。只有在我们尝试进行写入时,操作系统才会为我们将这段空间真正开辟出来,并在页表中创建映射关系。
  3. 上述在对动态开辟空间进行写入的操作中,因为空间没有被指针开辟,页表上映射关系的缺失导致的操作短暂中断,我们称之为缺页中断。
  4. 操作系统为什么要进行这样写时拷贝的操作呢?操作系统是计算机资源的管理这,它为计算机的效率与资源使用率负责,如果在我们申请空间后,直接将进行开辟与权限开放,当我们只是申请而不使用的时候,就会浪费掉这块空间资源。操作系统为了杜绝防止这种资源浪费的风险,由此添加了写实拷贝的步骤。
  5. 写实拷贝的方式也能够提高我们内存申请的速度,虽然在总的时间上与申请开辟一体化的耗时相同,但单独对于申请的速度是有明显提升的。

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

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

相关文章

Acwing-石子合并

282. 石子合并 - AcWing题库 所需知识&#xff1a;区间dp 区间dp模板题。 区间dp常用模板&#xff1a; for (int len 1; len < n; len) { // 遍历区间的长度for (int i 1; i len - 1 < n; i) { // 枚举区间起点int j i len - 1; // 区间…

黑马java-JavaWeb-Maven

1.Maven是专门用于管理和构建java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程提供了一套依赖管理机制&#xff08;管理项目所依赖的第三方资源&#xff09; 2.Maven仓库 本地仓库&#xff1a;自己计算机上的一个目…

Lvgl9 WindowsSimulator Visual Studio2017

因为在操作过程中遇到了一些错误&#xff0c;所以将操作及解决问题的过程记录下来。 一、下载lv_port_pc_visual_studio github链接:GitHub - lvgl/lv_port_pc_visual_studio: Visual Studio projects for LVGL embedded graphics library. Recommended on Windows. Linux su…

代码随想录阅读笔记-二叉树【验证二叉搜索树】

题目 给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征&#xff1a; 节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 思路 要知道中序遍历下&#x…

金融中的数学知识

随机偏微分方程相比普通偏微分方程具有额外的随机项&#xff0c;反映了其描述的现象具有随机性质

认识 Redis 与 分布式

Redis 官网页面 Redis官网链接 Redis 的简介 Redis 是一个在内存中存储数据的中间件 一方面用于作为数据库&#xff0c;另一方面用于作为数据缓存&#xff0c;适用于分布式系统中 Redis 基于网络&#xff0c;进行进程间通信&#xff0c;把自己内存中的变量给别的进程&#xf…

Redis中的复制功能(五)

心跳检测 概述 在命令传播阶段&#xff0c;从服务器默认会以每秒一次的频率&#xff0c;向主服务器发送命令: REPLCONF ACK < replication_offset >其中replication_offset是从服务器当前的复制偏移量。 发送REPLCONF ACK命令对于主从服务器有三个作用: 1.检测主从服…

prompt 工程案例

目录 prompt 工程是什么&#xff1f; 案例 vllm 推理加速框架 prompt 工程是什么&#xff1f; prompt&#xff1a;提示词&#xff0c;也就是我们使用网页版输入给大模型的内容就叫 prompt&#xff0c;那什么是 prompt 工程呢&#xff1f; 简单理解其实就是利用编写的 prom…

Spark-Scala语言实战(12)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的join,rightOuterJoin,leftOuterJoin三种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢…

数据结构课堂考勤管理系统

摘要 高校的不断扩张让在校学生数量不断的增加&#xff0c;对于教师和管理人员的需求也在不断地增强&#xff0c;对日常的学生考勤管理的工作量也在日益增加&#xff0c;传统的人工点名签到的考勤管理模式已经给无法适用于当前高校考勤管理的需求&#xff0c;同时手动录入的考…

Spring重点知识(个人整理笔记)

目录 1. 为什么要使用 spring&#xff1f; 2. 解释一下什么是 Aop&#xff1f; 3. AOP有哪些实现方式&#xff1f; 4. Spring AOP的实现原理 5. JDK动态代理和CGLIB动态代理的区别&#xff1f; 6. 解释一下什么是 ioc&#xff1f; 7. spring 有哪些主要模块&#xff1f;…

使用c语言libexpat开源库解析XML数据

1 libexpat简介 Expat 是一个用 C 语言编写的开源 XML 解析库&#xff0c;以其高性能和小巧的体积著称。Expat 兼容多种操作系统平台&#xff0c;包括但不限于 Windows、Linux、macOS 等。由于其跨平台特性和简单易用的API&#xff0c;Expat 成为了许多C/C程序员解析XML文档的…

【项目实战】【Docker】【Git】【Linux】部署V2rayA项目

今天着手了一个全新领域的项目&#xff0c;从完全没有头绪到成功运行&#xff0c;记录一下具体的部署流程 github项目链接V2rayA 一开始拿到以后完全没有抓手&#xff0c;去阅读了一下他的帮助文档 写着能用docker运行&#xff0c;就去下载了一个Docker配置了一下 拉取代码到…

LeetCode-543. 二叉树的直径【树 深度优先搜索 二叉树】

LeetCode-543. 二叉树的直径【树 深度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;DFS解题思路二&#xff1a;另一种写法DFS解题思路三&#xff1a;0 题目描述&#xff1a; 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任…

【35分钟掌握金融风控策略3】场景概述3

目录 ​编辑 场景概述 贷前、贷中、贷后的划分及对应的风控场景 贷前风控场景简介 预授信 授信审批 定额 定价 人工审核 场景概述 贷前、贷中、贷后的划分及对应的风控场景 在金融风控全生命周期中&#xff0c;贷前主要是指授信成功及之前的阶段、贷中主要是指授信成…

ubuntu18.04图形界面卡死,鼠标键盘失灵, 通过MAC共享网络给Ubuntu解决!

ubuntu18.04图形界面卡死&#xff0c;鼠标键盘失灵&#xff0c; 通过MAC共享网络给Ubuntu解决&#xff01; 1. 尝试从卡死的图形界面切换到命令行界面2. 进入bios和grub页面3. 更改Grub中的设置&#xff0c;以进入命令行4. 在命令行页面解决图形界面卡死的问题5. Mac共享WI-FI网…

【QT+QGIS跨平台编译】056:【pdalcpp+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdalcpp介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdalcpp介绍 pdalcpp 是 PDAL(Point Data Abstraction Library)的 C++ 接口,它允许开发人员在他们的 C++ 项目中直接使用 PDAL 的功能和特性。PDAL 是一个开源的库,用于处理…

探索未来外贸电商系统的创新架构

在全球化、数字化的时代背景下&#xff0c;外贸电商行业呈现出蓬勃发展的态势。为了适应市场竞争的激烈和用户需求的多样化&#xff0c;外贸电商系统的架构设计显得尤为重要。本文将深入探讨未来外贸电商系统的创新架构&#xff0c;以期为行业发展提供新的思路和方向。 随着全…

IDEA2023.1.1中文插件

1.启动IDEA 选中Customize 2.选择All settings 3.选中Plugins,再搜索栏里输入Chinese,找到 "Chinese (Simplified) Language"插件&#xff0c;点击 Install 进行安装。 4. 安装完成后&#xff0c;重启IntelliJ IDEA&#xff0c;即可看到界面语言已经变为中文。

Java 开发者必备:JDK 版本详解与选择策略(含安装与验证)

1. JDK 版本 (Oracle Java SE 支持路线图) 数据来源&#xff1a;Oracle Java SE 支持路线图 | 甲骨文中国: https://www.oracle.com/cn/java/technologies/java-se-support-roadmap.html 版本GA DatePremier Support UntilExtended Support Until&#xff08;限 LTS&#xff09…