操作系统:内存管理

目录

1、主要目标

2、核心概念和技术

2.1 物理内存与虚拟内存

2.2 内存分页机制

2.3 页面置换算法

3、监控与性能优化

3.1 查看物理内存

3.2 查看虚拟内存

3.3 性能问题

1> 内存不足(OOM)

2> 内存泄漏

3> 内存碎片

3.4 性能优化策略

1> 系统级优化

2> 应用级优化

3> 硬件级优化


1、主要目标

内存管理:是确保计算机系统高效、安全地利用物理内存和虚拟内存的核心机制,涉及内存分配、保护、共享及扩展等关键任务。

主要目标:

  • 高效利用内存:减少碎片,最大化可用空间。

  • 隔离与保护:防止进程越界访问其他进程或内核内存。

  • 透明扩展:通过虚拟内存技术让程序感知到比物理内存更大的空间。

  • 共享与协作:允许多个进程安全共享代码或数据(如动态库)。

2、核心概念和技术

2.1 物理内存与虚拟内存

物理内存:指主板上的RAM芯片,是真实存在的电路存储单元,CPU通过内存总线直接读写物理内存,速度极快(GB/s级带宽),空间有限(内存大小受硬件规格限制),无法动态扩展(需增加内存条),扩展上限受主板支持的最大内存容量和CPU寻址能力限制(如32位系统最大支持4GB),用于临时存储(正在运行的程序和实时处理的数据),断电丢失。

虚拟内存:是一种内存管理技术,它通过软硬件结合的方式,让程序“认为”自己拥有连续的、独立的大内存空间,而实际上这些内存可能由物理内存(RAM)和磁盘存储(如硬盘或SSD)共同组成。程序无需关心物理内存的实际分配,由操作系统和硬件(如MMU,内存管理单元)动态管理。当物理内存不足时,操作系统将暂时不用的数据(如未活跃的程序页)换出(Swap Out)到磁盘的交换空间(Swap Space),需要时再“换入”,但频繁交换会导致性能下降(称为“内存抖动”)。

2.2 内存分页机制

内存的分页机制旨在解决内存碎片化问题、提高内存利用率,并支持虚拟内存的实现。

  • 分页:将物理内存和虚拟内存划分为固定大小的块(通常为4KB,也可支持更大尺寸如2MB或1GB)。物理内存的块称为页框(Page Frame),虚拟内存的块称为页(Page)

  • 页表(Page Table):每个进程拥有独立的页表,记录虚拟页到物理页框的映射关系,由操作系统维护。

核心作用:

  • 消除外部碎片:通过固定大小的分页,物理内存可以被灵活分配,避免因连续内存分配导致无法利用的小块内存。

  • 虚拟内存支持:允许进程的虚拟地址空间大于物理内存,通过将部分页暂时存储在磁盘上(如交换空间),按需加载到内存。

  • 内存保护:通过页表项的权限位(读/写/执行)实现进程间的隔离和保护。

关键机制:

  • TLB(Translation Lookaside Buffer)

    • 缓存近期使用的页表项,加速地址转换。若TLB命中,无需访问内存中的页表。

  • 缺页中断(Page Fault)

    • 当访问的页不在内存中时,CPU触发缺页异常,操作系统需执行以下操作:

      1. 检查虚拟地址合法性(防止越界访问)。

      2. 从磁盘(如交换区)加载缺失页到物理内存。

      3. 更新页表并重新执行引发异常的指令。

  • 页面置换算法

    • 当物理内存不足时,需选择合适的页换出(如LRU、FIFO、Clock算法等)。

示例场景:

当进程访问虚拟地址 0x12345678(4KB页)时:

  1. 拆分页号 0x12345 和偏移 0x678

  2. 查询页表发现该页未加载到内存 → 触发缺页中断。

  3. 操作系统从磁盘加载该页到空闲页框(如物理地址 0xABCD000)。

  4. 更新页表,TLB刷新,进程继续执行。

2.3 页面置换算法

