进程地址空间(Linux虚拟内存机制)

2023-09-13 22:03:49

在这里插入图片描述

本章理论基于32位平台的Linuxkernel 2.6.32版本内核

一.Linux进程地址空间的结构

  • 为了保证内存安全,现代操作系统不允许应用程序(进程)直接访问物理内存空间

  • 一般来说,操作系统和编译器会给每一个进程设置一个独立的虚拟内存空间一张映射页表,虚拟内存空间称为进程地址空间,虚拟内存地址通过特定的映射关系与物理内存地址建立联系

  • Linux的进程地址空间从0x00000000 ~ 0xffffffff进行编号,结构如下:在这里插入图片描述

  • 进程中的指令想要访问物理内存,就必须借助虚拟内存地址进行映射,进程的虚拟地址与物理内存通过页表进行映射:在这里插入图片描述

  • 在应用层视角中,应用程序代码中的变量和函数(数据)的内存地址以及指令本身的内存地址全部都是虚拟内存地址!!!所有的这些虚拟内存地址以及它们与物理内存地址的映射关系在应用程序编译时就已经确定了,因此进程的虚拟内存机制本质上是操作系统和编译器协同形成的一种内存管理机制

    • CPU内部在执行指令的时候,其使用的内存地址也是虚拟内存地址

二.Linux管理进程地址空间的方式

  • 每一个进程都有自己独立的进程地址空间映射页表
  • Linux内核中,进程地址空间由一个struct mm_struct来维护,每个进程的PCB结构体(进程控制块)都会指向一个struct mm_struct结构体:在这里插入图片描述
  • struct mm_struct结构体维护进程地址空间的具体方式类似于用指针来维护地址区间:在这里插入图片描述
  • 当内存中加载了多个进程时,操作系统中就会存在多个struct mm_struct结构体和映射页表,因此Linux进程地址空间的本质是操作系统中的struct mm_struct结构体和映射页表构成的内核数据结构

三.Linux进程使用物理内存的模型

  • Linux进程的PCB(task_struct)和进程地址空间(mm_struct)的存在形式:
    在这里插入图片描述
  • 进程指令集访问物理内存的方式:
    在这里插入图片描述

四.进程地址空间的存在意义

  1. 借助映射页表操作系统可以拒绝应用进程的非法访问内存的请求,保证了计算机系统的内存安全
  2. 在操作系统的设计意义上,虚拟内存机制使得操作系统的内存管理模块进程管理模块完成了解耦合,当内存管理算法需要调整时,不会影响到进程管理模块的设计(只需修改映射页表中的物理地址即可),同样,当进程管理模块需要重新设计时,不会影响到内存管理模块
  3. 虚拟内存机制其实是一种物理内存的延迟分配策略,当进程PBC指令集被加载到内存中后,操作系统不会立即为该进程中的对象分配物理内存(即使进程中每个对象都有一个虚拟地址),只有当进程对某个对象进行读写操作时,操作系统才会通过页表映射为对象分配物理内存,这种内存的延迟分配策略提高了各进程并发执行过程中计算机内存的使用效率
  4. 由于进程虚拟地址空间的存在,在应用程序的视角中,各对象的内存地址都是有序地,紧凑地排布的,使得开发人员可以更方便地进行内存操作,同时操作系统也可以更方便地对进程使用内存的情况进行监视和管理,实现物理内存的即时分配和释放.
    在这里插入图片描述
更多推荐

人工智能:ChatGPT与其他同类产品的优缺点对比

引言:自然语言处理技术的快速发展推动了聊天机器人的广泛应用。ChatGPT作为一种强大的语言模型,具有出色的生成能力和上下文理解能力。本文将对比ChatGPT与其他同类产品的优缺点,并展示使用ChatGPT进行对话生成的示例代码。ChatGPT简介ChatGPT是由OpenAI开发的语言模型,基于大规模的预训练数据和深

K8S pod资源、探针

目录一.pod资源限制1.pod资源限制方式2.pod资源限制指定时指定的参数(1)request资源(2)limit资源(3)两种资源匹配方式3.资源限制的示例(1)官网示例2)Pod和容器的资源请求和限制格式(3)CPU资源单位介绍(4)内存资源单位(5)资源限制示例1:(6)资源限制示例2:2.Probe支持三种

模式分类与“组件协作模式”

1.GOF-23模式分类从目的来看:创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。行为型(Behavioral)模式:

Python+Requests+Pytest+YAML+Allure实现接口自动化

本项目实现接口自动化的技术选型:Python+Requests+Pytest+YAML+Allure,主要是针对之前开发的一个接口项目来进行学习,通过Python+Requests来发送和处理HTTP协议的请求接口,使用Pytest作为测试执行器,使用YAML来管理测试数据,使用Allure来生成测试报告一、项目说明本

手动开发-实现SpringMVC底层机制--小试牛刀

文章目录前端控制器Controller注解RequestMapping注解自定义容器LingWebApplicationContext设计handlerList完成分发请求Service注解和AutoWired注解RequestParam注解完整代码在这里说的底层机制的实现主要是指:前端控制器、Controller、S

Appium混合页面点击方法tap的使用

原生应用开发,是在Android、IOS等移动平台上利用官方提供的开发语言、开发类库、开发工具进行App开发;HTML5(h5)应用开发,是利用Web技术进行的App开发。目前,市面上很多app都是原生和h5混合开发,这样做的好处在于:1)开发效率高,节约时间同一套代码Android和IOS基本都可用。2)更新和部署比

北大王选实验室 | 摘要已死?

深度学习自然语言处理原创作者:Winnie最新一篇研究里探索了大型语言模型(LLMs)在文本摘要这一领域的表现。他们设计了新的数据集,通过一系列人类评估实验评估LLMs在不同摘要任务中的表现。惊人的是,大多数人类评估者实际更倾向于选择LLM生成的摘要,甚至超过了参考摘要(人工编写)的标准。这个结果意味着,LLMs的介入

《红警3》因计算机中丢失d3dx9_35.dll无法打开游戏怎么办?最新解决方法推荐

d3dx9_35.dll是DirectX9.0c的一部分,它是一个动态链接库(DLL),包含了许多用于支持DirectX9.0c功能的函数和类。DirectX是一种由微软开发的游戏和多媒体应用程序编程接口,它提供了许多功能,如3D图形、音频、输入等,以便开发人员能够更轻松地创建高质量的游戏和多媒体应用程序。1、d3dx

lambda

一个lambda表达式表示一个可调用的代码单元。可以将其理解为一个未命名的内联函数。与普通函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。与普通函数不同的是,lambda可以定义在其他函数内部。一个lambda表达式具有如下形式:[capturelist](parameterlist)->retu

骨髓小游戏

欢迎来到程序小院骨髓玩法:骨髓推塔小游戏,敌方士兵进入到我方高塔会毁坏建筑,我方可派兵前去迎战,我方:骑兵、长枪兵、弓兵、敌法:骷髅骑兵、骷髅长枪兵、骷髅弓兵,快去消灭敌人吧^^。开始游戏https://www.ormcc.com/play/gameStart/184html<divid="game"></div>cs

【EI会议】第三届大数据、人工智能与风险管理国际学术会议 (ICBAR 2023)

第三届大数据、人工智能与风险管理国际学术会议(ICBAR2023)20233rdInternationalConferenceonBigData,ArtificialIntelligenceandRiskManagement第三届大数据、人工智能与风险管理国际学术会议(ICBAR2023)将于2023年11月24-26

热文推荐