发布时间:2026/7/8 21:01:11
操作系统内存管理:首次适应与最佳适应算法 4 种回收场景代码详解
操作系统内存管理首次适应与最佳适应算法的4种回收场景代码实现1. 内存管理算法概述在操作系统的内存管理中动态分区分配是一种常见的内存管理方式。它允许内存空间根据进程的需求动态划分而不是预先固定分区大小。这种灵活性带来了更高的内存利用率但也增加了管理的复杂性。动态分区分配的核心在于两个关键操作内存分配和内存回收。分配时需要选择合适的空闲分区回收时需要处理可能出现的分区合并情况。首次适应算法(First Fit)和最佳适应算法(Best Fit)是两种最常用的动态分区分配策略。首次适应算法从内存低地址开始搜索选择第一个足够大的空闲分区进行分配。这种算法简单高效但可能导致低地址部分产生大量小碎片。最佳适应算法则选择能满足需求的最小空闲分区以减少大分区的碎片化但可能导致产生大量难以利用的小碎片。2. 内存回收的四种邻接情况当进程释放内存时系统需要将回收的内存区域重新合并到空闲分区链中。根据回收区与相邻空闲分区的关系可以分为四种情况2.1 前邻接情况回收区与前一个空闲分区相邻接此时只需将回收区合并到前一个分区中增大前一个分区的大小即可。// 前邻接情况处理代码片段 if (prev ! NULL prev-data.flag 0 prev-data.address prev-data.size curr-data.address) { prev-data.size curr-data.size; prev-next curr-next; if (curr-next ! NULL) { curr-next-prior prev; } free(curr); curr prev; }2.2 后邻接情况回收区与后一个空闲分区相邻接此时需要将回收区合并到后一个分区中使用回收区的首址作为新空闲区的首址。// 后邻接情况处理代码片段 if (next ! NULL next-data.flag 0 curr-data.address curr-data.size next-data.address) { curr-data.size next-data.size; curr-next next-next; if (next-next ! NULL) { next-next-prior curr; } free(next); }2.3 前后都邻接情况回收区同时与前一个和后一个空闲分区相邻接此时需要将三个分区合并为一个大的空闲分区。// 前后都邻接情况处理代码片段 if (prev ! NULL prev-data.flag 0 next ! NULL next-data.flag 0 prev-data.address prev-data.size curr-data.address curr-data.address curr-data.size next-data.address) { prev-data.size curr-data.size next-data.size; prev-next next-next; if (next-next ! NULL) { next-next-prior prev; } free(curr); free(next); curr prev; }2.4 无邻接情况回收区前后都没有空闲分区此时需要为回收区单独创建一个新的空闲分区节点并插入到空闲链的适当位置。// 无邻接情况处理代码片段 if ((prev NULL || prev-data.flag 1) (next NULL || next-data.flag 1)) { curr-data.flag 0; curr-data.ID 0; // 可能需要调整其在链表中的位置以保持地址有序 }3. 完整的内存回收函数实现基于双向链表的数据结构我们可以实现一个完整的recycle()函数处理上述所有四种情况void recycle(int id) { DuLinkList p m_head; while (p ! m_last) { DuLinkList curr p-next; if (curr-data.ID id) { curr-data.flag 0; // 标记为空闲 curr-data.ID 0; // 清除作业ID DuLinkList prev curr-prior; DuLinkList next curr-next; // 情况3前后都邻接 if (prev ! m_head prev-data.flag 0 next ! m_last next-data.flag 0 prev-data.address prev-data.size curr-data.address curr-data.address curr-data.size next-data.address) { prev-data.size curr-data.size next-data.size; prev-next next-next; if (next-next ! m_last) { next-next-prior prev; } free(curr); free(next); curr prev; } // 情况1前邻接 else if (prev ! m_head prev-data.flag 0 prev-data.address prev-data.size curr-data.address) { prev-data.size curr-data.size; prev-next curr-next; if (curr-next ! m_last) { curr-next-prior prev; } free(curr); curr prev; } // 情况2后邻接 else if (next ! m_last next-data.flag 0 curr-data.address curr-data.size next-data.address) { curr-data.size next-data.size; curr-next next-next; if (next-next ! m_last) { next-next-prior curr; } free(next); } // 情况4无邻接无需额外处理 break; } p curr; } }4. 算法对比与性能分析首次适应算法和最佳适应算法在内存回收处理上基本相同区别主要在于分配策略。下表对比了两种算法的主要特点特性首次适应算法(First Fit)最佳适应算法(Best Fit)分配策略选择第一个足够大的分区选择能满足需求的最小分区空闲分区排序方式按地址递增排序按大小递增排序分配速度较快(找到第一个合适的就停止)较慢(需要遍历更多或全部空闲区)内存碎片低地址部分易产生小碎片容易产生大量难以利用的小碎片实现复杂度简单较复杂(需要维护有序链表)提示在实际系统设计中选择哪种算法取决于具体应用场景。首次适应算法通常实现简单且效率较高而最佳适应算法在特定工作负载下可能提供更好的内存利用率。5. 内存回收流程图解为了更直观地理解内存回收过程以下是回收逻辑的流程图开始回收 ↓ 遍历链表找到目标分区 ↓ 标记分区为空闲 ↓ 检查前一个分区是否空闲且邻接 │ ├─ 是 → 合并到前一个分区 │ └─ 否 → 检查后一个分区是否空闲且邻接 │ ├─ 是 → 合并到后一个分区 │ └─ 否 → 检查前后是否都邻接 │ ├─ 是 → 合并三个分区 │ └─ 否 → 保持独立空闲分区 ↓ 更新链表指针 ↓ 结束回收6. 实战案例演示让我们通过一个具体例子演示内存回收过程。假设初始内存状态如下空闲分区: [地址:0, 大小:100] 已分配分区1: [地址:100, 大小:50, ID:1] 已分配分区2: [地址:150, 大小:30, ID:2] 空闲分区: [地址:180, 大小:70]场景1回收ID1的分区(前邻接)分区[100,50]与前一个空闲分区[0,100]邻接合并后空闲分区变为[0,150]场景2回收ID2的分区(前后都邻接)分区[150,30]与前一个空闲分区[0,150]和后一个空闲分区[180,70]都邻接合并后空闲分区变为[0,250]场景3如果先回收ID2的分区(后邻接)分区[150,30]与后一个空闲分区[180,70]邻接合并后空闲分区变为[150,100]场景4如果中间有其他已分配分区(无邻接)比如[150,30]前后都有已分配分区回收后成为一个新的独立空闲分区7. 常见问题与调试技巧在实际实现内存管理算法时可能会遇到以下常见问题链表指针错误在合并分区时容易忘记更新相邻节点的指针导致链表断裂。解决方法每次修改节点关系后立即检查前后节点的指针是否正确。边界条件处理不当如处理链表头尾节点时出现错误。解决方法特别检查对m_head和m_last节点的操作。内存泄漏合并分区后忘记释放被合并的节点内存。解决方法确保每次合并后都free不需要的节点。地址计算错误合并分区时地址或大小计算错误。解决方法添加调试打印输出每次操作前后的分区状态。调试时可以使用的打印函数示例void debug_print() { DuLinkList p m_head-next; printf(当前空闲链状态:\n); while (p ! m_last) { printf([地址:%d, 大小:%d, 状态:%s]\n, p-data.address, p-data.size, p-data.flag ? 已分配 : 空闲); p p-next; } printf(\n); }

