Linux 内存管理机制概述

news2024/9/22 22:33:12

内存管理是操作系统的核心功能之一,在 Linux 系统中,内存管理机制决定了如何高效地分配、管理和回收内存资源。本文将介绍 Linux 内存管理的整体框架,并简要介绍其中的核心概念:虚拟内存、分页和页表。

1. 虚拟内存 (Virtual Memory)

虚拟内存是 Linux 内存管理的核心概念之一。它通过将物理内存和存储设备结合起来,使得每个进程都可以拥有独立的、连续的内存空间,简化了内存管理并提升了系统的安全性和稳定性。

在虚拟内存机制中,进程访问的是虚拟地址,而不是直接访问物理内存地址。内核会将虚拟地址映射到实际的物理地址,这个过程通过页表来完成。虚拟内存使得操作系统可以:

  • 提供更大的内存空间:即使物理内存不足,虚拟内存可以通过将部分数据存储在硬盘的交换分区 (swap) 中来扩展内存空间。
  • 进程隔离:每个进程都有独立的虚拟地址空间,防止了不同进程之间的内存访问冲突。

下面是一个简单的文本图例,展示虚拟内存空间和物理内存空间的映射关系:

+---------------------+           +---------------------+
|  Virtual Memory     |           |  Physical Memory    |
+---------------------+           +---------------------+
|  Virtual Page 1     |   ---->   |  Physical Page 3    |
+---------------------+           +---------------------+
|  Virtual Page 2     |   ---->   |  Physical Page 7    |
+---------------------+           +---------------------+
|  Virtual Page 3     |   ---->   |  Physical Page 1    |
+---------------------+           +---------------------+
|  Virtual Page 4     |   ---->   |  Physical Page 8    |
+---------------------+           +---------------------+

         +---------------------------+
         |         Page Table         |
         +---------------------------+
         |  Virtual Page 1 -> Page 3  |
         |  Virtual Page 2 -> Page 7  |
         |  Virtual Page 3 -> Page 1  |
         |  Virtual Page 4 -> Page 8  |
         +---------------------------+

  Swap Space (for pages not in physical memory)
说明:
  • 虚拟内存空间:虚拟内存空间的每个虚拟页面通过页表映射到物理内存中的物理页面。
  • 物理内存空间:物理内存中储存实际数据。
  • 页表:维护虚拟页面与物理页面之间的映射关系。
  • 交换空间 (Swap):当物理内存不足时,不常用的页面可能被移到交换空间中。
2. 分页 (Paging)

分页是虚拟内存实现的重要机制之一。它将虚拟内存分割成固定大小的内存块,称为“页”(page),物理内存也同样划分为与页大小相同的“页框”(page frame)。当进程需要访问数据时,内核将虚拟地址的页映射到物理内存中的页框。

分页带来的好处包括:

  • 内存利用率提高:分页机制允许物理内存与虚拟内存不连续,从而减少了内存碎片。
  • 按需分配:Linux 支持按需分页,即当某页被访问时,才将它从磁盘加载到物理内存中,这大大提升了内存的使用效率。
    下面是一个文本图例,展示虚拟地址如何通过分页机制映射到物理内存页框,并显示虚拟地址的高位和低位部分如何起作用。
虚拟地址: 32(例如,0xCAFEBABE)
---------------------------------
| 虚拟地址高位部分 (页号) | 虚拟地址低位部分 (页内偏移) |
-------------------------------------------------
|        20|          12|
-------------------------------------------------
         ↓
+-----------------------------------+
|        页表 (Page Table)          |
+-----------------------------------+
|  页表项 1: 虚拟页 1 -> 物理页 5  |
|  页表项 2: 虚拟页 2 -> 物理页 8  |
|  页表项 3: 虚拟页 3 -> 物理页 2  |
|  页表项 4: 虚拟页 4 -> 物理页 9  |
+-----------------------------------+
         ↓
