进程调度实验
实验目的
进程调度是处理机管理的核心内容。本实验要求用C语言编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法。一、实验内容
实验内容(优先数和时间片轮转调度算法)
①设计进程控制块PCB表结构,分别适用于优先数调度算法和时间轮转调度算法。
②建立进程就绪队列。对两种不同算法编制入链子程序。
③编制两种进程调度算法:1)优先数调度;2)循环轮转调度
二、程序流程图
主程序的流程图:
主要函数模块的流程图:
三、代码实现:
#include<stdio.h> #include<stdlib.h> #define N 5 typedef struct pcb { int pid; int pyouxian; int pdaxiao; int CPUtime; int needtime; int pyouxian_max; }PCB; void Creat_process(PCB *); void Youxian_diaodu(PCB *); void Shijianpian_diaodu(PCB *); void Output_process(PCB *); main() { PCB process[N]; Creat_process(process); Youxian_diaodu(process); getchar();//一定要加这句才能运行Shijianpian_diaodu(),因为要考虑输入结束符非't'字符后还有个回车,它就是用来接受回车符!否则回车符会被Shijianpian_diaodu()接受,与预期不符! Shijianpian_diaodu(process); } void Creat_process(PCB *process) { int i; for(i=0;i<N;i++) { process[i].pid=i+1; //printf("\nPlease input this process[%d].pid:\n",i); //scanf("%d",&process[i].pid); //printf("\nPlease input this process[%d].pyouxian:\n",i); //scanf("%d",&process[i].pyouxian); process[i].pyouxian=40+rand()%30; //printf("\nPlease input this process[%d].pdaxiao:\n",i); //scanf("%d",&process[i].pdaxiao); process[i].pdaxiao=rand()%300; process[i].CPUtime=0; process[i].needtime=10+rand()%20; process[i].pyouxian_max=0; } for(i=0;i<N;i++) { printf("\npid\tpyouxian\tpdaxiao\t\tCPUtime\t\tneedtime\tyxmax\n"); printf("\n%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",process[i].pid,process[i].pyouxian,process[i].pdaxiao,process[i].CPUtime,process[i].needtime,process[i].pyouxian_max); } } void Youxian_diaodu(PCB *process) { int i,k; char temp; printf("\nThis is Youxian_diaodu!\nWhen you input is not:'t',then this fuction stop!\n"); printf("\nWhen you input 't',then run once:"); temp=getchar(); while(/*temp!='z'&&*/temp=='t') { for(i=0;i<N;i++) { if(process[i].pyouxian<=0||process[i].needtime<=0) { printf("\nThe %dth process is over!\n",process[i].pid); temp='z';//只要是非't'字符即可! break; } } if(temp=='z')//要与前一个非't'字符一致!,因为这里只控制由于process[i].needtime<=0的情况下的处理方式! { break; } k=process[0].pid; for(i=1;i<N;i++) { if(process[i].pyouxian>process[k-1].pyouxian) { k=process[i].pid; } if(process[i].pyouxian==process[k-1].pyouxian) { k=process[k-1].pid; } } process[k-1].pyouxian_max=1; for(i=0;i<N;i++) { if(process[i].pyouxian_max==1) { process[i].pyouxian-=3; process[i].CPUtime+=1; process[i].needtime-=1; } } Output_process(process); process[k-1].pyouxian_max=0; getchar(); temp=getchar(); } } void Shijianpian_diaodu(PCB *process) { int i,j=0;//,k; char temp; printf("\nThis is Shijianpian_diaodu!\nWhen you input is not:'t',then this fuction stop!\n"); printf("\nWhen you input 't',then run once:"); temp=getchar(); while(/*temp!='z'&&*/temp=='t') { for(i=0;i<N;i++) { //if(process[i].pyouxian<=0||process[i].needtime<=0) if(process[i].needtime<=0) { printf("\nThe %dth process is over!\n",process[i].pid); temp='z';//只要是非't'字符即可! break; } } if(temp=='z')//要与前一个非't'字符一致!,因为这里只控制由于process[i].needtime<=0的情况下的处理方式! { break; } /*k=process[0].pid; for(i=1;i<N;i++) { if(process[i].pyouxian>process[k-1].pyouxian) { k=process[i].pid; } if(process[i].pyouxian==process[k-1].pyouxian) { k=process[k-1].pid; } } process[k-1].pyouxian_max=1;*/ //for(i=0;i<N;i++) //{ //if(process[i].pyouxian_max==1) //{ //process[i].pyouxian-=3; for(i=0;i<N;i++) { process[i].pyouxian_max=0;//为了把Youxian_diaodu()中的pyouxian_max属性都清零,否则影响此Shijianpian_diaodu()中的pyouxian_max属性! } process[j].CPUtime+=2;//注意这里的两个数组元素的下标不能同为j++,否则相当于j+=2; process[j].needtime-=2; process[j].pyouxian_max=1; //} //} Output_process(process); process[j].pyouxian_max=0; if(j==N-1) { j=-1;//这里j应为-1,因为下面有j++;语句! } j++;//别忘了让数组下标指向下一个数组。 getchar(); temp=getchar(); } } void Output_process(PCB *process) { int i; for(i=0;i<N;i++) { printf("\npid\tpyouxian\tpdaxiao\t\tCPUtime\t\tneedtime\tyxmax\n"); printf("\n%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",process[i].pid,process[i].pyouxian,process[i].pdaxiao,process[i].CPUtime,process[i].needtime,process[i].pyouxian_max); } }本文是原创,转载请注明出处!