fcfs:用C实现三种进程作业调度FCFS,SJF,HRN的代码

 2021-07-03 20:31    77  

  我们的程序作业fcfs。

///////////////FCFSfcfs。cpp////////////////////////////////

int wcompare(const PCB &e1,const PCB &e2)

{

if(e1fcfs。waittime>e2。
  waittime) return 1;

else return 0;

}

int maxwaittime(CLink &L_ready,PCB &maxwait)

{

//用maxwait返回等待时间最长的进程

//返回值为此进程在链表中的序号

//若链表为空,返回0

PCB tmp;

int index=0,t;

maxwait。
  waittime=-1;

while(t=L_ready。LocateElem(maxwait,wcompare,tmp))

{

maxwait=tmp;

index=t;

}

return index;

}

void fcfs()

{

int time=0; //系统时间

int free=true; //CPU忙碌时为false,空闲时为true

int tag; //标志是否有新进程进入

int index;

PCB running;

CLink L_ready; //就绪进程链表对象

int task=process。
  Length(); //任务数

fprintf(fout,"先来先服务调度策略(FCFS):\n");

while(task) //开始选择和运行进程,直到所有进程运行完毕

{

if(tag=getready(L_ready,time))

{

fprintf(fout,"-----------time: %3d-----------\n",time);

fprintf(fout,"进程名称 到达时间 服务时间\n");

L_ready。
  Traverse(print);

fputc('\n',fout);

}

if(free) //当前没有任务,CPU空闲

if(index=maxwaittime(L_ready,running))

{

fprintf(fout,"-----------time: %3d-----------\n选择执行的进程为:%s\n\n",time, );

free=false; //选择等待时间最久的进程

}

time++;

if(!free)

{

running。
  function; //运行等待时间最久的进程

talrun++;

L_ready。Traverse(addwaittime);

if( talrun>= rvetime)

{

//进程任务完成

L_ready。
  Delete(index,running); //把此进程从进程链表中删除

nishtime=time;

index=process。ElemIndex(running);

process。SetCurElem(index,running);

fprintf(fout,"-----------time: %3d-----------\n完成进程:%s\n\n",time, ); free=true;

task--;

}

}

}

generalize();

fputc('\n',fout);

}

///////////////FCFS。
  cpp////////////////////////////////

///////////////spn。cpp////////////////////////////////

int servetimecmp(const PCB &e1,const PCB &e2)

