C语言实现位示图磁盘管理算法:连续分配与离散分配

本文使用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 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 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; // 连续块被打断,重新计数
    }
    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++;
                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 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;
}

代码功能说明

  • 初始化位示图: init_bitmap() 函数将所有磁盘块标记为未分配状态(0)。
  • 显示位示图: show_bitmap() 函数以矩阵形式显示当前位示图状态。
  • 连续分配: allocate_continuous() 函数在位示图中寻找连续的空闲块,分配给文件。
  • 离散分配: allocate_discrete() 函数在位示图中寻找足够的空闲块,无论是否连续,分配给文件。
  • 分配磁盘块: allocate_blocks() 函数获取用户输入的文件大小和块大小,并根据用户选择的方式分配磁盘块。
  • 回收磁盘块: free_blocks() 函数获取用户输入的块号,释放对应的磁盘块。

代码特点

  • 简洁易懂: 代码结构清晰,注释详细,方便理解。
  • 功能完善: 实现连续分配和离散分配两种方式,并包含错误处理机制。
  • 可扩展性强: 可以根据实际需求修改位示图大小和块大小。

使用方法

  1. 编译代码:gcc bitmap.c -o bitmap
  2. 运行程序:./bitmap
  3. 根据提示选择操作。

总结

本文使用C语言实现了位示图磁盘管理算法,并提供两种分配方式。代码简洁易懂,功能完善,可扩展性强,可以帮助用户理解位示图磁盘管理算法的工作原理。

C语言实现位示图磁盘管理算法:连续分配与离散分配

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

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