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

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

相关文章:

  • Zephyr kernel Build System (CMake)介绍
  • 如何配置Spark
  • 技术视界 | 从自然中获取智慧: 仿生机器人如何学会“像动物一样思考和行动”
  • 基于 Python(selenium) 的今日头条定向爬虫:根据输入的关键词在今日头条上进行搜索,并爬取新闻详情页的内容
  • 使用spring boot vue 上传mp4转码为dash并播放
  • Pycharm(六):可变与不可变类型
  • 3.3 Spring Boot文件上传
  • 2025年深度学习模型发展全景透视(基于前沿技术突破与开源生态演进的交叉分析)
  • 【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明
  • Linux系统下的常用网络命令
  • 如何在SOLIDWORKS中高效管理文件属性?
  • 第十二届蓝桥杯 2021 C/C++组 直线
  • macOS 更新后找不到钥匙串访问工具的解决方案
  • Flutter Dart中的函数参数 默函数的定义 可选参数 箭头函数 匿名函认参数 命名参类数 闭包等
  • 如何通过python连接hive,并对里面的表进行增删改查操作
  • 信奥赛之c++基础(计算机存储+数据类型转换)
  • kafka和Spark-Streaming2
  • Linux常用中间件命令大全
  • Golang | 倒排索引
  • docker的安装和简单使用(ubuntu环境)
  • “爱泼斯坦案”关键证人弗吉尼亚·朱弗雷自杀身亡
  • 上海虹桥至福建三明直飞航线开通,飞行时间1小时40分
  • 解码人格拼图:探索心理健康的多维视角
  • 美总统批准海底采矿,外交部:擅自授权开发损害国际社会共同利益
  • 生态环境法典草案拟初审:应对气候变化等问题将作原则性规定
  • 中信证券:“国家队”未曾减持ETF,应充分相信国家维稳决心