内存管理 : 04段页结合的实际内存管理

news2025/6/4 1:40:16

一、课程核心主题引入

这一讲,我要给大家讲的是真正的内存管理,也就是段和页结合在一起的内存管理方式。之前提到过,我们先学习了分段管理内存的工作原理,知道操作系统采用分段的方式,让用户程序能以分段的结构进行编写;后来又学习了分页管理内存,明白操作系统在管理物理内存时,通过分页机制更高效地利用内存。分段对用户和应用程序友好,分页对物理内存管理高效,所以这两种机制必须结合起来。
在这里插入图片描述

这一讲的关键,就在于探究段和页这两种机制如何结合,以及结合后实际的物理内存管理是什么样的。程序员希望用段来编写程序,物理内存希望用页来进行管理,而操作系统作为中间桥梁,既要让上层用户满意,又要高效管理下层物理内存资源,所以必须将分段和分页两种机制融合。接下来,我先给大家讲讲段页结合的思路,再深入探讨这种结合方式的具体实现。

二、段页结合的思路解析

  1. 回顾分段与分页工作原理
    • 先来回顾一下分段是怎么工作的。想象一下,有一个程序和一块内存,我们在内存中采用分区的方法,根据程序分段的数量划分出相应的区域。比如程序分成两段,就割出两个区域,然后将用户程序中的段和这些区域建立映射,把代码段放在一个区域,数据段放在另一个区域,这样应用程序就放到内存的段中了。
    • 再看看分页的工作方式。物理内存会被打散成一页一页固定大小的片,我们的程序同样也会被打散。假设程序有两个段,将这两个段也打散成若干页,然后把这些页映射到物理内存的空闲页上,分页机制的工作就完成了。
  2. 段页结合的具体方式
    • 现在要把段和页结合起来,该怎么做呢?仔细观察分段和分页的工作过程图,我们可以发现一个巧妙的方法。把程序中的段先映射到一个类似物理内存的地方,但它不是真正的物理内存,只是一个地址空间。这个地址空间可以划分成一块一块的,就像物理内存一样,不过划分出来的只是地址,还不能直接访问真实的物理内存,我们把它叫做虚拟内存

    • 具体来说,从应用程序角度出发,在虚拟内存给定的地址空间上,割出一个区域给程序中的段,这样就实现了对段的支持,段有了对应的映射。但是虚拟内存本身不能直接使用,它只是一个虚拟的地址空间,所以还需要把虚拟内存中的段再分割成固定大小的页,然后将每页映射到物理内存上。经过这两次映射,就形成了既有段又有页的内存管理模式。在这里插入图片描述

    • 从用户的角度看,程序对应到虚拟内存上,感觉就像在使用段,他们不用关心底层的复杂映射过程,只知道自己的程序段在一段地址空间上,并且可以像使用段一样连续地进行寻址访问。而从物理内存的角度,是把虚拟内存中的段映射到物理内存页上,实现了分页管理。通过引入虚拟内存这个概念,完美地将段和页结合在了一起,这就是段页式内存管理的核心轮廓。

三、段页同时存在时的重定位过程

  1. 重定位的必要性
    我们已经知道段页是如何结合工作的了,但要让程序在内存中顺利运行,还需要进行重定位,也就是地址翻译。因为用户发出的逻辑地址,像程序中使用的段号加上段的偏移地址,需要经过转换,才能找到真正的物理地址,这样程序才能在内存中正确地取指执行。

  2. 重定位的具体步骤在这里插入图片描述

    • 当用户发出逻辑地址(段号 + 段偏移)时,首先要根据段表找到一个地址,这个地址是虚拟地址。在只有分段的情况下,这个地址就是物理内存地址,但在段页结合的模式下,它还不是真正的物理地址,只是虚拟内存中的地址。
    • 得到虚拟地址后,操作系统还要根据分页机制再进行一次映射。通过虚拟地址算出页号,再结合页内偏移,组合形成物理地址。最后,操作系统把这个物理地址发送到地址总线上,程序就能访问到真正的物理内存单元,取出数据或执行指令了。整个过程需要经过两层地址翻译,第一层基于分段,第二层基于分页,这样既支持了分段,又支持了分页,用户感觉自己在使用段,而物理内存则按照页的方式进行管理和分配。

