进程地址空间与页表

news2024/12/27 1:02:45

目录

引言

问题导入

进程地址空间

宏观的过程去分析

谈细节

1.进程地址空间究竟是什么

2.页表

3.进程被挂起

4.页表的存在,让进程管理和内存管理相连动

本文核心逻辑


引言


在当今的计算世界中,操作系统是管理计算机硬件和软件资源的关键组件。而在众多操作系统中,Linux以其开源、稳定和高效的特点,成为了广泛使用的系统之一。当我们探讨Linux系统时,程序地址空间无疑是一个核心而神秘的概念。它不仅是进程执行的基础,也是操作系统实现内存保护和高效资源管理的关键机制。本文将带领深入理解Linux程序地址空间的奥秘,从其基本原理到实际应用,揭示这一概念在确保系统稳定运行和优化性能方面的重要作用。  

问题导入

本文通过对进程地址空间的介绍,主要解决以下问题:

1.为什么一个变量会存在两个值

2.以下代码的问题

为什么不加const就会报错,加上const就不会报错。

通过下面的讲解,将会从透过现象看本质的方式去理解它。

进程地址空间

上述的示意图我们可以理解为

需要注意:这并不是真实的物理内存布局,而是虚拟内存/先行内存。

自下到上:代码区、字符常量区、初始化的全局变量、未初始化的全局变量、堆区、栈区。

其中栈区、堆区相对而生。

打印地址观察

可以看到,大体是遵循这张图的(注:该图以32位绘制,实际测试环境为64位)

至于静态的对象:

静态:只不过作用域在某个(函数、结构、、、、)代码块,但是生命周期在全局 

看下一段代码

在父进程中,将g_avl修改为200

结果(32位机器下):

问题暴露:

值不同,但是地址一样

怎么可能,同一个变量,相同的地址,出现了不同的val?

结论:

因此其实所看到的地址并不是真是的物理地址,而是虚拟地址。

我们平时写的C/CPP代码,里面的指针,全部都不是物理地址,而是虚拟地址 \ 线性地址。

宏观的过程去分析

我们都知道,在进程创建时,OS会给我们创建大量的kernel数据结构。

上述画出的地址图,其实就是一种数据结构。进程地址空间:管理进程运行时分配的地址空间的一种数据结构。

接下来的所有问题,都会从这张图中找寻答案(在32位的环境中)。

页表:KV模型,通过虚拟地址可以映射到物理地址

当我们创建子进程时,也会获得一个进程地址空间和页表的数据结构

在最初期,子进程与父进程共享数据和代码

当发生数据修改时,子进程会和内存重新申请一份空间

在这个过程中,虚拟地址并没有发生改变,但是子页表的映射发生变化,将本该映射到11223344的数据映射到了地址为44332211的空间中。

这就是为什么出现虚拟地址相同,但是数据不一致的原因。

谈细节

1.进程地址空间究竟是什么

在32位机器中,内存的物理上限就是4g,为什么呢?

在CPU和内存中,共有32跟总线连接,代表着不同的数据信息,而最多就是2^32(字节)中,因此总共由有4gb

而进程地址空间就是映射的真是的物理内存空间。

拿数据范围是符合划分的呢?

我们说进程地址空间其实是一个结构体,那这个结构体是什么样的呢?在kernel中,存在着这样一个结构体:mm_struct  (mm就是memory)

进程空间存在的意义是什么?

1.由于进程空间的存在,可以让进程对于内存有一个统一的视角去看待。

2.进程地址空间,可以让我们在访问物理内存的时候,增加一个转化的过程,在这个转化的过程中,可以对我们寻求的物理空间做一个审查,一旦访问异常,直接拦截,该请求不会到达物理内存,起到保护物理内存的作用

2.页表

在进程切换时,存在一个叫做cr3的寄存器,可以存储页表的信息。当进程离开cpu时,这些信息转接到pcb中。当cpu重新执行进程时,cr3可以从pcb中读取页表的信息,以便于继续从原来离开的代码块继续执行。

这东西的本质就是硬件的上下文。

一旦访问异常,直接拦截,该请求不会到达物理内存,起到保护物理内存的作用-------这是如何实现的呢?

这主要就是靠页表。

页表除了虚拟地址与物理地址,从还存在一个称为权限的属性栏。

