- 论坛徽章:
- 0
|
#include "stdio.h"
#define MaxProcessNumber 10
#define MaxGanttNumber 500
#define MaxCPUTime 10000
char *ErrorTable[]={"Success!",
"Input file open error!",
"Can not close the input file!",
"Exceed the Max Process Number",
"No Process"};
int ProcessNumber = 0;
int GanttNumber = 0;
int CPUBurstTime[MaxProcessNumber];
int WaitingTime[MaxProcessNumber]={0};
int GanttChartProcess[MaxGanttNumber];
int GanttChartTime[MaxGanttNumber];
int TerminationProcess[MaxProcessNumber] = {0};
double AverageWaitingTime = 0.0;
// Read Process Information From Input File
int ReadProcess(char *infn)
{
FILE *fp;
if(( fp = fopen(infn, "r")) == NULL)
{
return 1;
}
for(ProcessNumber=0;ProcessNumber<MaxProcessNumber&&!feof(fp);ProcessNumber++)
{
fscanf(fp,"%d", &CPUBurstTime[ProcessNumber]);
}
ProcessNumber--;
if(fclose(fp))
{
return 2;
}
if(ProcessNumber == MaxProcessNumber)
{
return 3;
}
if(ProcessNumber == 0)
{
return 4;
}
return 0;
}
// Implementation of CPU Scheduling Algorithm
int CPUScheduling()
{
//Gantt Charter
int time = 0, AlloCPUProcoss = 0,EndProcessNum = 0,i;
GanttChartTime[GanttNumber] = time;
GanttChartProcess[GanttNumber] = AlloCPUProcoss;
while(time < MaxCPUTime)
{
/////////////Different CPUScheduling//////////////////////////////////////////
time++;
CPUBurstTime[AlloCPUProcoss]--;
for(i=0;i<ProcessNumber;i++)
{
if(TerminationProcess[i] == 0 && AlloCPUProcoss != i)
WaitingTime[i]++;
}
if(CPUBurstTime[AlloCPUProcoss] == 0)
{
GanttNumber++;
GanttChartTime[GanttNumber] = time;
TerminationProcess[AlloCPUProcoss] = 1;
EndProcessNum++;
if(EndProcessNum < ProcessNumber)
{
AlloCPUProcoss++;
GanttChartProcess[GanttNumber] = AlloCPUProcoss;
}
else
{
break;
}
}
///////////////////////////////////////////////////////////////////////////////
}
return 0;
}
// Output Gantt Chart
int OutputGantt()
{
int i;
printf("-------------Gantt Chart---------------\n");
printf(" ");
for(i=0;i<GanttNumber;i++)
{
printf("%d-P%d-",GanttChartTime[i],GanttChartProcess[i]);
}
printf("%d\n",GanttChartTime[GanttNumber]);
printf("---------------------------------------\n");
return 0;
}
// Calculate Waiting Time
int CalWaitingTime()
{
int i,sum = 0 ;
for(i=0;i<ProcessNumber;++i)
{
sum += WaitingTime[i];
}
AverageWaitingTime = 1.0*sum/ProcessNumber;
return 0;
}
// Output Waiting Time
int OutputResult()
{
int i;
printf("- Waiting Time -\n");
printf("---------------------------------------\n");
for(i=0;i<ProcessNumber;i++)
printf(" P%d:%d\n",i,WaitingTime[i]);
printf(" Average Waiting Time = %lf.\n",AverageWaitingTime);
printf("---------------------------------------\n");
return 0;
}
// Output Error Message
char *OutputError(int number)
{
return ErrorTable[number];
}
// Main Function
int main(int argc, char *argv[])
{
int res = 0;
if((res=ReadProcess(argv[1])) != 0)
goto EXIT;
if((res=CPUScheduling()) != 0)
goto EXIT;
if((res=OutputGantt()) != 0)
goto EXIT;
if((res=CalWaitingTime()) != 0)
goto EXIT;
if((res=OutputResult()) != 0)
goto EXIT;
EXIT:
if(res != 0)
printf("%s\n",OutputError(res));
return 1;
} |
|