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

06-11 1395阅读

【操作系统】分区分配算法 (首次适应算法、最佳适应算法、最坏适应算法)(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购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]