C语言实现动态分区分配方式模拟
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef struct {
int no;
int add;
int size;
int status;
} EMP; // 空闲分区表
typedef struct {
int add;
int size;
int status;
char name[5];
} USE; // 分区使用表
void allocate(EMP emp_list[10], USE use_list[10]) { // 分配功能
int i = 0, j = 0;
int k, found, S, add;
char pname[5];
printf('请输入进程名称:\n');
scanf('%s', pname);
printf('请输入所需空间:\n');
scanf('%d', &S);
while (i < 10) {
if (emp_list[i].size >= S && emp_list[i].status == 0) { // if have found
found = 1;
k = emp_list[i].size - S;
if (k == 0) {
emp_list[i].status = 1;
emp_list[i].size = 0;
add = emp_list[i].add;
} else {
emp_list[i].size -= S;
add = emp_list[i].add;
emp_list[i].add += S;
} // end else
j = 0;
while (j < 10) {
if (use_list[j].status == 0)
break;
else
j++;
} // end while 从uselist中找一个状态为0的表目
if (j == 10)
printf('所用空间满'); // 没有从uselist中找到空余表目
else {
strcpy(use_list[j].name, pname);
use_list[j].add = add;
use_list[j].size = S;
use_list[j].status = 1;
} // end else
break;
} // end if
else
i++;
} // end while
if (found != 1)
printf('作业还需继续等待,因为空闲分区表满了\n');
} // end allocate
void show(EMP emp_list[10], USE use_list[10]) {
// 输出已分配分区和空闲分区
printf('*********************************************************\n');
printf('***************总分配分区表******************************\n');
printf('分区序号 开始地址 大小 状态 \n');
int i = 0, j = 0;
printf('空表目 : \n ');
for (i = 0; i < 10; i++) {
printf(' %d %d %d %d\n', emp_list[i].no, emp_list[i].add, emp_list[i].size, emp_list[i].status);
}
printf('已分配 : \n ');
for (j = 0; j < 10; j++) {
if (use_list[j].status == 1)
printf(' %s %d %d\n', use_list[j].name, use_list[j].add, use_list[j].size);
}
printf('*********************************************************\n');
}
void recycle(EMP emp_list[10], USE use_list[10]) {
int i = 0, j = 0, q = 0, add, length;
char n[10];
printf('请输入回收区名称:\n');
scanf('%s', n);
for (i = 0; i < 10; i++) {
if (use_list[i].status == 1 && strcmp(use_list[i].name, n) == 0) {
use_list[i].status = 0;
add = use_list[i].add;
length = use_list[i].size;
for (j = 1; j < 10; j++) {
if (emp_list[j - 1].add + emp_list[j - 1].size == add) {
if (add + length == emp_list[j].add) {
emp_list[j].size = length + emp_list[j].size;
emp_list[j].add = add;
emp_list[j].status = 0;
break;
} // end if
else {
emp_list[j].size += length;
emp_list[j].status = 0;
} // end else
} // end if
} // end for
printf('%s 已找到\n', use_list[i].name);
break;
} // end if
} // end for
} // end void
int main() {
EMP emp_list[10];
USE use_list[10];
int select, i = 0, j = 0; // 接受用户输入的功能号
int flag = 1; // 控制循环的变量
/*初始化未分配区表、已分配区表*/
for (i = 0; i < 10; i++) {
emp_list[i].size = pow(2, i);
emp_list[i].no = i + 1;
if (i != 0) {
emp_list[i].add = emp_list[i - 1].add + emp_list[i - 1].size;
emp_list[i].status = 0;
} else {
emp_list[i].add = 0;
emp_list[i].status = 1;
}
// 定义始址
}
for (j = 0; j < 10; j++) {
use_list[j].size = pow(2, i);
use_list[j].status = 0;
}
/*设计整个系统框架*/
while (flag == 1) /*当flag的值等于0时,程序结束*/
{
/*构建系统菜单*/
printf('**********Main Menu************\n');
printf('**********1----分配内存***************\n');
printf('**********2----回收内存***************\n');
printf('**********3----查看内存表***************\n');
printf('**********0----退出系统***************\n');
printf('**************************************\n');
printf(' 请输入你的选择(0-3):');
/*接收用户从键盘输入的功能号*/
scanf('%d', &select);
/*函数调用*/
switch (select) {
case 1:
allocate(emp_list, use_list);
break;
case 2:
recycle(emp_list, use_list);
break;
case 3:
show(emp_list, use_list);
break;
case 0:
flag = 0;
break;
default:
printf('input error!');
break;
}/*end switch*/
}
return 0;/*end while*/
}/*end main*/
这段 C 语言代码模拟了操作系统的动态分区分配方式,通过维护空闲分区表和已分配分区表来管理内存资源,并提供了分配、回收和查看内存使用情况的功能。
代码亮点:
- 使用结构体清晰地表示空闲分区和已分配分区的数据结构。
- 实现了内存分配、回收和展示功能的函数,代码结构清晰易懂。
- 使用循环和条件语句实现了内存分配和回收的逻辑,代码简洁高效。
改进建议:
- 可以添加内存碎片处理机制,例如采用首次适应算法、最佳适应算法等,提高内存利用率。
- 可以增加错误处理机制,例如对用户输入进行校验,提高程序的健壮性。
- 可以使用更直观的图形界面展示内存分配情况,提高用户体验。
总的来说,这段代码是一个很好的学习操作系统内存管理的例子,可以帮助我们更好地理解动态分区分配方式的原理和实现。
原文地址: https://www.cveoy.top/t/topic/cvJY 著作权归作者所有。请勿转载和采集!