电梯调度算法(源代码)

  • 格式:doc
  • 大小:45.50 KB
  • 文档页数:10

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>typedef struct _proc{char name[32]; /*定义进程名称*/int team; /*定义柱面号*/int ci; /*定义磁道面号*/int rec; /*定义记录号*/struct _proc *prior;struct _proc *next;}PROC;PROC *g_head=NULL,*g_curr=NULL,*local;int record=0;int yi=1;void init(){PROC *p; /*初始化链表(初始I/O表)*/g_head = (PROC*)malloc(sizeof(PROC));g_head->next = NULL;g_head->prior = NULL;p = (PROC*)malloc(sizeof(PROC));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 = (PROC*)malloc(sizeof(PROC));strcpy(p->name, "P2");p->team=30;p->ci=5;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr=p;p = (PROC*)malloc(sizeof(PROC));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 = (PROC*)malloc(sizeof(PROC));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 = (PROC*)malloc(sizeof(PROC));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 = (PROC*)malloc(sizeof(PROC)); /*选中进程*/ strcpy(local->name, "P0");local->team=0;local->rec=0;local->next=NULL;local->prior=NULL;}void PrintInit() /*打印I/O表*/{PROC *t = g_head->next;printf("-------------------------------------\n");printf(" ---------I/O LIST---------\n");printf(" process team ci rec \n");while(t!=NULL){printf("%4s %8d %8d %5d\n", t->name, t->team, t->ci, t->rec );t = t->next;}printf("\n\nCurrent process is :\n");printf("------------------------------\n\n");printf(" process team ci rec \n");printf("%4s %8d %8d %5d\n", local->name, local->team, local->ci, local->rec );switch(yi){case 1:{printf("current direction is UP\n");break;}case 0:{printf("current direction is down\n");break;}}}void acceptreq() /*接受请求函数*/{PROC *p;p = (PROC*)malloc(sizeof(PROC));printf("please input the information of the new process\nprocess-name:\nprocess-team\nprocess-ci\nprocess-rec\n");printf("\n");scanf("%s",p->name);printf("2.team 0-199\n");scanf("%d",&p->team); /*输入请求进程信息*/printf("3.ci 0-19\n");scanf("%d",&p->ci);printf("4.rec 0-7\n");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;printf("NEW I/O LIST\n\n");PrintInit(); /*将新的I/O请求表输出*/}void qddd() /*驱动调度函数*/{PROC *out;int min;int max=g_head->next->team;if (g_head->next==NULL); /*若已全部调度,则空操作*/else{switch (yi){case 1:{min=g_head->next->team;out=g_head->next; /*选出最小的team进程,模拟启动此进程*/strcpy(local->name,out->name);local->team=out->team;local->ci=out->ci;local->rec=out->rec;for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next){if (g_curr->team > record){ min = g_curr->team;break;}}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;strcpy(local->name,out->name);local->team=out->team;local->ci=out->ci;local->rec=out->rec;}}printf("\n-----------------------\n");printf("the process choosed :\n");printf(" process team ci rec \n");printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec );record = local->team;printf("%d",record);for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next){if (max<g_curr->team)max=g_curr->team;}if(max==record){yi=0;record=1000;break;}break;}/*case 1*/case 0: /*case 1 的对称过程*/ {max=g_head->next->team;out=g_head->next;strcpy(local->name,out->name);local->team=out->team;local->ci=out->ci;local->rec=out->rec;for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next){if (g_curr->team < record){ max = g_curr->team;break;}}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;strcpy(local->name,out->name);local->team=out->team;local->ci=out->ci;local->rec=out->rec;}}printf("\n-----------------------\n");printf("the process choosed :\n");printf(" process team ci rec \n");printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec );min=g_head->next->team;for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next){if (min>g_curr->team)min=g_curr->team;}record = local->team;if(min==record){yi=1;record=0;break;}break;}default : return -1;}/*switch*/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);}}/*else*/}void acceptnum() /*通过输入0~1选择‘驱动调度’或是‘接受请求’*/{float num;char c;while(1){printf("----------------------------------------------\n");printf("please input a number between 0 and 1\nnum<=0.5:accept request\nnum>0.5:qudong diaodu\n\nnum==2:I/O LIST\n\nnum=?\n");scanf("%f",&num);getchar();while((num<0||num>1)&&num!=2) /*过滤不合法数据注意:本程序其他输入数据可能未过滤*/{printf("number ERROR!Input again please!\nnum=?\n ");scanf("%f",&num);getchar();}if(num>0.5&&num!=2) /*驱动调度*/{if (g_head->next==NULL){printf("\n\n");printf("---------------------\n");printf("I/O list is empty!!!\n"); /*请求表为空无需调度*/}else{printf("qudong diaodu\n");qddd();/*调用函数进行调度*/}else if (num<=0.5) /*接受请求*/{printf("accept request\n\n");acceptreq();}else if (num==2) /*通过输入2显示当前请求I/O表*/ {printf("I/O LIST;");printf("-------------------\n");PrintInit();printf("\n");}printf("-----------------------\n");printf("choose 'n' to quit else to continue\n"); /*输入n离开本程序*/ if(strcmp(c=getchar(),'n')==0||strcmp(c=getchar(),'N')==0){//clrscr();printf("\n\n\n\n\n\n");printf("thank you for testing my program!\n");printf(" ---by 01\n");sleep(2);printf("\n\nBYEbye!!");sleep(2);return -1;}else{//clrscr();}}}main () /*主程序*/init(); PrintInit(); acceptnum();}。