#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> typedef struct node{ char name[10];//进程名字 int first; //优先数 int round; // int arrive_time; int need_run_time; int use_time;//已用cpu时间 char state; //状态 int count; struct node *next; }PCB; void print_pro(int algo); void print_robin(void); int algo; PCB *finish,*ready,*tail,*run;//队列指针 int progress;//进程数 void firstin(){ run=ready; run->state='R'; ready=ready->next; } //标题输出 void printtile(int algo){ switch(algo){ case 1://时间片轮转 printf("名字 进程完成需要时间 计数器 时间片 使用cpu时间 状态\n"); printf("###################################################\n"); break; case 2://优先级 printf("名字 进程优先级 进程完成需要时间 使用cpu时间 状态\n"); printf("###################################################\n"); break; default: break; } } //PCB输出 void printPCB(int a,PCB *p){ switch(a){ case 1: printf("%s %d %d %d %d %c\n",p->name,p->need_run_time,p->count,p->round,p->use_time,p->state); break; case 2: printf("%s %d %d %d %c\n",p->name,p->first,p->need_run_time,p->use_time,p->state); break; default: break; } } void print(int algo){ PCB *p; printtile(algo); if(run!=NULL) printPCB(algo,run); p=ready; while(p!=NULL){ printPCB(algo,p); p=p->next; } p=finish; while(p!=NULL){ printPCB(algo,p); p=p->next; } getch(); } void robin(PCB *p){ tail->next=p; tail=p; p->next=NULL; } //创建时间片轮转 void create_robin(int tile){ PCB *p; int i,time; char name1[10]; ready=NULL; finish=NULL; run=NULL; printf("\n\t 输入每个进程名字和运行需要时间\n"); printf("\n\t 例如一个进程(progress1 5回车)\n"); printf("##################################################\n\n\n"); for(i=0;i<progress;i++){ p=(PCB*)malloc(sizeof(PCB)); scanf("%s",&name1); scanf("%d",&time); strcpy(p->name,name1); p->need_run_time=time; p->use_time=0; p->count=0; p->state='W'; p->round=1; if(ready!=NULL){ robin(p); }else{ p->next=ready; ready=p; tail=p; } } print_robin(); } //时间轮转法输出 void print_robin(void){ printf("\n\t 时间片轮转模拟输出结果:\n"); printf("#################################################\n"); print(algo); run=ready; ready=ready->next; run->state='R'; } //时间片算法 void robin_run(int num){ while(run!=NULL){ run->need_run_time-=1; run->count+=1; run->use_time+=1; if(run->need_run_time==0){ run->next=finish; run->state='F'; run=NULL; if(ready!=NULL) firstin(); } else if(run->count==run->round){ run->count=0; if(ready!=NULL){ run->state='W'; robin(run); firstin(); } } print(algo); } } //优先级插入 void pro_insert(PCB *p){ PCB *p1; PCB *s; PCB *r; int num; s=p; p1=ready; r=p1; num=1; while((p1!=NULL)&&num){ if(p1->first>=s->first){ r=p1; p1=p1->next; }else num=0; if(r!=p1){ r->next=s; s->next=p1; }else{ s->next=p1; ready=s; } } } //创建优先级PCB void pro_create(int algo){ PCB *p; int i,time; char name[10]; ready=NULL; finish=NULL; run=NULL; printf("\n\t 请输入每个进程名字和它的运行时间\n"); printf("\n\t 例如1个进程(progress1 5回车)\n"); printf("################################################\n\n\n"); for(i=1;i<=progress;i++){ p=(PCB *)malloc(sizeof(PCB)); scanf("%s",&name); scanf("%d",&time); strcpy(p->name,name); p->need_run_time=time; p->use_time=0; p->state='W'; p->first=50-time; if(ready!=NULL){ pro_insert(p); }else{ p->next=ready; ready=p; } } print_pro(algo); } void print_pro(int algo){ printf("\n\t 优先级调度算法模拟输出\n"); printf("###############################################\n"); print(algo); run=ready; ready=ready->next; run->state='R'; } //优先级进程调度算法 void pro_change(int algo){ while(run!=NULL){ run->need_run_time-=1; run->use_time+=1; run->first-=3; if(run->need_run_time==0){ run->next=finish; finish=run; run->state='F'; run=NULL; if(ready!=NULL) firstin(); }else if((ready!=NULL)&&(run->first<ready->first)){ run->state='W'; pro_insert(run); firstin(); } print(algo); } } int main(){ char mainmenu; do{ system("cls"); printf("\n\t 进程调度模拟系统\n"); printf("##############################################\n"); printf("# #\n"); printf("# #\n"); printf("# #\n"); printf("# 1、时间片轮转算法模拟 #\n"); printf("# #\n"); printf("# #\n"); printf("# #\n"); printf("# 2、优先级算法模拟 #\n"); printf("# #\n"); printf("# #\n"); printf("# #\n"); printf("# 3、退出系统 #\n"); printf("# #\n"); printf("# #\n"); printf("# #\n"); printf("# #\n"); printf("# #\n"); printf("# #\n"); printf("##############################################\n"); scanf("%d",&algo); switch(algo){ case 1: system("cls"); printf("\n\t 请输入需要模拟进程个数\n"); scanf("%d",&progress); create_robin(algo); robin_run(algo); break; case 2: system("cls"); printf("\n\t 请输入需要模拟进程个数\n"); scanf("%d",&progress); pro_create(algo); pro_change(algo); break; case 3: break; default: printf("\n\t 你的输入有错误!!\n"); break; } mainmenu=getchar(); }while(mainmenu=='y'||mainmenu=='Y'); return 0; }
进程调度模拟(优先级调度和时间片调度)
猜你喜欢
转载自blog.csdn.net/qq_40955914/article/details/80273301
今日推荐
周排行