编写C语言程序,模拟实现首次/最佳/最坏适应算法的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况。假设初始状态下,可用的内存空间为640KB。(江西师范大学软件学院 操作系统)

2024-06-11 1401阅读

【操作系统】分区分配算法 (首次适应算法、最佳适应算法、最坏适应算法)(C语言实现)

为了实现动态分区分配,通常将系统中的空闲分区链接成一个链。所谓顺序查找是指依次搜索空闲分区链上的空闲分区,去寻找一个大小能满足要求的分区。 --------计算机操作系统(第四版)

编写C语言程序,模拟实现首次/最佳/最坏适应算法的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况。假设初始状态下,可用的内存空间为640KB。(江西师范大学软件学院 操作系统)
(图片来源网络,侵删)

可变分区也称动态分区,在指作业装入内存时,从可用的内存中划出一块连续的区域分配给他,且分区大小正好等于改作业的大小。

可变分区分配策略:

1.首次适应算法:地址递增,从链首开始

2.最佳适应算法:性能最差,容量递减,浪费最小

3.最坏适应算法:分区大小递减,整合碎片,提高利用率

首次适应算法的话可以不断的去遍历寻找空间是否为空余的。

最佳适应算法的话是要找到最佳适配的空余区域,但是也会导致空闲区被利用之后可能会有一下片内存没被利用,而这小的碎片也很难再次被利用。

最坏适应算法的话是要找到最大空间来分配内存,这样剩余的空间也会最大,这样的话可以更有效的去减少出现小碎片的情况。

分配内存的时候,总是会想到C语言有个malloc函数可以分配内存。所以我写这份作业的时候抱有这是理解malloc函数的成分在里面的。一开始本来是用vector来存放空闲链表,后来觉得要符合底层的话,还是得用纯的c语言来写更好一点。

#include 
#define MEMORY_SIZE 640 // 内存大小(单位:KB)
#define BLOCK_SIZE 1 // 内存块大小(单位:KB)
// 内存块结构体
typedef struct {
    int size; // 大小(单位:KB)
    int is_free; // 是否空闲
} block_t;
// 内存块数组
block_t memory[MEMORY_SIZE / BLOCK_SIZE];
// 初始化内存块数组
void init_memory() {
    int i;
    for (i = 0; i = blocks_needed) { // 如果当前块为空闲块并且大小足够
            if (memory[i].size = blocks_needed) { // 如果当前块为空闲块并且大小足够
            if (memory[i].size > worst_size) { // 如果当前块更大
                worst_index = i;
                worst_size = memory[i].size;
            }
        }
    }
    if (worst_index == -1) { // 分配失败
        return -1;
    }
    else {
        for (j = worst_index; j  

因为是用vs写的代码,所以用的是scanf_s。如果换别的编译器的话得改一下。

(大家看完点个赞再走,这个对我真的很重要QwQ)

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]