模拟电梯调度算法,实现对磁盘的驱动调度

ytyytryrtyryr 2014-01-02 02:39:45
能解释init();acceptreq();qddd();这三个函数的功能和作用是什么吗?最好详细点 因为我实在看不明白这三个函数 下面是函数的程序
void init()
{
PRO *p; /*初始化链表(初始I/O表)*/
g_head = (PRO*)malloc(sizeof(PRO));
g_head->next = NULL;
g_head->prior = NULL;
p = (PRO*)malloc(sizeof(PRO));
strcpy(p->name, "P1");
p->team=100;
p->ci=10;
p->rec=1;
p->next = NULL;
p->prior = g_head;
g_head->next = p;
g_curr=g_head->next;
p = (PRO*)malloc(sizeof(PRO));
strcpy(p->name, "P2");
p->team=30;
p->ci=5;
p->rec=5;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=p;
p = (PRO*)malloc(sizeof(PRO));
strcpy(p->name, "P3");
p->team=40;
p->ci=2;
p->rec=4;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=p;
p = (PRO*)malloc(sizeof(PRO));
strcpy(p->name, "P4");
p->team=85;
p->ci=7;
p->rec=3;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=p;
p = (PRO*)malloc(sizeof(PRO));
strcpy(p->name, "P5");
p->team=60;
p->ci=8;
p->rec=4;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=g_head->next;
local = (PRO*)malloc(sizeof(PRO)); /*选中进程*/
strcpy(local->name, "P0");
local->team=0;
local->ci=0;
local->rec=0;
local->next=NULL;
local->prior=NULL;
}



void acceptreq()                        
{
PRO *p;
p = (PRO*)malloc(sizeof(PRO));
printf("please input the information of the new process\n");
printf("进程名:");
scanf("%s",p->name);
printf("柱面号(0-199):");
scanf("%d",&p->team); /*输入请求进程信息*/
printf("磁道号(0-20):");
scanf("%d",&p->ci);
printf("记录号(0-7):");
scanf("%d",&p->rec);
getchar();
g_curr=g_head; /*将此节点链入I/O请求表*/
while(g_curr->next!=NULL)
g_curr=g_curr->next;
p->next=NULL;
p->prior=g_curr;
g_curr->next=p;
g_curr=g_head->next;
PrintInit(); /*将新的I/O请求表输出*/
}



void qddd()                         /*驱动调度函数*/
{
PRO *out;
int deng=0;
int deng1=0;
int min=g_head->next->team;
int max=g_head->next->team;
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if(g_curr->team==record)
{
min=g_curr->rec;
out=g_curr;
deng=1;
break;
}
}
switch(deng)
{
case 1:
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if(g_curr->team==record&&abs(g_curr->rec-rec0)<=abs(min-rec0))
{
min=g_curr->rec;
out=g_curr;
}
}
break;
case 0:
switch (yi)
{
case 1:
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (g_curr->team > record)
{
min = g_curr->team;
deng1=1;
break;
}
}
switch(deng1)
{
case 1:
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (min>=g_curr->team&&g_curr->team>record)
{
min=g_curr->team;
out=g_curr;
}
}
break;
case 0:
yi=0;
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (max<=g_curr->team)
{
min=g_curr->team;
out=g_curr;
}
}
break;
}
break;
case 0:
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (g_curr->team < record)
{
max = g_curr->team;
deng1=1;
break;
}
}
switch(deng1)
{
case 1:
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (max<=g_curr->team&&g_curr->team<record)
{
max=g_curr->team;
out=g_curr;
}
}
break;
case 0:
yi=1;
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (min>=g_curr->team)
{
min=g_curr->team;
out=g_curr;
}
}
break;
}
break;
}
break;
}
strcpy(local->name,out->name);
local->team=out->team;
local->ci=out->ci;
local->rec=out->rec;
printf("被选中进程:\n");
printf(" 进程名 柱面号 磁道号 记录号\n");
printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec );
switch(yi)
{
case 1:
printf("current direction is UP\n");
printf("*************************************\n");
break;
case 0:
printf("current direction is DOWN\n");
printf("*************************************\n");
break;
}
record = local->team;
rec0=local->rec;
if (out->next==NULL) /*将选中的进程从I/O请求表中删除*/
{
out->prior->next=NULL;
free(out);
}
else
{
out->prior->next=out->next;
out->next->prior=out->prior;
free(out);
}
}
跪求大神帮我解答啊~~~~~~

...全文
122 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pump天天学习 2014-01-02
  • 打赏
  • 举报
回复
大概看了下 init函数初始化链表,将进程p1,p2,p3...加入链表 acceptreq是加入新的请求进程 至于qddd,有点乱,不过猜来也就是电梯算法的实现了 建议lz看一下操作系统有关磁盘调度的章节,都有讲,电梯算法也不难理解

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