当前位置: 首页 > news >正文

【存储管理—动态不等长存储资源分配算法】

文章目录

    • 一、实验目的
    • 二、实验内容与设计思想
      • 实验内容
      • 设计思路
    • 三、实验代码实现
    • 四、总结

一、实验目的

理解动态异长存储分区资源管理,掌握所需数据结构和管理程序,了解各种存储分配算法的优点和缺点。

二、实验内容与设计思想

实验内容

1.分析unix最先适应存储分配算法,即map数据结构,存储分配函数malloc()和存储释放函数mfree(),找出与算法有关的成分;
2.修改上述与算法有关的成分,使其分别体现最佳适应分配原则和最坏适应分配原则;

设计思路

  1. 数据结构设计
    定义 5 个进程(P0-P4)共享 3 类资源(R0-R2),关键数据结构包括:
    avail[R]:当前可用资源数
    max[P][R]:各进程对资源的最大需求
    allot[P][R]:各进程已分配的资源
    need[P][R]:各进程仍需的资源(need = max - allot)

  2. 安全状态检查函数 isSafe()
    核心逻辑:
    计算各进程的需求矩阵 need
    初始化工作向量 work(可用资源)和完成标志 finish
    寻找可运行的进程(need <= work),模拟资源回收,更新work并标记进程完成
    若所有进程完成则系统安全,否则不安全

三、实验代码实现

#include <stdio.h>
#include <stdlib.h>typedef struct Block {int start;int size;struct Block *next;
} Block;Block *freeList;void initMemory(int size) {freeList = (Block *)malloc(sizeof(Block));freeList->start = 0;freeList->size = size;freeList->next = NULL;
}void printFreeList() {Block *current = freeList;while (current != NULL) {printf("(%d, %d)\n", current->start, current->size);current = current->next;}
}void coalesce() {Block *current = freeList;while (current != NULL && current->next != NULL) {if (current->start + current->size == current->next->start) {current->size += current->next->size;Block *temp = current->next;current->next = temp->next;free(temp);} else {current = current->next;}}
}void mfree(int start) {Block *current = freeList, *prev = NULL;while (current != NULL && current->start != start) {prev = current;current = current->next;}if (current == NULL) return;Block *newBlock = (Block *)malloc(sizeof(Block));newBlock->start = start;newBlock->size = current->size;newBlock->next = current->next;if (prev == NULL) {freeList = newBlock;} else {prev->next = newBlock;}free(current);coalesce();
}int mallocFirstFit(int size) {Block *current = freeList, *prev = NULL;while (current != NULL) {if (current->size >= size) {if (current->size == size) {if (prev == NULL) {freeList = current->next;} else {prev->next = current->next;}free(current);return current->start;} else {Block *newBlock = (Block *)malloc(sizeof(Block));newBlock->start = current->start + size;newBlock->size = current->size - size;newBlock->next = current->next;current->size = size;current->next = newBlock;return current->start;}}prev = current;current = current->next;}return -1;
}int main() {initMemory(1000);int allocated1 = mallocFirstFit(100);printf("Allocated 1: %d\n", allocated1);int allocated2 = mallocFirstFit(200);printf("Allocated 2: %d\n", allocated2);int allocated3 = mallocFirstFit(300);printf("Allocated 3: %d\n", allocated3);printFreeList();mfree(allocated1);mfree(allocated2);mfree(allocated3);printFreeList();return 0;
}

结果:
在这里插入图片描述

四、总结

  • 遇到的问题
  1. 致命语法错误:行头缺失
    遇到的问题
    函数命名冲突:malloc函数是标准库函数,在代码中重新定义会导致冲突。
    在这里插入图片描述
    编译后提示错误,malloc 函数是标准库函数,重新定义会导致冲突。mfree 函数参数类型与标准库函数不匹配。指针转换为整数类型时需要进行类型转换。
    参数类型不匹配:mfree函数参数类型与标准库函数不匹配。
    类型转换问题:指针转换为整数类型时需要进行类型转换。
    在这里插入图片描述
    空闲列表更新问题:程序在分配和释放内存后,空闲列表显示的结果是相同的,这意味着分配和释放操作没有正确更新空闲列表。

通过这次实验,我对动态异长存储分区资源管理有了更深入的理解。我不仅掌握了所需的数据结构和管理程序,还了解了各种存储分配算法的优缺点。在今后的学习和工作中,我将更加注重基础知识的学习和积累,提高自己的编程能力和问题解决能力。同时,我也会更加注重代码的质量和可维护性,养成良好的编程习惯。

对于后续的实验,我计划对代码进行进一步的修改和完善,实现最佳适应分配原则和最坏适应分配原则。我相信通过不断的实践和学习,我能够更好地掌握操作系统的相关知识和技能。

相关文章:

  • 实验一:Linux静态路由
  • JavaScript性能优化:从青铜到王者的进阶之路
  • pip安装包时出现网络问题的坑
  • MCPHub:一站式MCP服务器聚合平台
  • 摄像头模组RGB/IR模组
  • C++初阶-string类的简单应用
  • 这些单词有什么内在联系吗?
  • 【AI】关于模型部署方案MindIE Server和vllm
  • uni-app 引入vconsole web端正常,安卓端报错 Cannot read property ‘sendBeacon‘ of undefined
  • 【25软考网工】第五章(8)路由协议RIP、OSPF
  • 深入理解 Node.js 模块化(CommonJS):原理、用法与避坑指南
  • 一文走进GpuGeek | conda常用命令
  • STM32开发GPIO
  • 【JMeter技巧】GET请求如何传递Body参数?版本兼容性详解场景需求
  • ✨WordToCard使用分享✨
  • 编写程序,统计两会政府工作报告热词频率,并生成词云
  • 前端取经路——工程化渡劫:八戒的构建之道
  • 深度学习中的autograd与jacobian
  • 分布式id的两大门派!时钟回拨问题的解决方案!
  • Redisson分布式锁的Key设计之道:确保业务高可靠与一致性
  • 韩国执政党总统候选人更换方案被否决,金文洙候选人资格即刻恢复
  • 冯德莱恩:欧美贸易谈判前不会前往美国会见特朗普
  • 海南省三亚市委原常委、秘书长黄兴武被“双开”
  • 上海加力提速推进优化营商环境,明确“十大攻坚突破任务”
  • “用鲜血和生命凝结的深厚情谊”——习近平主席署名文章中的中俄友好故事
  • 普京:“胜利日停火”已开始生效