#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++) { // 将每个块设置为未分配状态(0) 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) { // 计算文件所占块数 file_blocks = (file_size + block_size - 1) / block_size; // 使用双重循环遍历整个位示图数组 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++; // 如果连续空闲块数等于文件所占块数 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; } // 如果没有找到足够的连续空闲块,则返回 -1 return -1; }

// 离散分配算法 int allocate_discrete(int file_size, int block_size) { // 计算文件所占块数 file_blocks = (file_size + block_size - 1) / block_size; // 使用双重循环遍历整个位示图数组 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++; // 如果离散空闲块数等于文件所占块数 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; } // 如果没有找到足够的离散空闲块,则返回 -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("请选择操作(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);
            break;
        default:
            printf("输入不合法!\n");
            break;
    }
}
return 0;
磁盘空间管理系统:连续分配和离散分配算法实现

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

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