由于内存本身不存在读写属性,这就可以让我们在访问内存的时候,管控内存到底是要读,还是读写都可以。

在进程中,当某段数据申请修改内存的内容时,需要先经过页表,如果页表的权限位只读,那么就禁止修改内存的内容。这就可以很好的保护数据。

这也是为什么常量字符串禁止修改的原因。

3.进程被挂起

linux下的进程管理存在r(运行)s(阻塞、休眠)等状态,但是没有对应的挂起,那进程的挂起在linux中是如何实现的呢?

既然进程可以被挂起,那你怎么知道你的代码在内存还是在磁盘呢?

内存的惰性加载

当我们想要加载一些大型的文件时,往往需要分块去加载这些内容,比如500M的内容,可能内存只会先加载100M。剩下的内容,当你需要的时候,再去内存中加载,这是如何实现的呢?

其实页表还存在一栏,用来检测数据、代码是否被加载到了内存。(目前我们至少知道,页表存在四个栏目)

当虚拟地址存在,想通过虚拟地址去访问物理内存时,发现物理地址不存在,检测栏对应的信息是0(即代码、数据被挂起在磁盘中,没有加载到内存)。内存没有申请,出发缺页中断,此时代码从磁盘加载到内存。

这时候就需要将磁盘中的数据和代码加载到内存,供进程访问使用。

这种惰性加载其实是一种充分节约内存资源的手段。

可见,在进程的执行过程中:先生成内核数据结构,再将数据加载到内存。

4.页表的存在,让进程管理和内存管理相连动

左侧是进程管理,右侧是内存管理。正是由于页表的存在,可以实现内存管理与进程管理的解耦。

使得进程管理模块相对独立。

所有,这时候我们需要对进程有一个重新的认识

进程 = 内核数据结构(pcb(task_struct)   +      mm_struct(进程地址空间)   +   页表) + 代码 + data + 占用的物理空间

进程具有独立性的问题也可以解决了

本文核心逻辑

上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!

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

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

相关文章

联想与Meta合作基于Llama大模型推出面向PC的个人AI智能体——AI Now | LeetTalk Daily...

“LeetTalk Daily”,每日科技前沿,由LeetTools AI精心筛选,为您带来最新鲜、最具洞察力的科技新闻。 联想集团昨日在美国西雅图召开年度Tech World大会。联想CEO杨元庆在主题演讲中,与Meta创始人兼CEO马克扎克伯格一道宣布&#x…

MYSQL-建库、建表,并创建表的详细信息

首先,创建一个:图书管理系统数据库。 1、创建用户表: 2、创建图书表: 3、创建借阅登记表:

Android使用协程实现自定义Toast

Android使用协程实现自定义Toast ​ 最近有个消息提示需要显示10s,刚开始使用协程写了一个shoowToast方法,传入消息内容、显示时间和toast显示类型即可,以为能满足需求,结果测试说只有5s,查看日志和源码发现Android系统中Toast显…

尚硅谷spark学习

p4 快速上手 -开发环境准备

基于工业互联网平台的智能工厂辅助制造企业数字化转型

制造业数字化转型已是大势所趋,工业互联网平台对于制造业数字化转型的支撑作用将会越来越强,其应用为制造企业生产和运营优化的能力提升提供了探索应用模式和路径。平台的不断创新和应用突破,将不断为制造业的升级转型赋能。实施制造业数字化…

C#线程详解及应用示例

简介 在编写应用程序实现业务功能过程中,为解决吞吐量和响应效率的问题,我们会用到多线程、异步编程两项重要的技术。通过它们来提高应用程序响应和高效。应用程序每次运行都会启动一个进程(进程是一种正在执行的程序)&#xff0…

基于node.js宜家宜业物业管理系统【附源码】

基于node.js宜家宜业物业管理系统 效果如下: 系统首页界面 业主登录界面 停车位页面 小区公告页面 管理员登录界面 管理员功能界面 物业管理员管理界面 缴费信息管理界面 物业管理员功能界面 研究背景 近年来互联网技术飞速发展,给人们的生活带来了极…

【数据分享】全国金融业-股票发行量和筹资额(1991-2021年)