+--------------------------+   
|  物理内存页框 (Page Frame) |
+--------------------------+
|  物理页框 5 (数据在这里) |
+--------------------------+
|  物理页框 8               |
+--------------------------+
|  物理页框 2               |
+--------------------------+
|  物理页框 9               |
+--------------------------+

说明:
  1. 虚拟地址结构:虚拟地址被分为高位和低位部分。高位部分用于标识虚拟页号,低位部分用于页内偏移(即该页内的具体字节地址)。
  2. 页表:虚拟页号通过查页表找到对应的物理页框号。例如,虚拟地址 0xCAFEBABE 的高位部分可能指向虚拟页 1,映射到物理页框 5。
  3. 物理内存页框:查找完成后,将虚拟页号映射到的物理页框中,再加上页内偏移,最终找到具体的数据。
3. 页表 (Page Table)

页表是 Linux 内存管理中用于存储虚拟地址到物理地址映射关系的数据结构。每个进程都有自己的页表,内核根据页表来完成虚拟内存到物理内存的转换。

页表中的每一项包含了虚拟页到物理页框的映射信息。为了提高查找效率,现代 Linux 内核使用多级页表(如二级页表或四级页表),通过分级的方式减少查找开销。此外,Linux 还使用了**页表缓存(TLB,Translation Lookaside Buffer)**来加速地址转换。TLB 是一块高速缓存,用于存储最近使用的页表项,减少对页表的访问次数。
以下是一个简化的文本图例,展示了二级页表结构如何递归映射虚拟地址到物理地址,并通过多级页表缩短查找时间:

虚拟地址: 32 位 (例如,0xCAFEBABE)
-----------------------------------------
| 高位部分 (页目录索引) | 中间部分 (页表索引) | 低位部分 (页内偏移) |
-----------------------------------------
|       10 位           |      10 位        |      12 位        |
-----------------------------------------
         ↓
+----------------------------+
| 一级页表 (Page Directory)   |
+----------------------------+
| 页目录项 1 -> 指向页表 1    |
| 页目录项 2 -> 指向页表 2    |
| 页目录项 3 -> 指向页表 3    |
+---------------------------+
         ↓
+---------------------------+
| 二级页表 (Page Table 1)    |
+---------------------------+
| 页表项 1 -> 物理页框 5      |
| 页表项 2 -> 物理页框 8      |
| 页表项 3 -> 物理页框 2      |
+---------------------------+
         ↓
+---------------------------+   
| 物理内存页框 (Page Frame)   |
+---------------------------+
| 物理页框 5 (数据在这里)      |
+---------------------------+
| 物理页框 8                 |
+---------------------------+
| 物理页框 2                 |
+---------------------------+

说明:

  1. 虚拟地址结构:虚拟地址分为三部分:

    • 高位部分(页目录索引):用于查找一级页表,即页目录中的索引。
    • 中间部分(页表索引):用于查找二级页表中的具体页表项。
    • 低位部分(页内偏移):表示在页框中的具体位置。
  2. 多级页表

    • 一级页表 (Page Directory):这是一个包含页目录项的表。每个目录项指向一个二级页表。
    • 二级页表 (Page Table):由一级页表指向,用于存储虚拟页号到物理页框的映射。
  3. 查找过程

    • 先使用虚拟地址的高位部分查找一级页表,找到对应的二级页表。
    • 再使用中间部分查找二级页表中的页表项,找到对应的物理页框。
    • 最后,结合低位部分的偏移,在物理页框中找到具体的内存地址。

多级页表的优势:

  • 减少内存消耗:一级页表只存储有效的页表指针,而不是所有虚拟页的映射信息,节省内存空间。
  • 加快查找:多级页表通过层次化的索引结构,避免了巨大单一页表带来的查找时间问题。
4. 交换 (Swapping)

