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

这篇具有很好参考价值的文章主要介绍了编写C语言程序,模拟实现首次/最佳/最坏适应算法的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况。假设初始状态下,可用的内存空间为640KB。(江西师范大学软件学院 操作系统)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

可变分区分配策略:

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

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

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

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

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

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

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

#include <stdio.h>

#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 < MEMORY_SIZE / BLOCK_SIZE; i++) {
        memory[i].size = BLOCK_SIZE;
        memory[i].is_free = 1;
    }
}

// 显示内存分配情况
void print_memory() {
    int i, free_blocks = 0, allocated_blocks = 0, free_size = 0, allocated_size = 0;
    printf("\n------------------------------\n");
    printf("      Memory Allocation\n");
    printf("------------------------------\n");
    for (i = 0; i < MEMORY_SIZE / BLOCK_SIZE; i++) {
        printf("%d ", i);
        if (memory[i].is_free) {
            printf("Free   ");
            free_blocks++;
            free_size += memory[i].size;
        }
        else {
            printf("Allocated ");
            allocated_blocks++;
            allocated_size += memory[i].size;
        }
        printf("%dKB\n", memory[i].size);
    }
    printf("------------------------------\n");
    printf("Total Blocks: %d\n", free_blocks + allocated_blocks);
    printf("Free Blocks: %d\n", free_blocks);
    printf("Allocated Blocks: %d\n", allocated_blocks);
    printf("Total Size: %dKB\n", free_size + allocated_size);
    printf("Free Size: %dKB\n", free_size);
    printf("Allocated Size: %dKB\n", allocated_size);
    printf("------------------------------\n\n");
}

// 首次适应算法分配内存
int first_fit_allocation(int size) {
    int i, j;
    int blocks_needed = (size + BLOCK_SIZE - 1) / BLOCK_SIZE; // 需要的块数
    for (i = 0; i < MEMORY_SIZE / BLOCK_SIZE; i++) {
        if (memory[i].is_free) { // 如果当前块为空闲块
            int free_blocks = 0;
            for (j = i; j < MEMORY_SIZE / BLOCK_SIZE && memory[j].is_free; j++) {
                free_blocks++;
                if (free_blocks == blocks_needed) { // 如果找到了足够的空闲块
                    for (j = i; j < i +
                        blocks_needed; j++) {
                        memory[j].is_free = 0;
                    }
                    return i; // 返回分配的起始块的索引
                }
            }
        }
    }
    return -1; // 分配失败
}

// 最佳适应算法分配内存
int best_fit_allocation(int size) {
    int i, j;
    int blocks_needed = (size + BLOCK_SIZE - 1) / BLOCK_SIZE; // 需要的块数
    int best_index = -1, best_size = MEMORY_SIZE / BLOCK_SIZE + 1; // 初始化为无效值
    for (i = 0; i < MEMORY_SIZE / BLOCK_SIZE; i++) {
        if (memory[i].is_free && memory[i].size >= blocks_needed) { // 如果当前块为空闲块并且大小足够
            if (memory[i].size < best_size) { // 如果当前块更小
                best_index = i;
                best_size = memory[i].size;
            }
        }
    }
    if (best_index == -1) { // 分配失败
        return -1;
    }
    else {
        for (j = best_index; j < best_index + blocks_needed; j++) {
            memory[j].is_free = 0;
        }
        return best_index; // 返回分配的起始块的索引
    }
}

// 最坏适应算法分配内存
int worst_fit_allocation(int size) {
    int i, j;
    int blocks_needed = (size + BLOCK_SIZE - 1) / BLOCK_SIZE; // 需要的块数
    int worst_index = -1, worst_size = -1; // 初始化为无效值
    for (i = 0; i < MEMORY_SIZE / BLOCK_SIZE; i++) {
        if (memory[i].is_free && 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 < worst_index + blocks_needed; j++) {
            memory[j].is_free = 0;
        }
        return worst_index; // 返回分配的起始块的索引
    }
}

// 回收内存
void deallocation(int start_index) {
    int i;
    for (i = start_index; i < MEMORY_SIZE / BLOCK_SIZE && !memory[i].is_free; i++) {
        memory[i].is_free = 1;
    }
}

int main() {
    int choice, size, start_index;
    init_memory();
    do {
        print_memory();
        printf("1. First Fit Allocation\n");
        printf("2. Best Fit Allocation\n");
        printf("3. Worst Fit Allocation\n");
        printf("4. Deallocation\n");
        printf("0. Exit\n");
        printf("Enter your choice: ");
        scanf_s("%d", &choice);
        switch (choice) {
        case 1:
            printf("Enter the size to be allocated (in KB): ");
            scanf_s("%d", &size);
            start_index = first_fit_allocation(size);
            if (start_index == -1) {
                printf("Memory allocation failed.\n");            } else {
                    printf("Memory allocated from block %d to %d.\n", start_index, start_index + (size + BLOCK_SIZE - 1) / BLOCK_SIZE - 1);
            }
            break;
        case 2:
            printf("Enter the size to be allocated (in KB): ");
            scanf_s("%d", &size);
            start_index = best_fit_allocation(size);
            if (start_index == -1) {
                printf("Memory allocation failed.\n");
            }
            else {
                printf("Memory allocated from block %d to %d.\n", start_index, start_index + (size + BLOCK_SIZE - 1) / BLOCK_SIZE - 1);
            }
            break;
        case 3:
            printf("Enter the size to be allocated (in KB): ");
            scanf_s("%d", &size);
            start_index = worst_fit_allocation(size);
            if (start_index == -1) {
                printf("Memory allocation failed.\n");
            }
            else {
                printf("Memory allocated from block %d to %d.\n", start_index, start_index + (size + BLOCK_SIZE - 1) / BLOCK_SIZE - 1);
            }
            break;
        case 4:
            printf("Enter the starting block index to be deallocated: ");
            scanf_s("%d", &start_index);
            deallocation(start_index);
            printf("Memory deallocated from block %d.\n", start_index);
            break;
        case 0:
            printf("退出...\n");
            break;
        default:
            printf("没有这个选项\n");
        }
    } while (choice != 0);
    return 0;
}

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