相关新闻

WSL2 代理配置自动化:3行脚本动态获取主机IP,告别.bashrc硬编码
2026/7/8 21:01:11

WSL2 代理配置自动化:3行脚本动态获取主机IP,告别.bashrc硬编码

WSL2 代理自动化管理:动态IP解决方案与防火墙优化实践对于在Windows Subsystem for Linux 2(WSL2)环境下开发的工程师来说,网络代理配置一直是个令人头疼的问题。每次重启WSL2后主机IP地址变化导致代理失效,手动修改环…

阅读更多
eBPF 入门:云原生观测的“新内核语言”
2026/7/8 20:01:11

eBPF 入门:云原生观测的“新内核语言”

系列导读 你现在看到的是《eBPF 云原生观测实战:从内核探针到生产可观测》的第 1/10 篇,当前这篇会重点解决:用最简明的语言和实战代码,帮读者建立 eBPF 在云原生观测中的核心认知。 上一篇回顾:这是系列首篇,我们先把整体背景和问题边界搭起来。 下一篇预告:第 2 篇《…

阅读更多
【独家首发】OpenAI官方未文档化的Tasks调度协议V2.3解析:任务分片、跨区域协同、冷启动预热机制全曝光
2026/7/8 20:01:11

【独家首发】OpenAI官方未文档化的Tasks调度协议V2.3解析:任务分片、跨区域协同、冷启动预热机制全曝光

更多请点击: https://kaifayun.com 第一章:OpenAI Tasks调度协议V2.3的演进脉络与设计哲学 OpenAI Tasks调度协议V2.3并非孤立的技术迭代,而是对大规模异步任务生命周期管理持续反思与重构的结果。其核心驱动力源于真实生产环境中暴露的三大…

阅读更多
三维模型表面积计算:网格简化对精度影响分析(从10万面到1千面)
2026/7/8 22:01:11

三维模型表面积计算:网格简化对精度影响分析(从10万面到1千面)

