#include "jobRun.h"
//作业处理
void JobRun::run(jcbStruct (&jobTable)[10],int & jobCount)
{
double priority[MaxJobNumber]; //存储作业优先权
for (int i = 0; i < MaxJobNumber;i++)
{
priority[i] = 0.0;
}
while(jobCount > 0)
{
int pJCB = 0; //第一个JCB所在数组位置标示
for (int n = 0; n < MaxJobNumber ;n++)
{
if(jobTable[n].runTime > 0) //求出第一个PCB的位置
{
pJCB = n;
break;
}
}
//求所有JCB的优先权
for (int temp = 0; temp < jobCount; temp++)
{
if(pJCB <= -1) break; //超出末尾
//求优先权,注意waitTime已经预先全部加1,后继程序注意处理
if(jobTable[pJCB].runTime > 0) //防止0错
priority[pJCB] = 1.0 + (jobTable[pJCB].waitTime++)/jobTable[pJCB].runTime;
pJCB = jobTable[pJCB].next; //下一个JCB位置
}
//比较,得出最大的优先权
double tempPriority = 0.0; //存储找到最大优先权
int priJCB = 0; //存储优先权最大的位置
for (int m = 0; m < MaxJobNumber; m ++)
{
if (priority[m] > tempPriority)
{
tempPriority = priority[m]; //找到最大优先权
priJCB = m;
}
}
//处理最大优先权的job
jobTable[priJCB].waitTime --; //返回预处理减去的时间
jobTable[priJCB].runTime --; //要求服务时间减少1
//特殊情况,job处理完成
if (jobTable[priJCB].runTime == 0)
{
//前一位置的JCB的next指针重新定位
for (int l = 0; l < priJCB; l++)
{
if (jobTable[l].next == priJCB)
{
jobTable[l].next = jobTable[priJCB].next;
break;
}
}
jobTable[priJCB].next = -32767; //清空该JCB
jobTable[priJCB].waitTime = 0;
priority[priJCB] = 0.0;
cout<<"线程 "<<jobTable[priJCB].name<<" 处理完毕 !"<<endl;
jobCount --;
}
}
};