当物理内存不足时,选择部分页面换出到磁盘(交换空间)。常用算法如:

  • 最佳置换(OPT, Optimal Page Replacement):置换未来最长时间不会被访问的页面,需预知未来访问序列(理论最优,无法实现,仅用于评估其他算法)。

  • 先进先出(FIFO, First-In First-Out):置换最早进入内存的页面,简单,但性能较差(可能淘汰频繁访问的页面),可能产生“Belady异常”(增加物理页框数时,缺页率反而升高)。

  • 最近最少使用(LRU, Least Recently Used):置换最长时间未被访问的页面,缺页率近似OPT,硬件支持要求较高(如TLB记录访问时间)。

  • 时钟算法(Clock/ Second Chance):近似LRU,通过维护一个循环队列(类似时钟的指针)遍历所有物理页帧,并利用每个页面的访问位(Reference Bit)来判断页面是否最近被使用过(优先淘汰未被访问的页面:若页面未被访问(访问位为0),则直接替换;若被访问过(访问位为1),则给予一次“机会”,将访问位置0后继续查找)。

  • 改进型时钟算法(Enhanced Clock):结合访问位(R)和修改位(M),分多轮筛选,减少磁盘I/O,优先淘汰无需写回的页面。

  1. 找 R=0, M=0(未访问且未修改)。

  2. 找 R=0, M=1(未访问但需写回)。

  3. 重复上述步骤,直到找到候选页。

  • 最不常用算法(LFU, Least Frequently Used):为每个页面维护计数器,当发生缺页中断时,淘汰计数器值最小的那个页面。需要定期衰减计数。缺点是历史累积访问次数可能无法反映近期需求。

  • 工作集算法(Working Set):根据进程的“工作集”(最近一段时间内访问的页面集合)保留页面。若页面不在工作集中,则置换。避免频繁缺页,适合长期运行的进程。

算法优点缺点适用场景
OPT理论最优缺页率不可实现算法评估
FIFO实现简单Belady现象,性能差简单系统
LRU符合局部性,缺页率低硬件开销大通用系统
Clock低开销,接近LRU性能可能重复扫描多数现代系统
LFU反映访问频率无法适应访问模式变化特定缓存场景
工作集防止抖动,适应长期行为实现复杂长期运行进程

实际系统中的应用:

  • Linux:采用改进的时钟算法(结合LRU和双链表策略),将页面分为活跃(Active)和非活跃(Inactive)链表,优先置换非活跃页面。

  • Windows:使用工作集管理结合LRU的变种,支持全局和局部分配策略。

3、监控与性能优化

3.1 查看物理内存

Windows

  • 任务管理器 → “性能”标签 → 查看“内存”使用情况(如已用/可用容量、缓存数据)。

  • 通过Resource Monitor(资源监视器)分析具体进程的内存占用。

Linux

  • 终端命令free -htop查看内存使用。

  • vmstat监控内存和交换空间的使用情况。

物理内存不足的表现

  • 系统卡顿:频繁读写硬盘(虚拟内存),硬盘灯常亮。

  • 程序崩溃:应用提示“内存不足”(如Out of Memory错误)。

  • 多任务受限:同时打开多个程序时响应变慢甚至无响应。

优化方法:

  • 关闭不必要的后台程序。

  • 升级物理内存容量(增加内存条)。

  • 调整虚拟内存大小(仅缓解,无法替代物理内存性能)。

3.2 查看虚拟内存

Windows

任务管理器:

  • 按 Ctrl+Shift+Esc 打开任务管理器。

  • 切换到 性能 选项卡 → 点击 内存

    • 查看 已提交(Committed) 的虚拟内存总量(“已使用/总量”)。

    • 分页文件(Page File) 是虚拟内存的磁盘文件(默认在 C:\pagefile.sys)。

Linux

1> 查看物理内存和交换空间(Swap)的使用情况:free 

free -h  # 显示内存总量、已用、空闲、缓存等

输出示例:

              total        used        free      shared  buff/cache   available
Mem:           15Gi        5.2Gi       2.1Gi       0.5Gi        7.7Gi        9.4Gi
Swap:           2Gi        0.5Gi        1.5Gi

  • Swap 行显示交换分区(虚拟内存的磁盘部分)的使用情况。

  • 输出关键字段:

    • total:物理内存总量。

    • used:已用内存(包括缓存和缓冲区)。

    • free:完全空闲内存。

    • buff/cache:内核缓存和缓冲区占用的内存(可回收)。

    • available:实际可用内存(估算值)。

2> 实时查看内存和交换空间占用:top 

top  # 实时显示进程内存占用(RES、VIRT)
  • 在 top 界面中,关注 KiB Swap 行(按 Shift+M 按内存排序进程)。

  • RES(Resident Memory):进程实际占用的物理内存。

  • VIRT(Virtual Memory):进程的虚拟内存总量(含共享库和映射文件)。

3> 查看虚拟内存统计信息(包括页交换):vmstat 

vmstat 1  # 每秒输出一次内存、交换、I/O等统计

关键字段

  • si(swap in):每秒从磁盘加载到内存的数据量(KB)。

  • so(swap out):每秒从内存换出到磁盘的数据量(KB)。

  • 若 si/so 持续较高,说明系统频繁换页(内存不足)。

