感谢关注!!
本程序使用c/c++实现了操作系统课程设计《磁盘空间管理的模拟》题目
使用了位示图法(位图)实现功能
代码已实现在vc++6.0中成功运行(运行出现问题欢迎私信)
此题目说明书,任务书,课程设计所有内容部分已打包,需要的私信取!!
代码如下:
#include<stdio.h>
#include<windows.h>
unsigned int size[5]={0,0,0,0,0};//保存位示图
void out()//输出位示图函数
{
printf("当前位示图:\n");
unsigned int i,j,m;
for(j=0;j<5;j++)//循环输出size的各个数的各个二进制位
{
m=size[j];
for(i=0;i<16;i++)
{
printf("%d",m%2);
m=m/2;
}
printf("\n");
}
system("pause");//冻结屏幕
system("cls");//清屏
}
void assign()//分配函数
{
unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid;
for(i=0 ,k=0;i<5;i++)
{
q=size[i];
j=0;
while(1) //查找位示图的第一个为零的位,将其分配,该位置一
{
j++;
if((q%2)==0)
{
if(j==1)
size[i]+=1;
else
{
for(m=1;m<j;m++)
s*=2 ;
size[i]+=s;}
k=1;
break ;//完成后退出
}
q=q/2;
}
if(k==1) //将找到的位示图位转换成物理地址
{
if((j-1)/8==1)
{
zhm=2*i+1;
cid=(j-9)/4;
sq=(j-9)%4;
}
else
{
zhm=2*i;
cid=(j-1)/4;
sq=(j-1)%4;
}
n=1;
break;//退出for循环
}
}
if(n==0)
printf("没有空间可分配!\n");
else
{
printf("分配成功!\n");//输出物理地址
printf("柱面号、磁道号、扇区号分别为:%d\t%d %d\n",zhm,cid,sq);
}
system("pause");//冻结屏幕
system("cls");//清屏
}
void callback()//回收函数
{
unsigned int i,j,s=1,q,m,sq,zhm,cid;
printf("输入要回收块的柱面号、磁道号、扇区号:\n");
scanf("%d",&zhm);
scanf("%d",&cid);
scanf("%d",&sq);
if(zhm%2==0)//计算对应的位示图位置
{
i=zhm/2;
j=cid*4+sq+1;
}
else
{
i=(zhm-1)/2;
j=cid*4+sq+9;
}
q=size[i];
m=j-1;
while(m)
{
q=q/2;
m--;
}
if(q%2==1)//判断该块是否被分配
{
if(j==1)
size[i]-=1;//将位示图对应为置零
else
{
for(m=1;m<j;m++)
s*=2;
size[i]-=s;
}
printf("回收成功!\n");
}
else
printf("该块未被分配,无需回收!\n");
system("pause");//冻结屏幕
system("cls");//清屏
}
void main()
{
printf("\n");
printf(" 1.分配磁盘空间\n");
printf(" 2.回收磁盘空间\n");
printf(" 3.查看当前位示图\n");
printf(" 4.退出\n");
printf("\n");
printf("请输入你的选择:");
int x;
scanf("%d",&x);
while (x > 4 || x < 0)
{
printf("选择有误!\n请重新输入:");
scanf("%d",&x);
}
switch (x)
{
case 1:x = 1;
assign();
main();
break;
case 2:x = 2;
callback();
main();
break;
case 3:x = 3;
out();
main();
break;
case 4:x = 4;
exit(0);
break;
}
}