山东科技大学学生课程设计
1.2.3 详细设计
1.主函数模块
首先调用list( )函数,再调用runsjf()函数。
2.进程创建和排序模块
创建进程时,首先用malloc( )先申请内存,建一个空的后备队列,然后输入进程的相关信息,通过对比进程的arrivetime排成一个队列。 3.寻找进程模块
在实现查找短进程功能时,用getcount()函数获得当前已经到达且未完成的进程,再利用循环将每一个进程的runtime与当前的最短运行时间mintime进行比较,如果runtime小于mintime,则将该进程的runtime赋给mintime,并将指针指向下一个进程,直到找到运行时间最短的进程。 4.运行及输出模块
调用runsjf()程序进行运行,当运行时,把进程的开始时间begintime置为当前时间time,完成时间finishtime为开始时间begintime加上运行时间runtime,周转时间turntime为finishtime减arrivetime,带权周转时间wturntime为turntime/runtime。
- 13 -
山东科技大学学生课程设计
开始 输入进程信息 将进程排成队列 调用sjf()函数 runtime< mintime 是 否 mintime=runtime 指针指向下个进程 否 下一个进程是否为空 是 调用runsjf()运行进程 输出运行后信息 是 是否还有进程 否 - 14 - 结束 图2:SJF流程图
山东科技大学学生课程设计
程序源代码
#include
int cmp(const void *_a,const void *_b) {
float *a=(float *)_a; float *b=(float *)_b; return *a>*b; }
int main() {
float ST[5]; //服务时间. float AT[5]; //到达时间. float FT[5]={0}; //完成时间. float WT[5]={0}; //周转时间. float AWT[5]={0}; //带权周转时间. float temp[4]={0}; //临时变量. int sq[5]; //存入优先序列的序号. int p[5]={0}; int i=0,k,st,j;
printf(\输入到达时间: \ for(i=0;i<5;i++)
printf(\输入服务时间: \ for(i=0;i<5;i++)
scanf(\scanf(\
- 15 -
山东科技大学学生课程设计
sq[0]=0; p[0]=-1;
FT[0]=AT[0]+ST[0]; k=1;
while(k<5) {
j=0;
for(i=1;i<5;i++)
if(p[i]==0&&FT[sq[k-1]]>=AT[i])
temp[j++]=ST[i];
if(j==0) { } else {
qsort(temp,j,sizeof(float),cmp); for(i=0;i for(st=1;st<5;st++) if(p[st]==0&&temp[i]==ST[st]) - 16 - for(i=1;i<5;i++) if(p[i]==0) { } sq[k++]=i; FT[i]=AT[i]+ST[i]; p[i]=-1; i=5; 山东科技大学学生课程设计 } for(i=0;i<5;i++) { } printf(\完成时间输出: \ for(i=0;i<5;i++) printf(\ printf(\ printf(\周转时间输出: \ for(i=0;i<5;i++) printf(\ printf(\ printf(\带权周转输出: \ for(i=0;i<5;i++) printf(\ printf(\ return 0; }1.2.4 } { } FT[st]=FT[sq[k-1]]+ST[st]; sq[k++]=st; p[st]=-1; st=5; WT[i]=FT[i]-AT[i]; AWT[i]=WT[i]/ST[i]; 运行结果 - 17 -