C语言实现位示图磁盘分配算法(连续分配和离散分配)
#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 block_num = 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; 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_contiguous() { int i, j, k; int start_row = -1, start_col = -1; int count = 0; for (i = 0; i < MAX_ROW; i++) { for (j = 0; j < MAX_COL; j++) { if (bitmap[i][j] == 0) { // 找到空闲块 if (start_row == -1) { // 记录起始位置 start_row = i; start_col = j; } count++; if (count == file_size / block_size) { // 找到连续的足够的块 for (k = start_col; k < start_col + count; k++) { bitmap[start_row][k] = 1; // 修改位示图 } return start_row * MAX_COL + start_col; // 返回起始块号 } } else { // 遇到已分配块 start_row = -1; start_col = -1; count = 0; } } start_row = -1; start_col = -1; count = 0; } return -1; // 分配失败 }
// 离散分配磁盘块 int allocate_dispersed() { int i, j; int count = 0; int block_num = -1; for (i = 0; i < MAX_ROW; i++) { for (j = 0; j < MAX_COL; j++) { if (bitmap[i][j] == 0) { // 找到空闲块 bitmap[i][j] = 1; // 修改位示图 block_num = i * MAX_COL + j; // 记录块号 count++; if (count == file_size / block_size) { // 找到足够的块 return block_num; // 返回块号 } } } } return -1; // 分配失败 }
// 回收磁盘块 void recycle_block(int block_num) { int row = block_num / MAX_COL; int col = block_num % MAX_COL; bitmap[row][col] = 0; // 修改位示图 }
int main() { int choice; int block_num; printf('请输入磁盘块大小和磁盘块数:'); scanf('%d%d', &block_size, &block_num); file_size = block_size * 3; // 假设文件大小为3个磁盘块 init_bitmap(); // 初始化位示图 while (1) { printf('请选择操作:\n'); printf('1. 显示位示图\n'); printf('2. 连续分配磁盘块\n'); printf('3. 离散分配磁盘块\n'); printf('4. 回收磁盘块\n'); printf('5. 退出程序\n'); printf('请输入操作编号:'); scanf('%d', &choice); switch (choice) { case 1: show_bitmap(); break; case 2: block_num = allocate_contiguous(); if (block_num == -1) { printf('连续分配磁盘块失败\n'); } else { printf('连续分配磁盘块成功,起始块号为%d\n', block_num); } break; case 3: block_num = allocate_dispersed(); if (block_num == -1) { printf('离散分配磁盘块失败\n'); } else { printf('离散分配磁盘块成功,块号为%d\n', block_num); } break; case 4: printf('请输入要回收的磁盘块号:'); scanf('%d', &block_num); recycle_block(block_num); printf('回收磁盘块成功\n'); break; case 5: exit(0); default: printf('输入错误,请重新输入\n'); } } return 0;
原文地址: https://www.cveoy.top/t/topic/f1EB 著作权归作者所有。请勿转载和采集!