数据介绍 一级标题指标名称单位金融业股票发行量亿股金融业A股发行量亿股金融业H股,N股发行量亿股金融业B股发行量亿股金融业股票筹资额亿元金融业A股筹资额亿元金融业配股筹资额亿元金融业H股,N股筹资额亿元金融业B股筹资额亿元 注:本文中的数据仅为示例&#xf…

Burp Suite Professional 2024.9 for macOS x64 ARM64 - 领先的 Web 渗透测试软件

Burp Suite Professional 2024.9 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件 世界排名第一的 Web 渗透测试工具包 请访问原文链接:https://sysin.org/blog/burp-suite-pro-mac/ 查看最新版。原创作品,转载请保留出处。 作者主页&#xff1…

【数据结构】分治算法经典: 快速排序详解

快速排序(Quicksort)是一种高效的排序算法,最早由Tony Hoare在1960年提出。它采用了分治(Divide and Conquer)策略,平均时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn),在大多数实际应用…

双十一开启极速达夜派;黑神话获泰国年度最佳游戏;AI 模型可帮助识别 17000 多种疾病的候选药物....| 网易数智日报

双 11 菜鸟在北京、上海、广州、杭州等城市开启「预售极速达夜派」服务 10 月 21 日,菜鸟在北京、上海、广州、杭州等城市开启「预售极速达夜派」服务,批量大促包裹实现小时级送达。 据介绍,在消费者支付尾款前,菜鸟供应链就已经…

项目结构(后端+前端)(若依)

项目结构(后端前端) 文章目录 项目结构(后端前端)前言一、后端结构1.若依 二、前端结构1. 总结 前言 方便了解项目结构 提示:以下是本篇文章正文内容: 一、后端结构 1.若依 com.ruoyi ├── ruoyi-adm…

【C++干货篇】——类和对象的魅力(四)

【C干货篇】——类和对象的魅力(四) 1.取地址运算符的重载 1.1const 成员函数 将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后面。const实际修饰该成员函数隐含的this指针(this指向的对…

Flutter Container容器组件实战案例

The Container widget is your design toolkit. It’s like the master builder that helps you structure and style your UI elements with precision. Whether you’re creating simple designs or complex layouts, the Container is your trusty tool for the job. “容器…

全能大模型GPT-4o体验和接入教程

GPT-4o体验和接入教程 前言一、原生API二、Python LangchainSpring AI总结 前言 Open AI发布了产品GPT-4o,o表示"omni",全能的意思。 GPT-4o可以实时对音频、视觉和文本进行推理,响应时间平均为 320 毫秒,和人类之间对…

【C++篇】深度解析类与对象(上)

目录 引言 一、类的定义 1.1类定义的基本格式 1.2 成员命名规范 1.3 class与struct的区别 1.4 访问限定符 1.5 类的作用域 二、实例化 2.1 类的实例化 2.2 对象的大小与内存对齐 三、this 指针 3.1 this指针的基本用法 3.2 为什么需要this指针? 3.3 t…

Java毕业设计 基于SpringBoot发卡平台

Java毕业设计 基于SpringBoot发卡平台 这篇博文将介绍一个基于SpringBoot发卡平台,适合用于Java毕业设计。 功能介绍 首页 图片轮播 商品介绍 商品详情 提交订单 文章教程 文章详情 查询订单  查看订单卡密 客服   后台管理 登录 个人信息 修改密码 管…

成都爱尔胡建斌院长讲解年纪大眼花?小心黄斑变性!

中老年朋友觉得年龄增加后,眼睛出现模糊是常态,但是眼花不止“老花眼”一种,要小心的是眼底病变! 眼花的形式有很多种,如果视线中间出现暗点视物变得模糊,很难看清周围的人脸,在看书看手机这种…

MATLAB(Octave)混电动力能耗评估

🎯要点 处理电动和混动汽车能耗的后向和前向算法模型(simulink),以及图形函数、后处理函数等实现。构建储能元数据信息:电池标称特性、电池标识符等以及静止、恒定电流和恒定电压等特征阶段。使用电流脉冲或要识别的等效电路模型类型配置阻抗…

jmeter学习(6)逻辑控制器-循环

循环执行 1、循环读取csv文件的值 2、foreach 读取变量,变量数字后缀有序递增,通过counter实现 ${__V(typeId${typeIdNum})} beansell断言 String typeIdNum vars.get("typeIdNum"); String response prev.getResponseDataAsString(); …