四、段页式内存下程序载入内存的过程

  1. 程序载入内存的总体步骤在这里插入图片描述
    在这里插入图片描述

    • 我们的目标是让操作系统管理内存,使用户程序能够放入内存并正常执行。在段页式内存管理下,程序载入内存的过程可以分为几个关键步骤。第一步,要在虚拟内存上割出一段区域,分配给用户程序的代码段、数据段等,然后建立段表,记录虚拟内存区域和程序段的对应关系,这一步相当于“假装”把程序段放入了内存。
    • 第二步,虽然在虚拟内存中有了映射,但程序还没有真正放到物理内存中,所以接下来要在物理内存中找到空闲页,建立页表,将虚拟内存中的区域和物理内存的页关联起来。通过磁盘读写操作,把程序真正载入到物理内存中。
    • 第三步,完成前面的操作后,程序已经在内存中了,但要能正常使用内存,还需要进行重定位,也就是前面讲的地址翻译过程,让程序中的地址能够正确对应到物理内存单元,这样程序就能顺利执行了。
  2. 结合代码分析具体操作(以fork为例)在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 我们从fork函数开始分析程序载入内存的过程。fork函数用于创建子进程,在这个过程中会涉及到内存的分配和映射。copy_process函数会进行一系列操作,其中copy_mem函数中的代码实现了关键步骤。

    • set_base等代码用于设置段表,这对应着第一步在虚拟内存上分配区域并建立段表的操作。通过计算,给每个进程分配一定大小的虚拟内存空间(如这里每个进程分配64兆),并将虚拟内存的起始地址赋给段表中的基址,完成对虚拟地址的分割和段表的初始化。在这里插入图片描述

    • 接下来是分配物理内存和建立页表。由于子进程是通过复制父进程创建的,所以在copy_page_tables函数中,子进程可以共用父进程已经分配好的物理内存页,只需要拷贝页表即可。通过一系列代码操作,先确定父进程和子进程的页目录,为子进程分配新的页目录项(如果需要),然后将父进程页表中的内容拷贝到子进程的页表中,并将共享的页设置为只读,同时更新内存使用计数等信息。这样,父子进程就都有了自己的虚拟内存、物理内存,并且段表和页表都已正确建立,程序成功载入内存。
      在这里插入图片描述

五、程序使用内存的过程及多进程地址分离在这里插入图片描述

  1. 程序使用内存的操作
    当操作系统把段表和页表做好后,程序就可以使用内存了。以*p = 7为例,假设p的逻辑地址经过编译后是300,首先根据逻辑地址(段号 + 段偏移)和段表中的基址算出线性地址(虚拟地址),然后内存管理单元(MMU)会根据虚拟地址和页表算出物理地址。由于这个地址转换过程如果用软件实现会比较慢,所以CPU设计了MMU这个硬件来自动完成转换功能。MMU算出物理地址(如7300)后,将其打到地址总线上,就把7存储到对应的物理内存单元中,实现了*p = 7的操作。
  2. 多进程地址分离与相互影响消除
    • 当有多个进程时,比如父子进程执行同样的代码,子进程执行*p = 8p还是300。在执行过程中,由于父子进程的段表基址不同(子进程的段表基址是根据其自身分配的虚拟内存计算的),所以算出的虚拟地址不同。
    • 又因为之前将共享的页设置为只读,当子进程要写入数据(如写入8)时,就会触发写时复制机制。此时会新申请一个内存页,修改页表,建立新的映射,将新的物理地址(如8300)与虚拟地址关联起来。这样,父进程和子进程就通过各自的映射表实现了地址的分离,避免了相互影响,每个进程都能独立地访问和使用自己的内存空间,就像我们之前讲过多进程在内存中相互影响的问题,通过段表和页表的配合,得到了完美解决。

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

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

