当前位置: 首页 > java >正文

Linux进程地址空间

在这里插入图片描述

文章目录

  • 1.程序地址空间与虚拟地址
  • 2.虚拟地址是什么
  • 3.虚拟地址空间结构体属性
  • 4.为什么要有虚拟地址空间
  • 5.一些问题
    • 1.如何理解进程挂起?
    • 2.堆是如何连续的呢?

1.程序地址空间与虚拟地址

我们在学习C/C++的时候学习到以下的内容:

image-20250425101946502

那时候我们觉得我们访问地址是直接就是操作系统的地址码?

我们写一个代码来试一下:

image-20250425102649535

我们发现,父子进程,输出地址是⼀致的,但是变量内容不⼀样

image-20250425102956525

子进程和父进程在不发生更改的时候和父进程通过页表映射公用同一个内存空间

当子进程的内容发生更改的时候操作系统会重新分配一块新的内存来放子进程的数据

image-20250425104816395

而我们用户在上层查看时仍然只能查看到虚拟地址空间所以我们观察到的地址是一样的

2.虚拟地址是什么

那么虚拟地址到底是什么?

其实虚拟地址空间就是操作系统给进程画的一张"大饼"

让进程以为自己可以独占所有的物理内存

image-20250425105110558

但是由于进程过多,每个大饼又不一样,所以要将这些"大饼"管理起来

所以虚拟地址空间本质就是一个结构体(mm_struct)

3.虚拟地址空间结构体属性

虚拟地址主要目睹是管理区域划分,那我们如果管理一个数组的区域划分要定义怎样的结构体呢?

image-20250425105633817

如上我们只需要定义一个结构体记录开始和结束即可

当我们需要对这个结构体进行调整的是,直接让start/end进行加减即可

那我们mm_struct也是这样的

image-20250425105936122

我们可以再次来理解代码和数据和虚拟地址的关系

image-20250425110034859

  1. 现将进程加载到虚拟地址中,并且通过区域划分指定空间
  2. 加载程序申请物理空间
  3. 两只通过页表映射将物理地址转化为虚拟地址提交个用户使用

4.为什么要有虚拟地址空间

  1. 对于用户来说:物理地址通过页表映射产生的虚拟地址是连续的,将底层无序变为有序

  2. 用户使用虚拟地址去访问变量,需要现将虚拟地址转化为物理地址去找

    当用户访问不合理(权限问题/野指针)的时候,操作系统可以直接杀掉进程来保护内存

    如下面的情况

    image-20250425111440661

    这个操作是通过页表的第三个内容"权限"来判定的

    image-20250425111325831

  3. 当用户访问的代码数据过大的时候

    可以现将代码全部加载到虚拟空间(大饼)

    在物理地址上只映射加载前面部分代码

    当虚拟地址有而物理内存没有的时候,就会加载后续代码让程序继续运行这也叫缺页中断

  4. 让进程管理和内存管理解除耦合

5.一些问题

1.如何理解进程挂起?

查找页表找到对应的进程,将该进程的页表清空,将代码和数据换出,虚拟地址无需操作就可以将进程挂起

2.堆是如何连续的呢?

image-20250425111909962

对的连续是在堆中加了一个指针将堆像链表一样连起来了,而且每个堆中有开始和结算的指针来控制对的开始和结束

不仅对如此其他的也是这样控制的:

image-20250425173303995

http://www.xdnf.cn/news/2070.html

相关文章:

  • py语法基础理解
  • femap许可常见问题及解决方案
  • Vue 3 父子组件通信案例详解:Props 与 Emits 实战
  • 一洽 全力辅助商户平台在线咨询解决方案
  • 自定义异常处理(全局异常处理)
  • Vue多地址代理端口调用
  • Promethues 普罗米修斯
  • 小刚说C语言刷题——1565成绩(score)
  • 某地农产品交易中心钢网架自动化监测项目
  • 筛法求莫比乌斯函数
  • 4月25日星期五今日早报简报微语报早读
  • ZYNQ-GPIO之MIO中断
  • 【计算机视觉】CV实战项目 - 深入解析基于HOG+SVM的行人检测系统:Pedestrian Detection
  • 管家婆财贸ERP BB103.收款单按明细核算部门项目
  • Java真的不难(五十五)Stream流的进阶用法
  • 题解:CF2106G2 Baudelaire (hard version)
  • html+servlet项目中的echart图表
  • 期刊论文发表,对重复率和AI率要求多少才合格?
  • 【MySQL数据库入门到精通-07 函数-字符串函数、数值函数、日期函数和流程函数】
  • 微差压传感器、呼吸传感器
  • C++开发未来发展与就业前景:从底层基石到未来引擎
  • 无限debugger实现原理
  • 皖维 大病救助办理手续说明
  • 分层设计数据仓库的架构和设计高效数据库系统的方法
  • 大模型应用开发之LLM入门
  • AI大模型学习十二:‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud + devbox+minio对象存储测试和漫长修改之路
  • apt 源切到国内时出现证书验证不过问题
  • 异步请求池控制同一时间并发
  • [官方IP] AXI Memory Init IP
  • GAEA情感坐标背后的技术原理