#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 著作权归作者所有。请勿转载和采集!

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