前言
某磁盘有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));
}
}