4> 显示详细的内存和交换空间信息:查看 /proc/meminfo 文件

cat /proc/meminfo

关键字段

  • SwapTotal:交换分区总大小。

  • SwapFree:空闲交换空间。

  • SwapCached:缓存的交换空间。

3.3 性能问题

1> 内存不足(OOM)

症状:

  • 频繁换页(vmstat 中 si/so 高)。

  • 系统响应变慢,进程被OOM Killer终止(Linux)。

定位:

  • 使用 top 或 smem 找出内存占用高的进程。

  • 检查内核日志(dmesg)确认OOM事件。

2> 内存泄漏

症状:

  • 进程的RSS(物理内存占用)持续增长,即使空闲时也不释放。

定位:

  • valgrind 或 heaptrack 分析进程内存分配。

  • 监控进程的 /proc/[pid]/status 中的 VmRSS 字段。

3> 内存碎片

症状:

  • 物理内存有空闲,但无法分配连续大块内存(如启动大型应用失败)。

定位:

  • 查看 /proc/buddyinfo(Linux)分析内存碎片情况。

3.4 性能优化策略

1> 系统级优化

调整交换空间(Swap)

  • 增加交换分区大小(尤其在物理内存不足时)。

  • 调整 swappiness(Linux):

sysctl vm.swappiness=10  # 降低换页倾向(0-100,默认60)

优化页面置换算法

  • Linux默认使用 CFQ 或 mq-deadline 调度器,可替换为更高效的算法(如 noop 对SSD更友好)。

透明大页(Transparent HugePages, THP)

echo always > /sys/kernel/mm/transparent_hugepage/enabled  # 启用THP(减少页表项数量)
  • 适用于需要大内存连续分配的应用(如数据库)。

内存压缩(Zswap/Zram)

  • 启用 Zswap(压缩内存数据后再换出到磁盘):
echo 1 > /sys/module/zswap/parameters/enabled

2> 应用级优化

  • 减少内存分配频率

    • 使用内存池(Memory Pool)或对象池(Object Pool)复用内存。

    • 避免频繁的 malloc/free 或 new/delete

  • 降低内存占用

    • 优化数据结构(如用 位图 代替布尔数组)。

    • 使用惰性加载(Lazy Loading)延迟初始化非关键数据。

  • 避免内存泄漏

    • 使用智能指针(C++)或自动垃圾回收(Java/Python)。

    • 定期静态代码分析(如 clang-tidyCoverity)。

3> 硬件级优化

  • 升级物理内存:直接增加RAM容量。

  • 使用高速存储:用SSD替代HDD,减少换页延迟。

  • NUMA优化(多核服务器):

numactl --cpunodebind=0 --membind=0 ./program  # 绑定进程到特定NUMA节点

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

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

相关文章

专题四:综合练习( 找出所有子集的异或总和再求和)

以leetcode1863题为例 题目分析: 找到每个子集,然后子集中的元素异或之后全部相加 算法原理分析: 画决策树:第一层为这个子集有一个元素 第二层这个子集有两个元素 从上往下罗列,把所有子集都罗列出来&#xf…

【python】—conda新建python3.11的环境报错

1.报错 conda create -n py3.11 python3.11 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ Collecting package metadata: done Solving environment: failed PackagesNotFoundError: The following packages are not available from current channel…

RabbitMQ事务机制

在RabbitMQ中,生产者为了确保消息发送成功,一种是使用 confirm 确认机制,另一种就是使用事务机制,事务机制就是允许生产者在发送消息时,将多个消息操作作为一个原子单元进行处理,要么所有操作都成功执行&am…

两台笔记本电脑直接通过HDMI线连接?

两台笔记本电脑直接通过HDMI线连接通常无法实现屏幕共享或数据传输,因为HDMI接口设计主要用于单向音视频输出(如连接显示器或电视)。以下是详细分析和替代方案: 为什么HDMI直连两台电脑不适用? 接口功能限制:• 大多数笔记本电脑的…

CentOS 和 RHEL

CentOS 和 RHEL(Red Hat Enterprise Linux)关系非常紧密,简而言之: CentOS 最初是 RHEL 的免费、开源克隆版,几乎与 RHEL 二进制兼容。 CentOS 原是 RHEL 的“免费双胞胎”,但已被放弃,现在推荐…

使用光标测量,使用 TDR 测量 pH 和 fF

时域反射计 (TDR) 是一种通常用于测量印刷电路板 (PCB) 测试试样和电缆阻抗的仪器。TDR 对于测量过孔和元件焊盘的电感和电容、探针尖端电容和电感,甚至寄生电感收发器耦合电容器也非常有用。这也是验证仿真或提取您自…