相关文章

vue3: baidusubway using typescript

项目结构&#xff1a; <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地图容器 --><div id"subway-container…

Redis最佳实践——性能优化技巧之集群与分片

Redis集群与分片在电商应用中的性能优化技巧 一、Redis集群架构模式解析 1. 主流集群方案对比 方案核心原理适用场景电商应用案例主从复制读写分离数据冗余中小规模读多写少商品详情缓存Redis Sentinel自动故障转移监控高可用需求场景订单状态缓存Redis Cluster原生分布式分片…

常见相机的ISP算法

常见的ISP算法 3A算法 去雾算法 图像增强算法 图像宽动态算法 图像的电子缩放算法&#xff0c;无极电子缩放 图像降噪算法 相机常见问题 1.相机启动速度问题&#xff0c;启动速度较慢 2.相机扛不住高低温问题 3.相机散热问题问题 4.相机高低温芯片保护掉电 5.相机的成像效果或者…

2024 CKA模拟系统制作 | Step-By-Step | 8、题目搭建-创建 Ingress

目录 ​​​​​​免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、核心考点 Ingress 资源定义 Ingress Controller 依赖 服务暴露验证 网络层次关系 三、搭建模拟环境 1.创建命名空间 2.安装ingress ingress-nginx-controller 3.创建hello.yaml并部署 四、总结 …

OldRoll复古胶片相机:穿越时光,定格经典

在数字摄影盛行的今天&#xff0c;复古胶片相机的独特魅力依然吸引着无数摄影爱好者。OldRoll复古胶片相机这款软件&#xff0c;以其独特的复古风格和丰富的胶片滤镜效果&#xff0c;让用户仿佛穿越回了那个胶片摄影的黄金时代。它不仅模拟了胶片相机的操作界面&#xff0c;还提…

通俗易懂的 JS DOM 操作指南:从创建到挂载

目录 &#x1f9e9; 1. 创建元素&#xff1a;document.createElement / createElementNS &#x1f4dd; 2. 创建文本&#xff1a;document.createTextNode ✏️ 3. 修改文本&#xff1a;node.nodeValue &#x1f5d1;️ 4. 移除元素&#xff1a;el.removeChild() &#x1…

CSS Day07

1.搭建项目目录 2.网页头部SEO三大标签 3.Favicon图标与版心 &#xff08;1&#xff09;Favicon图标 &#xff08;2&#xff09;版心 4.快捷导航 5.头部-布局 6.头部-logo 7.头部-导航 8.头部-搜索 9头部-购物车 10.底部-布局 11.底部-服务区域 12.底部-帮助中心 13.底部-版权…

RV1126-OPENCV 交叉编译

一.下载opencv-3.4.16.zip到自己想装的目录下 二.解压并且打开 opencv 目录 先用 unzip opencv-3.4.16.zip 来解压 opencv 的压缩包&#xff0c;并且进入 opencv 目录(cd opencv-3.4.16) 三. 修改 opencv 的 cmake 脚本的内容 先 cd platforms/linux 然后修改 arm-gnueabi.to…

【深度学习】 19. 生成模型:Diffusion Models

Diffusion Models Diffusion Models 简介 Diffusion 模型是一类通过逐步添加噪声并再逆向还原的方式进行图像生成的深度生成模型。其基本流程包括&#xff1a; 前向过程&#xff08;Forward Process&#xff09;&#xff1a;将真实图像逐步加噪&#xff0c;最终变为高斯噪声…

JMeter 直连数据库

1.直连数据库的使用场景 1.1 参数化&#xff0c;例如登录使用的账户名密码都可以从数据库中取得 1.2 断言&#xff0c;查看实际结果和数据库中的预期结果是否一致 1.3 清理垃圾数据&#xff0c;例如插入一个用户&#xff0c;它的ID不能相同&#xff0c;在测试插入功能后将数据删…

易路 iBuilder:解构企业 AI 落地困境,重构智能体时代生产力范式

