用c语言实现: Exercise 1: 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。 Exercise 2: 采用最先适应法、最佳适应法、最坏适应法分配主存空间。 Exercise 3: 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。 Exercise 4: 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。 Exercise 5: 设计的模拟系统中,进程数不小于5,进程调度方式可以采用实验一中的任何一种。 Exercise 6: 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。
时间: 2024-02-12 14:09:04 浏览: 108
好的,下面是一个简单的实现,使用链表来存储空闲区,采用最先适应算法进行分配,撤销时合并相邻的空闲区。
```
#include <stdio.h>
#include <stdlib.h>
#define MEM_SIZE 1000 // 内存大小
// 空闲区结构体
typedef struct free_block {
int start_addr; // 空闲区起始地址
int size; // 空闲区大小
struct free_block *next; // 指向下一个空闲区
} FreeBlock;
FreeBlock *free_list = NULL; // 空闲区链表
// 初始化空闲区链表
void init_free_list() {
free_list = (FreeBlock*) malloc(sizeof(FreeBlock));
free_list->start_addr = 0;
free_list->size = MEM_SIZE;
free_list->next = NULL;
}
// 最先适应算法分配空间
int allocate_mem(int size) {
FreeBlock *p = free_list, *prev = NULL;
while (p != NULL) {
if (p->size >= size) { // 找到了足够大的空闲区
if (p->size == size) { // 空闲区大小恰好等于作业需要量
if (prev != NULL) {
prev->next = p->next;
} else {
free_list = p->next;
}
free(p);
} else { // 空闲区大小大于作业需要量
p->size -= size;
p->start_addr += size;
}
return p->start_addr;
}
prev = p;
p = p->next;
}
return -1; // 分配失败
}
// 合并相邻的空闲区
void merge_free_block() {
FreeBlock *p = free_list, *prev = NULL;
while (p != NULL && p->next != NULL) {
if (p->start_addr + p->size == p->next->start_addr) { // 相邻的空闲区
p->size += p->next->size;
FreeBlock *temp = p->next;
p->next = p->next->next;
free(temp);
}
prev = p;
p = p->next;
}
}
// 释放空间
void free_mem(int start_addr, int size) {
FreeBlock *p = free_list, *prev = NULL;
while (p != NULL) {
if (start_addr < p->start_addr) { // 找到空闲区插入位置
if (prev != NULL) {
if (prev->start_addr + prev->size == start_addr) { // 与前面的空闲区相邻
prev->size += size;
if (start_addr + size == p->start_addr) { // 与后面的空闲区也相邻
prev->size += p->size;
prev->next = p->next;
free(p);
}
} else {
FreeBlock *new_block = (FreeBlock*) malloc(sizeof(FreeBlock));
new_block->start_addr = start_addr;
new_block->size = size;
new_block->next = p;
prev->next = new_block;
if (start_addr + size == p->start_addr) { // 与后面的空闲区相邻
new_block->size += p->size;
new_block->next = p->next;
free(p);
}
}
} else { // 插入到链表头部
FreeBlock *new_block = (FreeBlock*) malloc(sizeof(FreeBlock));
new_block->start_addr = start_addr;
new_block->size = size;
new_block->next = p;
free_list = new_block;
if (start_addr + size == p->start_addr) { // 与后面的空闲区相邻
new_block->size += p->size;
new_block->next = p->next;
free(p);
}
}
break;
}
prev = p;
p = p->next;
}
merge_free_block();
}
int main() {
init_free_list();
// 分配空间
int addr1 = allocate_mem(100);
int addr2 = allocate_mem(200);
int addr3 = allocate_mem(50);
int addr4 = allocate_mem(150);
printf("分配空间后空闲区链表:\n");
FreeBlock *p = free_list;
while (p != NULL) {
printf("start_addr: %d, size: %d\n", p->start_addr, p->size);
p = p->next;
}
// 释放空间
free_mem(addr2, 200);
printf("释放空间后空闲区链表:\n");
p = free_list;
while (p != NULL) {
printf("start_addr: %d, size: %d\n", p->start_addr, p->size);
p = p->next;
}
return 0;
}
```
阅读全文