磁盘块分配模拟器:连续分配和离散分配
#include <stdio.h> #include <stdlib.h>
// 定义磁盘块的最大行数和列数 #define MAX_ROW 10 #define MAX_COL 10
// 位示图数组,用于记录磁盘块的分配情况 int bitmap[MAX_ROW][MAX_COL];
// 文件所占块数 int file_blocks = 0;
// 初始化位示图,将所有块设置为未分配状态 void init_bitmap() { int i, j; for (i = 0; i < MAX_ROW; i++) { for (j = 0; j < MAX_COL; j++) { bitmap[i][j] = 0; } } }
// 显示位示图,用于展示当前磁盘块的分配情况 void show_bitmap() { int i, j; for (i = 0; i < MAX_ROW; i++) { for (j = 0; j < MAX_COL; j++) { printf("%d ", bitmap[i][j]); } printf("\n"); } }
// 连续分配算法,分配连续的磁盘块 int allocate_continuous(int file_size, int block_size) { int i, j, k, flag = 0; // 计算文件所占块数 file_blocks = (file_size + block_size - 1) / block_size;
// 遍历位示图,寻找足够大的连续空闲块
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
if (bitmap[i][j] == 0) {
flag++;
// 找到足够连续的空闲块
if (flag == file_blocks) {
// 修改位示图,将分配的块设置为已分配状态
for (k = j - file_blocks + 1; k <= j; k++) {
bitmap[i][k] = 1;
}
// 返回分配的第一个块号
return i * MAX_COL + j - file_blocks + 1;
}
} else {
// 连续块被打断,重新计数
flag = 0;
}
}
// 行结束,重新计数
flag = 0;
}
// 没有足够的连续空闲块
return -1;
}
// 离散分配算法,分配离散的磁盘块 int allocate_discrete(int file_size, int block_size) { int i, j, k, flag = 0; // 计算文件所占块数 file_blocks = (file_size + block_size - 1) / block_size;
// 遍历位示图,寻找足够多的离散空闲块
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
if (bitmap[i][j] == 0) {
flag++;
// 找到足够的离散空闲块
if (flag == file_blocks) {
// 修改位示图,将分配的块设置为已分配状态
for (k = j - file_blocks + 1; k <= j; k++) {
bitmap[i][k] = 1;
}
// 返回分配的第一个块号
return i * MAX_COL + j - file_blocks + 1;
}
}
}
// 行结束,重新计数
flag = 0;
}
// 没有足够的离散空闲块
return -1;
}
// 分配磁盘块函数,接收用户输入的文件大小、块大小和分配方式,调用相应的分配算法 int allocate_blocks() { int file_size, block_size; printf("请输入文件大小:"); scanf("%d", &file_size); printf("请输入块大小:"); scanf("%d", &block_size); printf("请选择分配方式(1.连续分配 2.离散分配):"); int choice; scanf("%d", &choice); int block_num;
// 根据用户选择的分配方式调用相应的分配算法
if (choice == 1) {
block_num = allocate_continuous(file_size, block_size);
} else if (choice == 2) {
block_num = allocate_discrete(file_size, block_size);
} else {
printf("输入不合法!\n");
return -1;
}
// 判断分配是否成功
if (block_num == -1) {
printf("磁盘空间不足!\n");
return -1;
}
printf("文件分配成功,分配的第一个块号为:%d\n", block_num);
return block_num;
}
// 回收磁盘块函数,接收用户输入的块号,释放对应的磁盘块 void free_blocks() { printf("请输入要回收的块号:"); int block_num; scanf("%d", &block_num);
// 检查输入的块号是否合法
if (block_num < 0 || block_num >= MAX_ROW * MAX_COL) {
printf("输入不合法!\n");
return;
}
// 计算块号对应的行号和列号
int row = block_num / MAX_COL;
int col = block_num % MAX_COL;
// 检查该块是否已经被分配
if (bitmap[row][col] == 0) {
printf("该块未被分配!\n");
return;
}
// 修改位示图,将该块设置为未分配状态
bitmap[row][col] = 0;
printf("块号 %d 回收成功!\n", block_num);
}
// 主函数,程序入口 int main() { init_bitmap(); int choice;
// 循环接收用户输入的操作
while (1) {
printf("请选择操作(1.分配磁盘块 2.回收磁盘块 3.显示位示图 4.退出程序):");
scanf("%d", &choice);
// 根据用户选择的操作调用相应的函数
switch (choice) {
case 1:
allocate_blocks();
break;
case 2:
free_blocks();
break;
case 3:
show_bitmap();
break;
case 4:
exit(0);
default:
printf("输入不合法!\n");
break;
}
}
return 0;
原文地址: https://www.cveoy.top/t/topic/f1GE 著作权归作者所有。请勿转载和采集!