#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;
}
进程调度模拟(优先级调度和时间片调度)
最新推荐文章于 2023-04-17 19:53:11 发布