typedef struct pcb{ int id;//进程号 int intime;//提交时间 int priority;//优先级 int starttime;//开始执行时间 int length;//进程长度大小 int endtime;//结束时间 char state;//状态 int ptime;//时间片 struct pcb *next; }*PCB,pcb;//进程控制块
PCB CreatReady(PCB R,int i){ R=(PCB)malloc(sizeof(pcb)); R->id=i+1; R->priority=5-i; R->ptime=i+1; R->state='R'; R->next=NULL; printf(\"第%d级:\%d\%d\\n\ return R; }
PCB CreatWait(PCB W){ int i; pcb *p,*q; q=W; printf(\"给进程初始化如下(tab键隔开):\\n\"); printf(\"进程\in时间\优先级\长度\\n\"); for(i=0;i } void Insert(PCB R,pcb *cp){ pcb *tail; tail=R; while(tail->next){ tail=tail->next; } tail->next=cp; cp->next=NULL; } int FindQuery(PCB R[M]){ int i,j; for(i=0;i int Dispatch(PCB R,pcb *cp,PCB W,int time,pcb *tp){ int s; pcb *p,*phead; phead=W; p=W->next; cp->starttime=time; cp->length-=R->ptime; cp->endtime=cp->starttime+R->ptime; if(cp->length<=0){ s=1;//表示完成 cp->endtime+=cp->length;//当进程在时间片内就完成,则应减去cp-length多减的部分 } else{ if(p){ while(p){ if((p->intime tp->priority=p->priority; tp->state=p->state; //将抢占进程p备份到tp中 phead->next=p->next;//从后备队列中删除抢占的进程 cp->length +=cp->endtime-tp->intime; cp->endtime-=cp->endtime-tp->intime; s=-1;//表示被抢占 break; } else if(p->intime>=cp->endtime){ s=0;//在后备队列中没有可以抢占的进程时 break; } p=p->next;phead=phead->next; }//查找可以抢占cpu的优先级高的进程tp } else s=0;//在后备队列没有进程时 } return s; } void Print(PCB F){ pcb *p; p=F->next; while(p){ printf(\"P%d\结束时间:%d\\n\ p=p->next; } } PCB MFQ(PCB W,PCB R[M],PCB F){ pcb *cp;//当前系统操作的进程 pcb *tp;//抢占cpu的进程 tp=(PCB)malloc(sizeof(pcb)); tp->priority=0; tp->next=NULL; int time=0;//time表示系统当前时间 int Finish=0; int i,have,j;//i表示就绪队列的级数,time表示系统当前时间,have表示有进程提交, int s;//s表示cpu执行进程调度的三种结果状态,0表示时间片耗尽进入下级队列,1表示进程完成,-1表示进程被抢占 while(Finish printf(\"%d时,P%d被P%d抢占cpu并转入就绪队列%d队尾!\\n\ } time=cp->endtime; } return F; } void main (){ PCB W;//后备队列 PCB R[M];//就绪队列 PCB F;//完成队列 int i; printf(\"就绪队\优先级\时间片\\n\"); for(i=0;i 因篇幅问题不能全部显示,请点此查看更多更全内容