一、从大模型到智能体的产业跃迁 2024 年堪称中国人工智能产业的 "战略拐点" 之年。当 DeepSeek R1 模型以 "技术 价格" 双重普惠模式掀起行业震荡时&#xff0c;各企业纷纷意识到&#xff0c;大模型的真正价值不在于技术炫技&#xff0c;而在于成为企业…

计算机网络之路由表更新

1.解题思路 对新接收到的路由表进行更新&#xff0c;全部"距离"1&#xff0c;且"下一跳路由器"都写成发送方路由器的名称。 开始对比新表和原来的路由表 1.看目的网络 如果是新的目的网络&#xff0c;则直接把对应的各项信息填入表中&#xff1b;如果是相同…

万兴PDF手机版

万兴PDF手机版(万兴PDF编辑器)是一款国产PDF编辑工具.万兴PDF安卓版提供PDF文档编辑,AI撰写摘要,文档签名,设置密码保护等功能,万兴PDF专家APP以简约风格及文档编辑功能为核心,支持多设备终端同步保存.全免 万兴 PDF 编辑器是一款功能强大的 PDF 编辑软件&#xff0c;它支持多种…

Qt -使用OpenCV得到SDF

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 目录 cv::MatdistanceTransform获得SDF 本文的目标&#xff0c; 是简单学习并使用OpenCV的相关函数&#xff0c; 并获得QImage的SDF(Signed Distance Field 有向距离场) 至…

DDR5 ECC详细原理介绍与基于协议讲解

本文篇幅较长,涉及背景原理介绍方便大家理解其运作方式 以及 基于DDR5协议具体展开介绍。 背景原理介绍 上图参考:DDR 内存中的 ECC 写入操作时,On-die ECC的工作过程如下: SoC将需要写入到Memory中的数据发送给控制器控制器将需要写入的数据直接发送给DRAM芯片在DDR5 DR…

EC800X QuecDuino开发板介绍

支持的模组列表 EG800KEC800MEC800GEC800E 功能列表 基本概述 EC800X QuecDuino EVB 搭载移远 EC800 系列模组。支持模组型号为&#xff1a; EC800M 系列、EC800K 系列、EG800K 系列、EC800E 系列等。 渲染图 开发板的主要组件、接口布局见下图 资料下载 EC800X-QuecDui…

PHP轻量级聊天室源码(源码下载)

最新版本&#xff1a;v2.1.2 (2024.08更新) 运行环境&#xff1a;PHP5.6&#xff08;无需MySQL&#xff09; 核心特性&#xff1a;手机电脑自适应、TXT数据存储、50条历史消息 适用场景&#xff1a;小型社区/企业内网/教育培训即时通讯 一、核心功能亮点&#xff08;SEO关键词布…

leetcode hot100刷题日记——33.二叉树的层序遍历

解题总结二维vector的初始化方法 题目描述情况1&#xff1a;不确定行数和列数情况2&#xff1a;已知行数和列数情况3&#xff1a;已知行数但不知道列数情况4&#xff1a;已知列数但不知道行数 题目描述 解答&#xff1a;用队列 思路都差不多&#xff0c;我觉得对于我自己来说&a…

《数据结构初阶》【番外篇:快速排序的前世今生】

【番外篇&#xff1a;快速排序的前世今生】目录 前言&#xff1a;---------------起源---------------一、诞生&#xff1a;二、突破&#xff1a;三、核心&#xff1a; ---------------发展---------------1. 早期版本&#xff1a;简单但不稳定1960 年&#xff1a;初始版本 2. …

【笔记】基于 MSYS2(MINGW64)的 Poetry 虚拟环境创建指南

#工作记录 基于 MSYS2&#xff08;MINGW64&#xff09;的 Poetry 虚拟环境创建指南 一、背景说明 在基于 MSYS2&#xff08;MINGW64&#xff09;的环境中&#xff0c;使用 Poetry 创建虚拟环境是一种高效且灵活的方式来管理 Python 项目依赖。本指南将详细介绍如何在 PyChar…