交换机制是 Linux 虚拟内存管理的延伸。当物理内存不足时,系统会将不活跃的页移出内存,存储到磁盘的交换分区中。这些页在需要时可以被重新加载回内存。虽然交换机制可以扩展内存,但频繁的交换操作会导致系统性能下降,因此现代 Linux 系统尽量减少交换操作。

5. 物理内存管理

在 Linux 系统中,物理内存由内核进行全局管理,内存被分为不同的区(如 DMA 区、普通区和高端区),这些区根据硬件架构的不同为不同类型的内存分配做准备。此外,内核还通过伙伴系统 (Buddy System) 和 slab 分配器等机制高效地管理内存块的分配与回收。

总结

Linux 的内存管理机制为操作系统提供了强大的内存管理功能,从虚拟内存、分页、页表到交换等多个方面优化了内存的使用效率与安全性。通过这些机制,Linux 能够高效地管理物理内存,并为用户进程提供独立且安全的内存空间。

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

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

相关文章

【计网】从零开始掌握序列化 --- JSON实现协议 + 设计 传输\会话\应用 三层结构

唯有梦想才配让你不安, 唯有行动才能解除你的不安。 --- 卢思浩 --- 从零开始掌握序列化 1 知识回顾2 序列化与编写协议2.1 使用Json进行序列化2.2 编写协议 3 封装IOService4 应用层 --- 网络计算器5 总结 1 知识回顾 上一篇文章我们讲解了协议的本质是双方能够…

【JavaEE】多线程编程引入——认识Thread类

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你! 目录 引入: 一:Thread类 1:Thread类可以直接调用 2:run方法 &a…

SpringBoot+thymeleaf竞赛报名系统

一、介绍 > 这是一个基于Spring Boot的后台管理系统。 > 使用了Mybatis Plus作为持久层框架,EasyExcel用于Excel操作,Thymeleaf作为前端模板引擎。 > 界面简洁,功能丰富,完成度比较高,适用于JAVA初学者作…

安国U盘量产工具系列下载地址

来源地址(访问需要科学工具):AlcorMP (Последняя версия ALCOR U2 MP v23.08.07.00.H) – [USBDev.ru] 版本列表: AlcorMP(最新版本的 ALCOR U2 MP v23.08.07.00.H) AlcorMP是在Alcor Mic…

SpringBoot项目License证书生成与验证(TrueLicense) 【记录】

SpringBoot项目License证书生成与验证(TrueLicense) 【记录】 在非开源产品、商业软件、收费软件等系统的使用上,需要考虑系统的使用版权问题,不能随便一个人拿去在任何环境都能用。应用部署一般分为两种情况: 应用部署在开发者自己的云服务…

数据集-目标检测系列-火车检测数据集 train >> DataBall

数据集-目标检测系列-火车检测数据集 train >> DataBall 数据集-目标检测系列-火车检测数据集 数据量:1W 想要进一步了解,请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,不断增加…

跟李沐学AI:注意力机制、注意力分数

目录 不随意线索 随意线索 注意力机制 非参注意力池化层 参数化的注意力机制 注意力机制总结 注意力分数 拓展到高维度 加性模型(Additive Attention) 点积注意力机制(Dot Product Attention) 注意力分数总结 不随意线…

vscode 顶部 Command Center,minimap

目录 vscode 顶部 Command Center 设置显示步骤: minimap设置 方法一:使用设置界面 方法二:使用命令面板 方法三:编辑 settings.json 文件 左侧目录树和编辑器字体不一致: vscode 顶部 Command Center Visual Studio Code (VSCode) 中的 Command Center 是一个集中…

240912-设置WSL中的Ollama可在局域网访问

A. 最终效果 B. 设置Ollama(前提) sudo vim /etc/systemd/system/ollama.service[Unit] DescriptionOllama Service Afternetwork-online.target[Service] ExecStart/usr/bin/ollama serve Userollama Groupollama Restartalways RestartSec3 Environme…

Python redis 安装和使用介绍

