位示图模拟操作


前言

某磁盘有64个磁盘块,使用一个8×8的位示图表示磁盘块使用情况。

假设位示图的行列编号都是从1开始,磁盘块的编号也从1开始。以下是位示图初始状态。

+   1  2  3  4  5  6  7  8

1   1  1  0  0  0  1  1  1

2   0  0  1  0  0  1  1  0

3   0  0  0  1  1  1  1  1

4   1  0  0  0  0  1  1  1

5   1  1  1  0  0  0  1  1

6   1  1  1  1  0  0  0  0

7   0  0  0  0  1  1  0  1

8   1  1  1  0  1  0  0  0

请回答如下问题,并请编写程序模拟实现管理磁盘块的分配和回收。

一、打印输出位示图,并给出磁盘块占用和空闲统计信息。

打印输出位示图,并给出磁盘块占用和空闲统计信息。

例如:

+   1  2  3  4  5  6  7  8

1   1  1  0  0  0  1  1  1

2   0  0  1  0  0  1  1  0

3   0  0  0  1  1  1  1  1

4   1  0  0  0  0  1  1  1

5   1  1  1  0  0  0  1  1

6   1  1  1  1  0  0  0  0

7   0  0  0  0  1  1  0  1

8   1  1  1  0  1  0  0  0

Free/Busy/Total:  31/33/64

代码

#include <stdio.h>

#define BYTEBITS 8

void print_bitmap(void);
void print_bit_line(char a);
int count_bit_line(char a);
int count_bit();
void print_info();

unsigned char bitmap[8] = {0xC7, 0x26, 0x1F, 0x87, 0xE3, 0xF0, 0x0D, 0xE8};

int main() {
    print_bitmap();
    print_info();
    return 0;
}

void print_bitmap(){
    int i;
    printf("+ 1 2 3 4 5 6 7 8\n");
    for(int i=0; i<8; i++){
        printf("%d ", i+1);
        print_bit_line(bitmap[i]);
        printf("\n");
    }
}

void print_bit_line(char a){
    for(int i = 0; i<8; i++){
        printf("%d ", a>>(7-i) & 0x01);
    }
}

int count_bit(){
    int sum = 0;
    for(int i = 0; i<8; i++){
        sum+=count_bit_line(bitmap[i]);
    }
    return sum;
}

int count_bit_line(char a){
    int sum = 0;
    for(int i = 0; i<8; i++){
        sum+= a>>(7-i)& 0x01;
    }
    return sum;
}

void print_info() {
    int sum = count_bit();
    printf("Free/Busy/Total: %d/%d/%d",BYTEBITS*BYTEBITS-sum ,sum , BYTEBITS*BYTEBITS);
}


结果

在这里插入图片描述

二、模拟5次分配请求

模拟5次分配请求,每次分配一块,返回分配的磁盘块的编号,并将该磁盘块对应的位示图位置1,最后打印位示图。

代码

#include <stdio.h>

#define BYTEBITS 8

void print_bitmap(void);
void print_bit_line(char a);
void set_bit(int x, int y, int bit);
int bit_to_num(int x, int y);
void balloc(int cnt);


unsigned char bitmap[8] = {0xC7, 0x26, 0x1F, 0x87, 0xE3, 0xF0, 0x0D, 0xE8};



int main() {
    balloc(5);
    return 0;
}

int bit_to_num(int x, int y) {
    return (x-1)*BYTEBITS+y;
}

void set_bit(int x, int y, int bit) {
    if(bit == 0){
        bitmap[x-1] &= ~(1<<(BYTEBITS-y));
    }else if(bit == 1){
        bitmap[x-1] |= 1<<(BYTEBITS-y);
    }
}

void print_bitmap(){
    printf("+ 1 2 3 4 5 6 7 8\n");
    for(int i=0; i<8; i++){
        printf("%d ", i+1);
        print_bit_line(bitmap[i]);
        printf("\n");
    }
}

void print_bit_line(char a){
    for(int i = 0; i<8; i++){
        printf("%d ", a>>(7-i) & 0x01);
    }
}

void balloc(int cnt) {
    int x, y, bit;
    bit = 1;
    for(int i = 0; i<cnt; i++){
        printf("set bit (x,y) to 1:");
        scanf_s("%d%d", &x, &y);
        printf("\nset bit (%d, %d) to %d.\n\n", x, y, bit);
        set_bit(x, y, bit);
        print_bitmap();
        printf("\nBlock Num:%d\n\n", bit_to_num(x,y));
    }
}




结果

在这里插入图片描述

三、模拟回收5个块

模拟回收5个块,分别是6、11、20、24、35,将相应的位示图位置0,最后打印位示图。

代码

void bfree(int cnt){
    int x, y, bit;
    bit = 0;
    for(int i = 0; i<cnt; i++){
        printf("set bit (x,y) to 0:");
        scanf_s("%d%d", &x, &y);
        printf("\nset bit (%d, %d) to %d.\n\n", x, y, bit);
        set_bit(x, y, bit);
        print_bitmap();
        printf("\nBlock Num:%d\n\n", bit_to_num(x,y));
    }
}

效果

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值