磁盘管理系统 - 位示图法:连续分配和离散分配
// 磁盘管理系统 - 位示图法 #include <stdio.h> #include <stdlib.h>
#define MAX_ROW 10 // 定义位示图的行数 #define MAX_COL 10 // 定义位示图的列数
int bitmap[MAX_ROW][MAX_COL]; // 位示图数组,用来记录每个磁盘块是否被分配 int file_size = 0; // 文件大小(字节) int block_size = 0; // 块大小(字节) 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; // 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 i, j, k, flag = 0; // 初始化变量 for (i = 0; i < MAX_ROW; i++) { // 遍历位示图 for (j = 0; j < MAX_COL; j++) { if (bitmap[i][j] == 0) { // 如果当前块为空闲块 flag++; // 连续空闲块计数器加1 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 i, j, k, flag = 0; // 初始化变量 for (i = 0; i < MAX_ROW; i++) { // 遍历位示图 for (j = 0; j < MAX_COL; j++) { if (bitmap[i][j] == 0) { // 如果当前块为空闲块 flag++; // 离散空闲块计数器加1 bitmap[i][j] = 1; // 标记为已分配 if (flag == file_blocks) { // 找到足够的离散空闲块 return i * MAX_COL + j - file_blocks + 1; // 返回分配的第一个块号 } } else { // 遇到已分配块,重置计数器 flag = 0; } } flag = 0; // 遍历完一行,重置计数器 } return -1; // 没有足够的离散空闲块 }
// 分配磁盘块:根据用户输入的文件大小、块大小和分配方式,进行分配 int allocate_blocks() { int block_num; // 存放分配的第一个块号 printf("请输入文件大小(字节):"); scanf("%d", &file_size); printf("请输入块大小(字节):"); scanf("%d", &block_size); file_blocks = (file_size + block_size - 1) / block_size; // 计算文件所占块数 printf("请选择分配方式(1.连续分配 2.离散分配):"); scanf("%d", &block_num); if (block_num == 1) { // 连续分配 block_num = allocate_continuous(); } else if (block_num == 2) { // 离散分配 block_num = allocate_discrete(); } else { // 输入错误 printf("输入不合法!\n"); return -1; } if (block_num == -1) { // 没有足够的磁盘空间 printf("磁盘空间不足!\n"); return -1; } printf("文件分配成功,分配的第一个块号为:%d\n", block_num); return block_num; }
// 回收磁盘块:根据用户输入的块号,将该块设置为未分配 void free_blocks() { int block_num; // 存放用户输入的块号 printf("请输入要回收的块号:"); 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/f1Ml 著作权归作者所有。请勿转载和采集!