python redis安装和使用 一、Redis 安装1.1、Windows安装 二、安装 redis 模块二、使用redis 实例1.1、简单使用1.2、连接池1.3、redis 基本命令 String1.3.1、ex - 过期时间(秒)1.3.2、nx - 如果设置为True,则只有name不存在时,当…

fiddler抓包08_抓Android手机请求

课程大纲 手机抓包,电脑端的设置和IOS端相同,设置一次即可,无需重复设置。 前提:电脑和手机连接同一个局域网 土小帽电脑和手机都连了自己的无线网“tuxiaomao”。 Step1. 电脑端设置 ① 打开Fiddler - 开启抓包(F12…

django项目——图片上传到阿里云OSS对象存储

文章目录 实现图片上传到阿里云OSS对象存储1. 创建阿里云OSS对象存储2. 查询获取接口访问key和秘钥3. 安装阿里云的SDK集成到项目中使用3.1 python直接操作oss23.2 django配置自定义文件存储上传文件到oss 实现图片上传到阿里云OSS对象存储 1. 创建阿里云OSS对象存储 开发文档…

重磅!人工智能等级考试来了,考试免费,上海落户可以加分

目录 简要介绍 一、关心的问题 1. 什么是上海市高等学校信息技术水平考试? 2. 考试分几个级别?有哪些科目? 3. 哪些人可以进行报名? 4. 每名学生可以报考几个科目? 5. 有没有考试大纲? 6. 考试是否有…

[笔记]23年度展会信息— 吊钩 起升机构

1.吊钩的规格参数 5吨吊钩重26公斤 10吨64公斤。 另外一套型号,更轻: 不确定是结构设计还是用钢材质达到了减重效果。 看看重载双滑轮吊钩: 50吨,400公斤,只是吊钩。 然后是行车吊钩与钢丝绳的直径。这在计算空载吊…

Web Components之继承

我们在使用Web Components自定义组件的时候,我们需要继承HTMLElement这个浏览器内置对象,但是如果我要一些高级封装,给组件内置一些方法的话。我们就需要使用继承的方式,在父类中实现基本功能的封装。 1 父类的封装 以下是我的继…

一文搞懂UEFI

Hi!早哦。今天又是宠读者的一天,应允聊聊UEFI。 文章目录 前言UEFI是什么?传统BIOSBIOS作为标准BIOS作为实现BIOS的工作原理传统BIOS的局限性传统BIOS启动过程 BIOS VS UEFIUEFI?UEFI概念EFI 系统分区EFI 变量EFI 的启动过程EFI 变…

【高分系列卫星简介——高分三号卫星(GF-3)】

高分三号卫星(GF-3) 高分三号(GF-3)是我国首颗高分辨率、C频段、多极化合成孔径雷达(SAR)卫星,由中国空间技术研究院北京空间飞行器总部设计部研制,并于2016年8月10日成功发射。该卫…

thop计算模型复杂度(params,flops)

thop安装 -pip install thop在线安装失败 -离线安装 github网址: pytorch-OpCounter:Count the MACs / FLOPs of your PyTorch model. - GitCode python setup.py install 测试: from options import config as c import os os.environ["CUD…

【Flink实战】flink消费http数据并将数组展开多行

文章目录 一. 需求描述二. 方案思路1. 解决思路2. flink json 解析2.1. 通过json path解析非array数据2.2. 通过json path解析array数据 3. CROSS JOIN逻辑 三. 方案实现1. http json数据样例2. flink sql 说明 一. 需求描述 flink消费http接口的数据,将json中的数…

【JavaEE初阶】多线程7(面试要点)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 常见的锁策略 乐观锁vs悲观锁 重量级锁vs轻量级锁 挂起等待锁vs自旋锁 公平锁vs非公平锁 可重入锁vs不可重入锁 读写锁 synchronized的加锁过程 锁升级的过程 偏向锁 …