进程调度算法有FIFO,优先数调度算法,时间片轮转调度算法,分级调度算法,
输入:进程流文件,其中存储的是一系列要执行的进程,
每个作业包括三个数据项:
进程名 所需时间 优先数(0级最高)
输出:
进程执行流 等待时间 平均等待时间
本程序包括:FIFO,优先数调度算法,时间片轮转调度算法
进程流文件process_stream.txt
测试数据:
p0 16 2
p1 5 1
p2 4 3
p3 8 0
p4 9 4
p5 7 6
VC++调试通过
*/
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <stdlib.h>
const int Quatum=2//定义时间片的长度为2秒
const int MAXPCB=100//定义最大进程数
//定义进程结构体
typedef struct node
{
char name[20]//进程名
int time //进程运行时间
int privilege//进程优先级(静态)
int finished//进程完成标志,0-未完成,1-已完成
int wait_time//进程等待时间
}pcb
pcb pcbs[MAXPCB]
int quantiry//进程流文件中的进程总数
void initial()
{
int i
for (i=0i<MAXPCBi++)
{
strcpy(pcbs[i].name,"")
pcbs[i].time=0
pcbs[i].privilege=0
pcbs[i].finished=0
pcbs[i].wait_time=0
}
quantiry=0
}
int readData()
{
FILE *fp
char fname[20]
int i
cout<<"请输入进程流文件名:"<<endl
cin>>fname
if ((fp=fopen(fname,"r"))==NULL)
{
cout<<"错误,文件打不开,请检查文件名"<<endl
}
else
{
while (!feof(fp))
{
fscanf(fp,"%s %d %d %d",pcbs[quantiry].name,
&pcbs[quantiry].time,&pcbs[quantiry].privilege)
quantiry++
}
//输出所读入得数据
cout<<"输出所读入的数据"<<endl
cout<<"进程流文件中的进程总数="<<quantiry<<endl
cout<<"进程名 所需时间 优先数"<<endl
for (i=0i<quantiryi++)
{
cout<<" "<<pcbs[i].name<<" "<<pcbs[i].time<<" "<<pcbs[i].privilege<<endl
}
return 1
}
return 0
}
//重置数据,以供另一个算法使用
void init()
{
int i
for (i=0i<MAXPCBi++)
{
pcbs[i].finished=0
pcbs[i].wait_time=0
}
}
void FIFO()
{
int i,j
int total
//输出FIFO算法执行流
cout<<endl<<"---------------------------------------------------------------"<<endl
cout<<"FIFO算法执行流:"<<endl
cout<<"进程名 等待时间"<<endl
for (i=0i<quantiryi++)
{
cout<<" "<<pcbs[i].name<<" "<<pcbs[i].wait_time<<endl
for (j=i+1j<quantiryj++)
{
pcbs[j].wait_time+=pcbs[i].time
}
}
total=0
for (i=0i<quantiryi++)
{
total+=pcbs[i].wait_time
}
cout<<"总等待时间:"<<total<<" "<<"平均等待时间:"<<total/quantiry<<endl
}
//优先度调度算法
void privilege()
{
int i,j,p
int passed_time=0
int total
int queue[MAXPCB]
int current_privielege=1000
for (i=0i<quantiryi++)
{
current_privielege=1000
for (j=0j<quantiryj++)
{
if ((pcbs[j].finished==0)&&(pcbs[j].privilege<current_privielege))
{
p=j
current_privielege=pcbs[j].privilege
}
}
queue[i]=p
pcbs[p].finished=1
pcbs[p].wait_time+=passed_time
passed_time+=pcbs[p].time
}
//输出优先数调度执行流
cout<<endl<<"-----------------------------------------"<<endl
cout<<"优先数调度执行流:"<<endl
cout<<"进程名 等待时间"<<endl
for (i=0i<quantiryi++)
{
cout<<" "<<pcbs[queue[i]].name<<" "<<pcbs[queue[i]].wait_time<<"--"<<queue[i]<<endl
}
total=0
for (i=0i<quantiryi++)
{
total+=pcbs[i].wait_time
}
cout<<"总等待时间:"<<total<<" 平均等待时间:"<<total/quantiry<<endl
}
//时间片轮转调度算法
void timer()
{
int i,j,sum,flag=1
int passed_time=0
int max_time=0
int round=0
int queue[1000]
int total=0
while(flag==1)
{
flag=0
for (i=0i<quantiryi++)
{
if (pcbs[i].finished==0)
{
flag=1
queue[total]=i
total++
if (pcbs[i].time<=Quatum*(round+1))
pcbs[i].finished=1
}
}
round++
}
cout<<endl<<"---------------------------------------------------------------"<<endl
cout<<"时间片轮转调度执行流:"
for(i=0i<totali++)
{
cout<<pcbs[queue[i]].name<<" "
}
cout<<endl
cout<<"进程名 结束时间 运行时间 等待时间"<<endl
sum=0
for (i=0i<quantiryi++)
{
for(j=total-1j>=0j--)//从轮转调度执行流序列由后往前比较,找到同名进程即可计算其完成时间
{
if (strcmp(pcbs[queue[j]].name,pcbs[i].name)==0)
{
cout<<" "<<pcbs[i].name<<" "<<(j+1)*Quatum<<""
cout<<pcbs[i].time<<""<<(j+1)*Quatum-pcbs[i].time<<endl
sum+=(j+1)*Quatum-pcbs[i].time
break
}
}
}
cout<<"总等待时间:"<<sum<<" "<<"平均等待时间:"<<sum/quantiry<<endl
}
//显示版权信息函数
void version()
{
cout<<endl<<endl
cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl
cout<<" ┃ 进程调度模拟系统 ┃"<<endl
cout<<" ┠───────────────────────┨"<<endl
cout<<" ┃ version 2011┃"<<endl
cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl
cout<<endl<<endl
}
//主函数
int main()
{
int flag
version()
initial()
flag=readData()
if(flag==1){
FIFO()
init()
privilege()
init()
timer()
}
cout<<endl
system("pause")
return 0
}
先来先服务:用队列来实现,至于是循环队列,链队还是顺序队列,那要看具体问题决定进程调度:可以将要处理的任务集成为函数,并定义函数指针,最后将指针入队就行了
说白了,就是对队列的各种操作~~~