时间片轮转发加优先级的进程调度算法如下:
#include <stdio.h>
struct PCB
{
int ID;
int Alltime;
int Cputime;
int Priority;
int starte;
};
int maxpriorityxiabiao(PCB pcb[],int n)
{
int max = -10000;
int a = 0;
for(int i = 0; i < n; i++)
{
max = max > pcb[i].Priority?max : pcb[i].Priority;
if(max == pcb[i].Priority)
{
a = i;
}
}
return a;
}
void sort(PCB pcb[],int n)
{
PCB p;
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
if(pcb[i].Priority < pcb[j].Priority)
{
p = pcb[i];
pcb[i] = pcb[j];
pcb[j] = p;
}
}
}
}
void priority(PCB pcb[],int n)
{
int sum = 1;
int *time = new int[n];
float count = 0;
while(sum!=0)
{
sort(pcb,n);
printf("当前就绪队列:");
for(int i = 0; i < n; i++)
{
if(pcb[i].Alltime!=0)
{
printf("%d",pcb[i].ID);
}
}
int id = maxpriorityxiabiao(pcb,n);
printf("\n");
printf("当前执行的程序ID:%d ",pcb[id].ID);
pcb[id].Alltime--;
pcb[id].Cputime++;
pcb[id].Priority = pcb[id].Priority-3;
count++;
printf("执行后Alltime:%d\n",pcb[id].Alltime);
printf("执行后Cputime:%d ",pcb[id].Cputime);
printf("执行后Priority:%d\n",pcb[id].Priority);
printf("\n");
printf("\n");
if(pcb[id].Alltime == 0)
{
pcb[id].Priority = -10000;
time[pcb[id].ID] = (int)count;
}
sum = 0;
for(int j = 0; j < n; j++)
{
sum+=pcb[j].Alltime;
}
}
count = 0;
for(int i = 0; i < n; i++)
{
printf("ID:%d运行时间是:%d\n",i,time[i]);
count += time[i];
}
printf("进程平均周转时间是:%f\n",count/n);
}
void main()
{
PCB pcb[5] = {{0,4,0,12,1},
{1,2,0,16,1},
{2,3,0,13,1},
{3,6,0,17,1},
{4,3,0,26,1}
};
priority(pcb,5);
}