9.9 Ollama私有化部署Mistral 7B全指南:命令行交互到API集成全流程解析

Ollama私有化部署Mistral 7B全指南:命令行交互到API集成全流程解析 关键词:Ollama 私有化部署, Mistral 7B 运行, 本地大模型管理, 命令行交互, REST API 集成 一、Mistral 7B 模型特性解析 Mistral 7B 是由 Mistral AI 团队开发的高性能开源大语言模型,在同等参数量级模型…

vscode与keil的乱码不兼容问题

都用英文注释 中文注释的话,打开vscode的自动识别格式,如下 解决VSCode中文乱码 自动识别也可以设置识别优先级,把GB2312和UTF8排在自动识别序列前面(因为keil默认就是GB2312) 4.!!!在暂存更改的时候,不要把vscode的设置给暂存了&#xff…

大模型中的KV Cache

1. KV Cache的定义与核心原理 KV Cache(Key-Value Cache)是一种在Transformer架构的大模型推理阶段使用的优化技术,通过缓存自注意力机制中的键(Key)和值(Value)矩阵,避免重复计算&…

Maven 公司内部私服中央仓库搭建 局域网仓库 资源共享 依赖包构建共享

介绍 公司内部私服搭建通常是为了更好地管理公司内部的依赖包和构建过程,避免直接使用外部 Maven 中央仓库。通过搭建私服,团队能够控制依赖的版本、提高构建速度并增强安全性。公司开发的一些公共工具库更换的提供给内部使用。 私服是一种特殊的远程仓…

文档外发安全:企业数据防护的最后一道防线

在当今数字化时代,数据已成为企业最宝贵的资产之一。随着网络安全威胁日益增多,企业安装专业加密软件已从"可选"变为"必选"。本文将全面分析企业部署华途加密解决方案后获得的各项战略优势。 一、数据安全防护升级 核心数据全面保护…

【ArcGIS】根据shp范围生成系列等距点:范围外等距点+渔网点(Python全代码)

【ArcGIS】根据shp范围生成系列等距点 目标1:生成边界外一定范围、并且等间距分布的点📁 所需数据:操作步骤-ArcGIS代码处理-Python 目标2:生成等距渔网点📁 所需数据:代码处理-Python 参考 目标1&#xff…

Docker 环境安装(2025最新版)

Docker在主流的操作系统和云平台上都可以使用,包括Linux操作 系统(如Ubuntu、 Debian、Rocky、Redhat等)、MacOS操作系统和 Windows操作系统,以及AWS等云平 台。 Docker官网: https://docs.docker.com/ 配置宿主机网…

Java并发编程-线程池(二)

文章目录 线程池的实现原理execute(Runnable command)**1. 阶段一:尝试创建核心线程****2. 阶段二:尝试将任务加入队列****3. 阶段三:尝试创建非核心线程或拒绝任务****关键机制与设计思想** 线程池的实现原理 当向线程池提交一个任务之后&a…

清华大学开源软件镜像站地址

清华大学开源软件镜像站: https://mirrors.tuna.tsinghua.edu.cn/

脑机接口技术:开启人类与机器融合的新时代

摘要 脑机接口(BCI)技术作为一项前沿科技,正在逐步打破人类与机器之间的沟通障碍,为医疗、娱乐、教育等多个领域带来前所未有的变革。本文将详细介绍脑机接口技术的基本原理、发展现状、应用场景以及面临的挑战和未来发展趋势&…

2025前端面试遇到的问题(vue+uniapp+js+css)

Vue相关面试题 vue2和vue3的区别 一、核心架构差异 特性Vue2Vue3响应式系统基于Object.defineProperty基于Proxy(支持动态新增/删除属性)代码组织方式Options API(data/methods分块)Composition API(逻辑按功能聚合&am…

Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解

Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解 目录 Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解效果一览基本介绍程序设计参考资料效果一览 基本介绍 Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解 可直接运行 分解效果好 适合作为创新点(Matlab完整源码和数据),…

Gatsby知识框架

一、Gatsby 基础概念 1. 核心特性 基于React的静态站点生成器:使用React构建,输出静态HTML/CSS/JS GraphQL数据层:统一的数据查询接口 丰富的插件系统:超过2000个官方和社区插件 高性能优化:自动代码分割、预加载、…

【论信息系统项目的资源管理】

论信息系统项目的资源管理 前言一、规划好资源管理,为保证项目完成做好人员规划二、估算活动资源,为制订项目进度计划提供资源需求三、获取项目资源,组建一个完备的项目团队四、建设项目团队,提高工作能力,促进团队成员…