三维模型网格简化与表面积精度:工程实践中的量化分析在实时渲染和Web3D应用开发中,我们常常面临一个关键矛盾:模型精度与性能之间的平衡。想象一下这样的场景——当你的游戏角色模型从10万面片简化到1千面片时,那些消失的三角面究…

阅读更多
GSAM:面向铰接物体操作的安全感知机器人控制框架
2026/7/8 22:01:11

GSAM:面向铰接物体操作的安全感知机器人控制框架

1. 项目概述:这不是又一个“炫技型”机器人框架,而是专为真实场景中“拧门把手”“拉开抽屉”“翻书页”这类动作设计的底层能力基建GSAM——全称Generic Safety-Aware Manipulation Framework,直译是“通用安全感知操作框架”。但这个名字太…

阅读更多
OpenSSH Server 在 Windows 11 的完整配置:从安装到公钥登录的 5 个关键步骤
2026/7/8 22:01:11

OpenSSH Server 在 Windows 11 的完整配置:从安装到公钥登录的 5 个关键步骤

OpenSSH Server 在 Windows 11 的完整配置:从安装到公钥登录的 5 个关键步骤Windows 11 作为微软最新的操作系统,内置了对 OpenSSH 的原生支持,这为开发者、系统管理员和高级用户提供了强大的远程管理能力。本文将详细介绍如何在 Windows 11 …

阅读更多
APT 源 404 错误排查:3步定位失效仓库与清理 sources.list.d 残留配置
2026/7/8 22:01:11

APT 源 404 错误排查:3步定位失效仓库与清理 sources.list.d 残留配置

APT 源 404 错误排查:3步定位失效仓库与清理 sources.list.d 残留配置当你在 Ubuntu 或 Debian 系统上执行apt update时,最令人头疼的莫过于遇到 "404 Not Found" 或 "没有 Release 文件" 的错误。这些错误不仅会中断软件包更新流程…

阅读更多
Ubuntu/Debian 旧版本(EOL)APT 源配置:2种官方方案与 3个国内镜像站实测
2026/7/8 22:01:11

Ubuntu/Debian 旧版本(EOL)APT 源配置:2种官方方案与 3个国内镜像站实测

Ubuntu/Debian 旧版本(EOL)APT 源配置全攻略:官方方案与国内镜像站实测 当你在终端执行 apt-get update 时,突然看到一串刺眼的红色报错:"E: 仓库没有 Release 文件",这通常意味着你正在使用的…

阅读更多
操作系统内存管理实战:首次适应 vs 最佳适应算法在4次分配/回收后的碎片分析
2026/7/8 21:01:11

操作系统内存管理实战:首次适应 vs 最佳适应算法在4次分配/回收后的碎片分析

操作系统内存管理实战:首次适应 vs 最佳适应算法在4次分配/回收后的碎片分析内存管理是操作系统核心功能之一,而动态分区分配算法直接影响系统性能和资源利用率。本文将聚焦首次适应(First Fit)与最佳适应(Best Fit&am…

阅读更多
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御
2026/7/8 4:53:25

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

阅读更多
3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略
2026/7/7 22:39:42

3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略

3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾为Windows右键菜单中那些…

阅读更多
GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复
2026/7/7 22:28:33

GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复

如果你正在用 GXDE OS 或者任何基于 Deepin 的发行版,并且遇到了“检测到窗口系统采用 Wayland 协议,程序即将退出”这类弹窗,或者发现 VMware Tools 在 Ubuntu 24.04 这类默认 Wayland 的系统上启动失败,那这篇文章就是为你准备的…

阅读更多
A股股指期货:全维度解析(多表格结构化完整版)
2026/7/8 0:01:06

A股股指期货:全维度解析(多表格结构化完整版)

一、基础定义与核心本质股指期货全称股票价格指数期货,是中国金融期货交易所(中金所)上市的标准化金融期货合约,交易标的为 A 股大盘指数,约定未来特定时间按约定价格现金交割指数涨跌差价,不交割一篮子股票…

阅读更多
iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事
2026/7/8 0:01:06

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder &…

阅读更多
EM3080-W解码芯片与TM4C129ENCPDT微控制器技术解析
2026/7/8 0:01:06

EM3080-W解码芯片与TM4C129ENCPDT微控制器技术解析

1. EM3080-W解码芯片与TM4C129ENCPDT微控制器的技术特性解析EM3080-W作为专业级条码解码芯片,其核心优势在于采用了双核DSP架构。主处理核心运行频率高达120MHz,能够实时处理1280800分辨率的图像数据,而辅助协处理器则专门优化了27种一维/二维…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/8 18:15:39

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/8 10:11:21

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/7 9:58:00

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多