a4

来源:互联网 发布:windows cmd ls 编辑:程序博客网 时间:2024/04/28 18:14
#include<stdio.h>#define N 100#define INF 100000000struct PCB{int id;//标志数int priority;//优先数int cputime;//已占用CPU时间int alltime;//还需占用CPU时间int startblock;//阻塞时间int blocktime;//被阻塞时间int state;//状态}pro[N];int n;//进程数int time;//已经过的时间片数int oncall_front,oncall_rear;int block_front,block_rear;//输入初始进程PCBvoid Input(){for(int i=0;i<n;i++){scanf("%d%d%d%d%d%d",&pro[i].id,&pro[i].priority,&pro[i].cputime,&pro[i].alltime,&pro[i].startblock,&pro[i].blocktime);pro[i].state=0;}}//检测是否所有进程都完成,是则返回1,否则返回0int Finish(){for(int i=0;i<n;i++){if(pro[i].alltime>0)return 0;}return 1;}//找出优先权最大的进程,返回它在pro数组中的序号int Priority(){int max=-INF,max_id=-1;for(int i=0;i<n;i++){if(pro[i].state==0 && pro[i].alltime>0 && max<pro[i].priority)//只考虑就绪状态的进程{max=pro[i].priority;max_id=i;}}return max_id;}//阻塞判断void Block_Judge(){for(int i=0;i<n;i++){if(pro[i].startblock!=-1){if(time>=pro[i].startblock+1 && time<pro[i].startblock+1+pro[i].blocktime)pro[i].state=2;elsepro[i].state=0;}}}//时间片过程,更新PCBvoid Cputime_process(){for(int i=0;i<n;i++){if(pro[i].state==1)//使用处理机的进程{pro[i].priority-=3;pro[i].cputime++;pro[i].alltime--;}else if(pro[i].state==0)//就绪队列的进程{pro[i].priority++;}}}void print(){printf("==================== current_time: %d =======================\n\n",time);printf("   ID\t");//IDfor(int i=0;i<n;i++)printf("%d\t",pro[i].id);printf("\n");printf("   PRIORITY\t");//PRIORITYfor(int i=0;i<n;i++)printf("%d\t",pro[i].priority);printf("\n");printf("   CPUTIME\t");//CPUTIMEfor(int i=0;i<n;i++)printf("%d\t",pro[i].cputime);printf("\n");printf("   ALLTIME\t");//ALLTIMEfor(int i=0;i<n;i++)printf("%d\t",pro[i].alltime);printf("\n");printf("   STARTBLOCK\t");//STARTBLOCKfor(int i=0;i<n;i++)printf("%d\t",pro[i].startblock);printf("\n");printf("   BLOCKTIME\t");//BLOCKTIMEfor(int i=0;i<n;i++)printf("%d\t",pro[i].blocktime);printf("\n");printf("   STATE\t");//STATEfor(int i=0;i<n;i++)printf("%d\t",pro[i].state);printf("\n\n");}int main(){time=0;oncall_front=oncall_rear=block_front=block_rear=-1;printf("Please input the number of processes:");scanf("%d",&n);Input();while(!Finish()){time++;Block_Judge();int max_id=Priority();pro[max_id].state=1;Cputime_process();print();pro[max_id].state=0;}return 0;}

原创粉丝点击