编写程序,由必要的数据结构、主函数、菜单函数、主存分配函数和主存回收函数构 成。实现在固态多分区管理方式下,对主存分配与回收的模拟。 要求:(1)模拟系统有界面,主菜单至少有:显示内存使用情况、模拟分配、模拟 回收、退出系统四大功能。 (2)模拟系统运行过程中,界面友好,与用户有交互。 (3)至少实现 First_Fit 分配算法,有余力的同学可实现 2-4 种不同的主存分配算 法,可在模拟分配菜单项之下设置子菜单,允许用户选择要使用的主存分配算法。C语言代码实现加注释
时间: 2024-03-20 20:43:50 浏览: 22
以下是一个简单的固态多分区管理的主存分配与回收模拟程序,实现了 First_Fit 分配算法,具体注释请参考代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义内存块结构体
typedef struct MemoryBlock {
int id; // 内存块编号
int size; // 内存块大小
int start; // 内存块在内存中的起始位置
int end; // 内存块在内存中的结束位置(不包括)
struct MemoryBlock* next; // 指向下一个内存块的指针
} MemoryBlock;
// 定义全局变量
MemoryBlock* head = NULL; // 内存块链表的头指针
int memSize = 1024; // 内存大小,默认为 1024KB
// 显示内存使用情况
void showMemory() {
MemoryBlock* p = head;
int start = 0, end = 0;
while (p != NULL) {
end = p->start;
if (end > start) {
printf("空闲区:\t起始位置:%dKB\t结束位置:%dKB\t大小:%dKB\n", start, end, end - start);
}
printf("已分配区:\t起始位置:%dKB\t结束位置:%dKB\t大小:%dKB\t编号:%d\n", p->start, p->end, p->size, p->id);
start = p->end;
p = p->next;
}
if (end < memSize) {
printf("空闲区:\t起始位置:%dKB\t结束位置:%dKB\t大小:%dKB\n", end, memSize, memSize - end);
}
}
// 模拟分配
void allocateMemory() {
int size, id;
printf("请输入分配大小(KB):");
scanf("%d", &size);
printf("请输入内存块编号:");
scanf("%d", &id);
MemoryBlock* p = head;
MemoryBlock* prev = NULL;
while (p != NULL) {
if (p->size >= size) { // 如果当前内存块大小大于等于需要分配的大小
MemoryBlock* newBlock = (MemoryBlock*)malloc(sizeof(MemoryBlock)); // 分配新内存块
newBlock->id = id;
newBlock->size = size;
newBlock->start = p->start;
newBlock->end = p->start + size;
newBlock->next = NULL;
if (prev == NULL) { // 如果当前内存块是第一个内存块
head = newBlock;
} else {
prev->next = newBlock;
}
if (p->size == size) { // 如果当前内存块大小等于需要分配的大小
if (prev == NULL) { // 如果当前内存块是第一个内存块
head = p->next;
} else {
prev->next = p->next;
}
free(p); // 释放当前内存块
} else { // 如果当前内存块大小大于需要分配的大小
p->start += size;
p->size -= size;
}
printf("分配成功!\n");
return;
}
prev = p;
p = p->next;
}
printf("空闲内存不足,分配失败!\n");
}
// 模拟回收
void freeMemory() {
int id;
printf("请输入需要回收的内存块编号:");
scanf("%d", &id);
MemoryBlock* p = head;
MemoryBlock* prev = NULL;
while (p != NULL) {
if (p->id == id) { // 找到需要回收的内存块
if (prev == NULL) { // 如果需要回收的内存块是第一个内存块
head = p->next;
} else {
prev->next = p->next;
}
if (p->next != NULL && p->next->start == p->end) { // 如果需要回收的内存块和后面的内存块相邻
p->next->start = p->start;
p->next->size += p->size;
free(p); // 释放需要回收的内存块
p = p->next;
} else if (prev != NULL && prev->end == p->start) { // 如果需要回收的内存块和前面的内存块相邻
prev->end = p->end;
prev->size += p->size;
free(p); // 释放需要回收的内存块
} else { // 如果需要回收的内存块既不和前面的内存块相邻,也不和后面的内存块相邻
p->next = head;
head = p;
}
printf("回收成功!\n");
return;
}
prev = p;
p = p->next;
}
printf("没有找到编号为 %d 的内存块,回收失败!\n", id);
}
// 主函数
int main() {
int choice = 0;
while (1) {
printf("\n");
printf("*********************************\n");
printf("* 内存分配与回收模拟 *\n");
printf("* 1. 显示内存使用情况 *\n");
printf("* 2. 模拟分配 *\n");
printf("* 3. 模拟回收 *\n");
printf("* 4. 退出系统 *\n");
printf("*********************************\n");
printf("请输入选项(1-4):");
scanf("%d", &choice);
switch (choice) {
case 1:
showMemory();
break;
case 2:
allocateMemory();
break;
case 3:
freeMemory();
break;
case 4:
exit(0);
default:
printf("输入错误,请重新输入!\n");
break;
}
}
return 0;
}
```