操作系统 位示图 磁盘管理
一、实验目的
怎样有效地管理磁盘存储空间是操作系统应解决的一个重要
问题,通过本实习使学生掌握磁盘存储空间的分配和回收算法。
二、实验内容
模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分
配和回收。
本实习模拟用位示图管理磁盘存储空间的管理方法。设计申请
一块磁盘空间和归还一块磁盘空间的程序。要求能显示或打印程
序运行前和运行后的位示图;分配时把分配到的磁盘空间的物理
地址显示或打印出来,归还时把归还块对应于位示图的字节号和
位数显示或打印出来。
假定已有如表 1 的磁盘空间被占用了,现在要申请五块磁盘空
间,运行分配程序,显示或打印运行的结果。然后再归还如表 2
的空间,运行回收程序,显示或打印运行结果。
表 1
柱面号
0
0
0
0
1
1
表 2
柱面号
0
0
1
磁道号
物理记录号
0
0
1
1
0
1
1
2
0
3
0
2
磁道号
物理记录号
0
1
0
2
0
1
三、实验步骤
本实验在 Visual C++ 6.0 编程平台下进行编程实现,详见实验
内容。
1. 算法设计流程,及源代码;
算法思想,及算法流程:
磁盘存储空间的分配有两种方式,一种是分配连续的存储空
间,另一种是可以分配不连续的存储空间。
为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可
用位示图来指出。位示图由若干字节构成,每一位与磁盘上的一
块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲。
当申请一块磁盘空间时,由分配程序查位示图,找出一个为
“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成
占用状态“1”。假设现在有一个盘组共 80 个柱面,每个柱面有两
个磁道,每个磁道分成 4 个物理记录。那么,当在位示图中找到
某一字节的某一位为“0”时,这个空闲块对应的磁盘物理地址为:
柱面号=字节号 磁道号=[位数/4] 物理记录号={位数/4}
当归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址
计算出归还块在位示图中的对应位,把该位置成“0”。归还块在
位示图中的位置计算如下:
字节号=柱面号
位数=磁道号4+物理记录号
源程序:
#include
#include
#include
#define A 10
#define B 2
#define C 4
int koko[A][B][C];
int M,N;
int i,j,k;
char ch;
void i_koko()
{
for(i=0;i
>M;
cout<<"请输入位数:"<<'\t';
cin>>N;
i=M;j=N/4;k=N%4;
koko[i][j][k]=0;
cout<<"是否继续输入(Y/N):"<<'\t';
cin>>ch;
}
while(ch=='Y'||ch=='y');
}
void Recycle()
{
do{
cout<<"请输入柱面号"<<'\t';
cin>>i;
cout<<"请输入磁盘号"<<'\t';
cin>>j;
cout<<"请输入逻辑记录号"<<'\t';
cin>>k;
koko[i][j][k]=1;
cout<<"是否继续输入(Y/N):"<<'\t';
cin>>ch;
}
while(ch=='Y'||ch=='y');
}
void Display()
{
int i,j,k;
int flag=0;
cout<<"**位示图**"<
}
cout<
>x;
cout<i_koko();
while(1){KOKO();}
}
2.编译、调试程序;
3.运行程序,记录结果。
假定已有如表 6-1 的磁盘空间被占用了,现在要申请五块磁盘
空间,运行分配程序。然后再归还如表 6-2 的空间,运行回收程序,。
4
1
1
4
0
1
5
1
1
5
1
1
6
1
1
6
1
0
7
1
1
7
0
1
(1)输出初始位图:
字/位 0
1
1
1
1
1
0
1
2
1
1
3
1
1
输出申请表
柱面号
磁道号
物理记录号
0
0
0
0
1
1
0
0
1
1
0
1
输出申请分配位示图
字/位 0
1
0
1
0
1
0
1
1
2
0
3
0
2
3
1
1
2
0
1
(2)输出回收表
柱面号
磁道号
物理记录号
0
0
1
0
1
0
输出回收后位示图
2
0
1
字/位 0
1
0
0
1
1
0
1
2
1
1
3
1
1
4
1
1
5
1
1
6
1
0
7
0
1
四、思考题
1. 此磁盘调度有哪些算法?
答:磁盘调度算法有:FCFS 算法、最短寻道时间优先 SSTF
算法、扫描算法(如:扫描 SCAN 算法、循环扫描 CSCAN 算法)。