欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > 【存储管理—动态不等长存储资源分配算法】

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

2025/5/8 14:39:36 来源:https://blog.csdn.net/qq_73121793/article/details/147774903  浏览:    关键词:【存储管理—动态不等长存储资源分配算法】

文章目录

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

一、实验目的

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

二、实验内容与设计思想

实验内容

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函数参数类型与标准库函数不匹配。
    类型转换问题:指针转换为整数类型时需要进行类型转换。
    在这里插入图片描述
    空闲列表更新问题:程序在分配和释放内存后,空闲列表显示的结果是相同的,这意味着分配和释放操作没有正确更新空闲列表。

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词