(大家看完点个赞再走,这个对我真的很重要QwQ)文章来源地址https://www.toymoban.com/news/detail-476237.html

到了这里,关于编写C语言程序,模拟实现首次/最佳/最坏适应算法的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况。假设初始状态下,可用的内存空间为640KB。(江西师范大学软件学院 操作系统)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu22.2下C语言编程实现,首次,最佳适应算法

    编写C语言程序,模拟实现首次/最佳/最坏适应算法(选择其中之一即可)的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况。假设初始状态下,可用的内存空间为640KB。 假设下列作业请求序列: (1)作业1 申请130 KB (2)作业2 申请60 KB (3)作业

    2024年02月05日
    浏览(45)
  • 二叉树基本操作演示程序C语言编写

    问题描述:设计一个与二叉树基本操作相关的演示程序 要求:开发工具Dev C++   c语言编写 1.创建二叉树。 2.将创建的二叉树,以树状形式输出。 3.分别以先序、中序、后序三种遍历方式访问二叉树。 4.输出二叉树中的叶子结点以及叶子结点的个数。 5.输出二叉树的高度。 代

    2024年02月08日
    浏览(47)
  • 为什么选择Go语言编写网络应用程序

    关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力! 作为一名后端开发者,你一定对选择合适的编程语言来编写网络应用程序非常重视。在众多的编程语言中,Go语言(Golang)凭借其独特的特性和

    2024年02月02日
    浏览(89)
  • 使用VScode编写C语言程序 环境安装配置 保姆级教程

    Visual Studio Code可通过安装插件来支持C++、C#、Python、PHP等语言,使用的工程师越来越多,本文介绍如何使用VS Code进行C语言的编译与调试 目录 一 vsCode配置C/C++环境 1. vsCode下载和安装 2. 安装vsCode 二 MinGW编译器下载和配置 1. 下载编译器MinGW并解压  2. 将MinGW添加至环境变量 3

    2024年02月04日
    浏览(71)
  • C语言爬虫程序编写的爬取APP通用模板

    互联网的飞快发展,尤其是手机终端业务的发展,让越来越多的事情都能通过手机来完成,电脑大部分的功能也都能通过手机实现,今天我就用C语言写一个手机APP类爬虫教程,方便后期拓展APP爬虫业务。而且这个模板是通用的适合各种APP爬虫,下面跟着我看下具体的代码吧。

    2024年01月18日
    浏览(50)
  • 2、有序链表的维护【问题描述】编写一个程序,根据从标准输入接收的指令来维护和操作排序的链表(C语言、java和Python分别实现)

    【问题描述】 编写一个程序,根据从标准输入接收的指令来维护和操作排序的链表。链表是按顺 序维护的,这意味着链表中的数据在每次操作后都以递增的数字顺序存储。 请注意,在创建新节点时,需要使用malloc为它们分配空间;一旦不再需要任何已 分配的空间,就应该使

    2024年02月09日
    浏览(45)
  • 编写c语言程序调用openssl编译出的动态链接库

    下载安装openssl并编译生成链接库的过程在我的另一篇文章中已经详细说明了:Ubuntu中安装OpenSSL 此外,我们还需要提前了解一些关于动态链接库的知识,具体内容可以在我的这篇文章中查看:一个简单的动态链接库示例 要调用OpenSSL库中的函数,需要在对应的C源文件中包含相

    2024年02月11日
    浏览(63)
  • 第1关:使用C/C++语言编写PL/0编译程序的词法分析程序

    任务描述 使用C/C++语言编写PL/0编译程序的词法分析程序。需要注意的点: (1)识别非法字符:如 @ 、 和 ! 等; (2)识别非法单词:数字开头的数字字母组合; (3)标识符和无符号整数的长度不超过8位; (4)能自动识别并忽略/* */及//格式的注释信息; (5)词法分析过

    2024年02月09日
    浏览(46)
  • 《C语言程序设计》模拟试题

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1、已知字符’A’的ASCII码值为65,若变量x为char型,以下不能正确判断出x为大写字母的表达式是( )。 A、x = ‘A’ x = ‘Z’ B、!(x = ‘A’ || x = ‘Z’) C、(x + 32) = ‘a’ (x + 32) = ‘z’ D、x = 65 x = 90 2、下列关系表达式中,结果为“假”的是( )。

    2024年02月11日
    浏览(36)
  • C语言程序设计:编写函数,统计字符串中数字字符的个数

    题目内容: 编写函数,求给定字符串中数字字符的个数,在主函数中输入字符串及输出统计的个数。 输入格式: %s 输出格式: %d 输入样例: abc123fg 输出样例: 3 时间限制:500ms内存限制:32000kb

    2024年02月11日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包