编写C语言程序,模拟实现首次/最佳/最坏适应算法的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况。假设初始状态下,可用的内存空间为640KB。(江西师范大学软件学院 操作系统)
【操作系统】分区分配算法 (首次适应算法、最佳适应算法、最坏适应算法)(C语言实现)
为了实现动态分区分配,通常将系统中的空闲分区链接成一个链。所谓顺序查找是指依次搜索空闲分区链上的空闲分区,去寻找一个大小能满足要求的分区。 --------计算机操作系统(第四版)
(图片来源网络,侵删)
可变分区也称动态分区,在指作业装入内存时,从可用的内存中划出一块连续的区域分配给他,且分区大小正好等于改作业的大小。
可变分区分配策略:
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)
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。