{

if( rvetime &L_ready,PCB &minserve)

{

//用minserve返回服务时间最短的进程

//返回值为此进程在链表中的序号

//若链表为空,返回0

PCB tmp;

int index,t;

index=L_ready。
  GetFirst(minserve);

while(t=L_ready。LocateElem(minserve,servetimecmp,tmp))

{

minserve=tmp;

index=t;

}

return index;

}

void spn()

{

int time=0; //系统时间

int free=true; //CPU忙碌时为false,空闲时为true

int tag; //标志是否有新进程进入

int index;

PCB running;

CLink L_ready; //就绪进程链表对象

int task=process。
  Length(); //任务数

fprintf(fout,"最短进程Next调度策略(SPN):\n");

while(task) //开始选择和运行进程,直到所有进程运行完毕

{

if(tag=getready(L_ready,time))

{

fprintf(fout,"-----------time: %3d-----------\n",time);

fprintf(fout,"进程名称 到达时间 服务时间\n");

L_ready。
  Traverse(print);

fprintf(fout,"\n");

}

if(free) //当前没有任务,CPU空闲

if(index=minservetime(L_ready,running))

{

fprintf(fout,"-----------time: %3d-----------\n选择执行的进程为:%s\n\n",time, );

free=false; //选择等待时间最久的进程

}

if(!free)

{

running。
  function; //运行等待时间最久的进程

talrun++;

L_ready。Traverse(addwaittime);

if( talrun>= rvetime)

{

//进程任务完成

L_ready。
  Delete(index,running); //把此进程从进程链表中删除

fprintf(fout,"完成进程%s:\n\n", );

free=true;

task--;

}

}

time++;

}

generalize();

fputc('\n',fout);

}

///////////////spn。
  cpp////////////////////////////////

///////////////hrrn。cpp////////////////////////////////

int w_scompare(const PCB &e1,const PCB &e2)

{

if( rvetime==0|| rvetime==0) return ERROR;

if(e1。
  waittime*1。0/ rvetime>e2。waittime*1。0/ rvetime)

return 1;

else

return 0;

}

int maxw_stime(CLink &L_ready,PCB &maxw_s)

{

//用maxw_s返回w与s之比最大的进程

//返回值为此进程在链表中的序号

//若链表为空,返回0

PCB tmp;

int index=0,t;

maxw_s。
  waittime=-1;

maxw_ rvetime=1;

while(t=L_ready。LocateElem(maxw_s,w_scompare,tmp))

{

maxw_s=tmp;

index=t;

}

return index;

}

void hrrn()

{

int time=0; //系统时间

int index;

int tag; //标志是否有新进程进入

int free=true; //CPU忙碌时为false,空闲时为true

PCB running;

CLink L_ready; //就绪进程链表对象

int task=process。
  Length(); //任务数

fprintf(fout,"最高响应比调度策略(HRRN):\n");

while(task) //开始选择和运行进程,直到所有进程运行完毕

{

if(tag=getready(L_ready,time))

{

fprintf(fout,"-----------time: %3d-----------\n",time);

fprintf(fout,"进程名称 到达时间 服务时间\n");

L_ready。
  Traverse(print);

fprintf(fout,"\n");

}

if(free) //当前没有任务,CPU空闲

if(index=maxw_stime(L_ready,running))

{

fprintf(fout,"-----------time: %3d-----------\n选择执行的进程为:%s\n\n",time, );

free=false; //选择等待时间最久的进程

}

if(!free)

{

running。
  function; //运行进程

talrun++;

L_ready。Traverse(addwaittime);

if( talrun== rvetime)

{

//进程任务完成

L_ready。
  Delete(index,running); //把此进程从进程链表中删除

fprintf(fout,"完成进程%s:\n\n", );

task--;

free=true;

}

}

time++;

}

generalize();

fputc('\n',fout);

}

///////////////hrrn。
  cpp////////////////////////////////

///////////////主程序main。cpp///////////////////////////

#define FILEERROR -1 //错误号

#define INPUTERROR -2

#define NAMELEN 10 //进程名最大长度

#define BASEID 100 //进程ID号分配基值

#include

#include

#include

#include "Link。
  cpp" //链表类模板定义

#include "LinkQueue。cpp" //队列类模板定义

class PCB

{

public:

int ID; //每个ID号唯一标识一个进程

char name[NAMELEN]; //进程名称

int arrivetime; //进程到达时间

int servetime; //进程服务时间

int waittime; //已等待时间

int totalrun; //总运行时间

int finishtime; //运行完成时间

void (*function)(); //运行程序指针

int operator ==(const PCB &pcb0)

{

if(ID==pcb0。
  ID) return true;

else return false;

}

int operator !=(const PCB &pcb0)

{

if(ID!=pcb0。ID) return true;

else return false;

}

}; //PCB进程控制块

FILE *fin,*fout; //输入输出文件

CLink process; //要运行的进程,以链表形式

int task; //要运行的进程数

void run() //运行进程

{

}

int arrivetimecmp(const PCB &e1,const PCB &e2)

{

if( rivetime== rivetime&&e1。
  ID!=e2。ID)

return true;

return false;

}

int addwaittime(PCB &e)

{

e。waittime++;

return OK;

}

int getready(CLink &L_ready,int time)

{

//找出process链表中到达时间为time的PCB挂到L_ready链表

//若有新进程进入就绪队列,返回值tag为true,否则为false

int tag=false;

PCB tmp0,tmp;

rivetime=time;

while(process。
  LocateElem(tmp0,arrivetimecmp,tmp))

{

L_ready。Append(tmp);

tmp0=tmp;

tag=true;

}

return tag;

}

int print(PCB &toprint) //打印进程信息

{

fprintf(fout,"%-10s%-10d%-10d\n", , rivetime, rvetime);

return OK;

}

void generalize()

{

PCB toprint;

int i,Tr_total=0,task=process。
  Length();

double Trs_total=0;

fprintf(fout,"%10s%10s%10s%10s%10s%10s\n","进程名称","到达时间","服务时间","完成时间","周转时间","带权周转");

for(i=1;i>choice;

if(choice=='y'||choice=='Y')

{

fin=fopen("input。
  txt","r"); //读方式打开文件

if(!fin) errordeal(FILEERROR);

fgets(buf,sizeof(buf),fin); //接收输入

while(!feof(fin)) //接收进程信息,检验数据有效性并送入链表

{

if(getinfo(buf,tmp)==OK)

{

process。
  Append(tmp); //入链表

tmp。ID++;

}

else errordeal(INPUTERROR);

fgets(buf,sizeof(buf),fin);

}

}

else

{

fin=fopen("input。
  txt","w"); //写方式打开文件

if(!fin) errordeal(FILEERROR);

printf("请按到达时间顺序依次输入进程名称、到达时间和服务时间:\n");

printf("(以空格为分隔,每行一个进程,进程名不超过%d个字符,结束输入请在行首键入\\字符)\n",NAMELEN);

fgets(buf,sizeof(buf),stdin); //接收输入

while(buf[0]!='\\') //接收进程信息,检验数据有效性并送入链表

{

fputs(buf,fin);

if(getinfo(buf,tmp)==OK)

{

process。
  Append(tmp); //入链表

tmp。ID++;

}

else errordeal(INPUTERROR);

fgets(buf,sizeof(buf),stdin);

}

}

fclose(fin);

if(process。
  Empty()) printf("不存在有效的进程信息!程序中止!\n");

else

{

fout=fopen("output。txt","w");

fprintf(fout,"输入进程信息:\n");

fprintf(fout,"进程名称 到达时间 服务时间\n");

process。
  Traverse(print);

fputc('\n',fout);

printf("进程信息接收完毕!接着请选择CPU调度策略(输入序号):\n");

printf("1。 先来先服务(FCFS)\n2。 循环\n3。 最短进程Next(SPN)\n");

printf("4。
   最短剩余时间(SRT)\n5。 最高响应比(HRRN)\n6。
   退出\n");

cin>>choice;

while(choice'6')

{

errordeal(INPUTERROR); //错误处理函数

choice=fgetc(stdin);

fgetc(stdin);

}

while(choice!='6')

{

switch(choice)

{

case '1':

fcfs();

break;

case '2':

printf("请输入循环时间的长度:");

cin>>q;

circulate(q);

break;

case '3':

spn();

break;

case '4':

srt();

brea。

本文标签:调度进程作业

原文链接:https://www.xgfox.com/alpx/305.html

本文版权:如无特别标注,本站文章均为原创。