// 磁盘管理系统,包括位示图的初始化、显示、连续/离散分配、回收等功能

#include <stdio.h> #include <stdlib.h>

#define MAX_ROW 10 // 位示图行数 #define MAX_COL 10 // 位示图列数

int bitmap[MAX_ROW][MAX_COL]; // 位示图数组,用于表示磁盘块的分配情况,0表示空闲,1表示已分配 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; printf('当前位示图:\n'); 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++; // 连续空闲块计数器加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 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++; // 离散空闲块计数器加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; // 返回分配的第一个块号 } } } } 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('\n请选择操作(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; }

C语言实现位示图磁盘空间管理算法

原文地址: https://www.cveoy.top/t/topic/f1Gx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录