📄 diaodu.c
字号:
#include <stdio.h>
#include <string.h>
typedef struct table//定义一个结构类型table
{
char pro[10];//定义进程名称
int team;//定义柱面号
int ci;//定义磁道号
int rec;//定义物理记录号
}job;
job io[20]; // 请求I/O表
job out[20]; // 选中的进程表
int count=0;//请求I/O表的进程数目
main()
{
int k=1; // 已选中的进程个数
int i;
int record=0; // 记录选中的柱号,初始当前移臂方向为里移,用0代表里移UP-向柱号199方向,1代表外移DOWN-向柱号0方向
int yi=0; //初始当前移臂方向为里移
int flag=0; //标志符
int d[20]; // 记录调用的进程方向
d[0]=0;
strcpy(io[0].pro,"p1"); // 预先设置一个请求I/O表内容
io[0].team=100;
io[0].ci=10;
io[0].rec=1;
count++;
strcpy(out[0].pro,"p0");//预先设置一个选中的进程表的内容
out[0].team=0;
out[0].ci=0;
out[0].rec=0;
printf("** 初始化: **\n");
printf("-----------------------------------------\n");
printf(" ---------- 请求I/O表 ---------- \n");
printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");
for(i=0;i<count;i++)
printf("%s\t\t%d\t\t%d\t\t%d\n",io[i].pro,io[i].team,io[i].ci,io[i].rec);
printf(" -------- 当前进程信息 --------- \n");
printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");
printf("%s\t\t%d\t\t%d\t\t%d\n",out[0].pro,out[0].team,out[0].ci,out[0].rec);
printf("当前磁臂移动方向是: up\n");
printf("-----------------------------------------\n");
while(1)
{
char R='y';
int min,si;
int m=1; // 已选中的进程方向个数
while(R=='y'){
float t;
printf("****************驱动调度演示********************\n");
printf("**********请随机输入一个介于0~1的数*************\n");
printf("***********如输入2则显示当前请求I/O表***********\n");
scanf("%f",&t);
if(t==2) //显示当前请求I/O表
{
printf("-----------------------------------------\n");
printf(" -------- 当前请求I/O表 -------- \n");
printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");
for(i=0;i<count;i++)
printf("%s\t\t%d\t\t%d\t\t%d\n",io[i].pro,io[i].team,io[i].ci,io[i].rec);
printf("-----------------------------------------\n");
}
if(t<=0.5) //接收请求
{
char name[10];
int a,b,c;
printf("** 接收请求: **\n");
printf("请输入进程名: ");
getchar();
scanf("%s",name);
printf("该进程柱面号(0-199):");
scanf("%d",&a);
printf("该进程磁道号(0-19):");
scanf("%d",&b);
printf("该进程物理记录号(0-7):");
scanf("%d",&c);
strcpy(io[count].pro,name);
io[count].team=a;
io[count].ci=b;
io[count].rec=c;
count++;
printf("-----------------------------------------\n");
printf(" ------ 新的请求I/O表 -------- \n");
printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");
for(i=0;i<count;i++)
printf("%s\t\t%d\t\t%d\t\t%d\n",io[i].pro,io[i].team,io[i].ci,io[i].rec);
printf("-----------------------------------------\n");
printf("是否继续?y:继续,n:退出\n");
scanf("%c",&R);
}
if(t>0.5&&t<=1) //驱动调度
{
printf("** 驱动调度: **\n");
if(count==0)
printf("*** I/O请求表为空。***\n");
else
{
for(i=0;i<count;i++) //找到相同的柱号
{
if(io[i].team==out[k-1].team)
{
flag=-1; //标志符置-1
record=i; //记录选中的柱号
if(i==count-1)
count=i+2;
break;
}
}
if(i==count) //柱号不相同
{
io[count]=out[k-1];
count++;
min=io[0].team;
for(si=0;si<count-1;si++) //进行排序,柱面号从小到大排列
for(i=0;i<count-1;i++)
{
if(io[i].team>io[i+1].team)
{
job temp;
temp=io[i];
io[i]=io[i+1];
io[i+1]=temp;
}
}
printf("-----------------------------------------\n");
for(i=0;i<count;i++) //在请求I/O表中查找当前调度的进程
{
if(io[i].team==out[k-1].team)
{
if(i==0&&yi==0) // 初始当前移臂方向为里移时
{flag=i;record=i+1;break;}
else if(i==0&&yi==1)// 初始当前移臂方向为外移时
{flag=i;record=i+1;yi=0;break;}
else if(i==(count-1)&&yi==0) // 初始当前移臂方向为里移时
{flag=i;record=i-1;yi=1;break;}
else if(i==(count-1)&&yi==1)// 初始当前移臂方向为外移时
{flag=i;record=i-1;break;}
else if(i>0&&i<(count-1)&&yi==0)//初始当前移臂方向为里移时
{flag=i;record=i+1;break;}
else if(i>0&&i<(count-1)&&yi==1)//初始当前移臂方向为外移时
{flag=i;record=i-1;break;}
else
;
}
}
}
printf("当前移臂方向是:");
if(yi==0)
printf("up\n");
else
printf("down\n");
d[m]=yi;
m++;
printf("调度的进程是:\n"); //显示调度的进程
printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");
printf("%s\t\t%d\t\t%d\t\t%d\n",io[record].pro,io[record].team,io[record].ci,io[record].rec);
out[k]=io[record];
k++;
io[record]=io[count-1]; //进程被调度,从I/O表删除
count--;
if(flag!=-1)
{
io[flag]=io[count-1]; //无相同柱面时,将已接受驱动调动的进程删除
count--;
}
printf("-----------------------------------------\n");
printf("是否继续?y:继续,n:退出\n");
scanf("%c",&R);
}
}
}
}
printf("** 程序结束: **\n");
printf("----------------------------------------------\n");
printf(" ---------- 驱动调度过程 ---------- \n");
printf("进程\t\t柱面号\t\t磁道号\t\t记录号\t\t方向\n");
for(i=0;i<k;i++)
{
if(d[i]==0)
{
printf("%s\t\t%d\t\t%d\t\t%d",out[i].pro,out[i].team,out[i].ci,out[i].rec);
printf(" up\n");
}
else
{
printf("%s\t\t%d\t\t%d\t\t%d",out[i].pro,out[i].team,out[i].ci,out[i].rec);
printf(" down\n");
}
}
printf("----------------------------------------------\n");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -