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

一、课程核心主题引入

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

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

二、段页结合的思路解析

  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.pswp.cn/diannao/85192.shtml

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

相关文章

RAID磁盘阵列配置

RAID磁盘阵列配置 文章目录 RAID磁盘阵列配置一、磁盘管理其他相关命令1.fsck-检查文件的正确性2.dd-建立和使用交换文件3.mkswap-建立和设置SWAP交换分区 二、RAID配置 一、磁盘管理其他相关命令 1.fsck-检查文件的正确性 [rootlocalhost ~]# fsck -aC /dev/sda1 //检查文…

网站服务器出现异常的原因是什么?

网站时企业和个人用户进行提供信息和服务的重要平台,随着时间的推移,网站服务器出现异常情况也是常见的问题之一,这可能会导致网站无法正常访问或者是运行缓慢,会严重影响到用户的体验感,本文就来介绍一下网站服务器出…

LINUX528 重定向

2>&1 我的理解: 2>&1,2stderr错误输出,1stdout输出,stderr一般和stdout是分别输出(管道符只传递stdout,据元宝,stderr默认输出到终端;如果重定向符不进行2显示重定向&…

【Python高阶】面向对象

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心知识图谱💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:面向对象电商系统…

榕壹云医疗服务系统:基于ThinkPHP+MySQL+UniApp的多门店医疗预约小程序解决方案

在数字化浪潮下,传统医疗服务行业正面临效率提升与客户体验优化的双重挑战。针对口腔、美容、诊所、中医馆、专科医院及康复护理等需要预约或诊断服务的行业,我们开发了一款基于ThinkPHP+MySQL+UniApp的多门店服务预约小程序——榕壹云医疗服务系统。该系统通过模块化设计与开…

Vue-过滤器

过滤器 时间戳格式化 实现方式 计算属性方法过滤器 基础依赖 day.min.js 下载链接放到 相对路径 js 目录下 Computed 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>过滤器</title>…

Linux 下 C 语言实现工厂模式

Linux 下 C 语言实现工厂模式&#xff1a;设计理念与实战 &#x1f9e0; 一、工厂模式简介什么是工厂模式&#xff1f;C 语言实现设计模式的挑战 &#x1f3d7;️ 二、实现简单工厂模式&#xff08;Simple Factory&#xff09;1. 定义传感器接口&#xff08;device.h&#xff0…

用 Appuploader,让 iOS 上架流程真正“可交接、可记录、可复用”:我们是这样实现的

你可能听说过这样一类人&#xff1a;上线必找他&#xff0c;证书只有他有&#xff0c;Transporter 密码在他电脑上&#xff0c;描述文件什么时候过期&#xff0c;只有他知道。 如果你团队里有这样一位“发布大师”&#xff0c;他可能是个英雄——但也是个单点风险源。 我们团…

工控机安装lubuntu系统

工控机安装lubuntu系统指南手册 1. 准备 1个8G左右的U盘 下载Rufus&#xff1a; Index of /downloads 下载lubuntu系统镜像&#xff1a; NJU Mirror Downloads – Lubuntu 下载Ventoy工具&#xff1a; Releases ventoy/Ventoy GitHub 下载后&#xff0c;解压&#…

MAC上怎么进入隐藏目录

在Mac上&#xff0c;由于系统保护的原因&#xff0c;一些系统目录如/usr默认是隐藏的&#xff0c;但可以通过以下方法进入&#xff1a; 方法一&#xff1a;使用Finder的“前往文件夹”功能 打开Finder。使用快捷键Command Shift G&#xff0c;或者在菜单栏中选择“前往”-“…

流媒体基础解析:视频清晰度的关键因素

在视频处理的过程中&#xff0c;编码解码及码率是影响视频清晰度的关键因素。今天&#xff0c;我们将深入探讨这些概念&#xff0c;并解析它们如何共同作用于视频质量。 编码解码概述 编码&#xff0c;简单来说&#xff0c;就是压缩。视频编码的目的是将原始视频数据压缩成较…

tomcat服务器以及接受请求参数的方式

1.javaee&#xff1a;意为java企业版&#xff0c;指java企业级开发的规范总和&#xff0c;包含13项技术规范 2.事实上服务器和客户端进行交互的过程中&#xff0c;有一个前端控制器在中间运作&#xff0c;这个控制器为DispatcherServlet&#xff0c;它负责将客户端请求的信息包…

武警智能兵器室系统架构设计与关键技术解析

在现代化武警部队建设中&#xff0c;武器弹药的安全管理与快速响应能力直接影响部队战斗力。本文基于某实战化智能兵器室建设案例&#xff0c;深入解析其系统架构设计、关键技术实现及创新管理机制&#xff0c;为安防领域提供可借鉴的解决方案。 整体拓扑结构 系统采用分层分布…

RLHF奖励模型的训练

由于 RLHF 的训练过程中需要依赖大量的人类偏好数据进行学习&#xff0c;因此很难在训练过程中要求人类标注者实时提供偏好反馈。为此&#xff0c;我们需要训练一个模型来替代人类在 RLHF 训练过程中实时提供反馈&#xff0c;这个模型被称为奖励模型 &#x1f538;一、 目标函…

reverse_ssh 建立反向 SSH 连接指南 混淆AV [好东西哟]

目录 &#x1f310; 工具简介 ⚙️ 前提条件 攻击主机 (Linux) 目标主机 (Windows) &#x1f4cb; 详细步骤 步骤 1&#xff1a;安装 Go 环境 步骤 2&#xff1a;安装必要依赖 步骤 3&#xff1a;下载并编译 reverse_ssh 步骤 4&#xff1a;配置密钥 步骤 5&#xff…

Ubuntu 下搭建ESP32 ESP-IDF开发环境,并在windows下用VSCode通过SSH登录Ubuntu开发ESP32应用

Ubuntu 下搭建ESP32 ESP-IDF开发环境&#xff0c;网上操作指南很多&#xff0c;本来一直也没有想过要写这么一篇文章。因为我其实不太习惯在linux下开发应用&#xff0c;平时更习惯windows的软件操作&#xff0c;只是因为windows下开发ESP32的应用编译时太慢&#xff0c;让人受…

Rust使用Cargo构建项目

文章目录 你好&#xff0c;Cargo&#xff01;验证Cargo安装使用Cargo创建项目新建项目配置文件解析默认代码结构 Cargo工作流常用命令速查表详细使用说明1. 编译项目2. 运行程序3.快速检查4. 发布版本构建 Cargo的设计哲学约定优于配置工程化优势 开发建议1. 新项目初始化​2. …

免费且好用的PDF水印添加工具

软件介绍 琥珀扫描.zip下载链接&#xff1a;https://pan.quark.cn/s/3a8f432b29aa 今天要给大家推荐一款超实用的PDF添加水印工具&#xff0c;它能够满足用户给PDF文件添加水印的需求&#xff0c;而且完全免费。 这款PDF添加水印的软件有着简洁的界面&#xff0c;操作简便&a…

NW969NW978美光闪存颗粒NW980NW984

NW969NW978美光闪存颗粒NW980NW984 技术解析&#xff1a;NW969、NW978、NW980与NW984的架构创新 美光&#xff08;Micron&#xff09;的闪存颗粒系列&#xff0c;尤其是NW969、NW978、NW980和NW984&#xff0c;代表了存储技术的前沿突破。这些产品均采用第九代3D TLC&#xf…

Mysql常用知识3:Kafka和数据库优化

文章目录 一、分布式消息系统&#xff08;Kafka相关问题5-10&#xff09;5. Kafka如何保证消息不丢失&#xff1f;6. 项目中Kafka具体怎么使用的&#xff1f;7. 消息异常未发送成功怎么解决&#xff1f;8. 重试具体怎么做的&#xff0c;循环吗&#xff1f;9. 重试多次失败怎么办…