C++先来先服务算法.docx
《C++先来先服务算法.docx》由会员分享,可在线阅读,更多相关《C++先来先服务算法.docx(15页珍藏版)》请在冰豆网上搜索。
C++先来先服务算法
//stdafx.h:
includefileforstandardsystemincludefiles,
//orprojectspecificincludefilesthatareusedfrequently,but
//arechangedinfrequently
//
#if!
defined(AFX_STDAFX_H__57C8F7A3_80F8_4D89_8FF4_83D8673D5B32__INCLUDED_)
#defineAFX_STDAFX_H__57C8F7A3_80F8_4D89_8FF4_83D8673D5B32__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
//TODO:
referenceadditionalheadersyourprogramrequireshere
//{{AFX_INSERT_LOCATION}}
//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.
#endif//!
defined(AFX_STDAFX_H__57C8F7A3_80F8_4D89_8FF4_83D8673D5B32__INCLUDED_)
//先来先服务.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"windows.h"
#include
#include
#include
#include
#include
#include
voidCreate_ProcInfo();//建立进程调度需要的数据
voidDisplay_ProcInfo();//显示当前系统全部进程的状态
voidScheduler_FF();
voidCpu_Sched();
voidIO_Sched();
voidNextRunProcess();
voidDisData();
voidDisResult();
intRunPoint;//运行进程指针,-1时为没有运行进程
intWaitPoint;//阻塞队列指针,-1时为没有阻塞进程
intReadyPoint;//就绪队列指针,-1时为没有就绪进程
longClockNumber;//系统时钟
intProcNumber;//系统中模拟产生的进程总数
intFinishedProc;//系统中模拟产生的进程总数
//进程信息结构
structProcStruct
{
intp_pid;//进程的标识号
charp_state;//进程的状态,C--运行R--就绪W--组塞B--后备F--完成
intp_rserial[16];//模拟的进程执行的CPU和I/O时间数据序列,间隔存储,0项存储有效项数
intp_pos;//当前进程运行到的序列位置
intp_starttime;//进程建立时间
intp_endtime;//进程运行结束时间
intp_cputime;//当前运行时间段进程剩余的需要运行时间
intp_iotime;//当前I/O时间段进程剩余的I/O时间
intp_next;//进程控制块的链接指针
}proc[10];
////////////////////////////////////////////////////////////////////////////
//
//随机生成进程数量和每个CPU--I/O时间数据序列,进程数量控制在5到10之间,//
//数据序列控制在6到12之间,CPU和I/O的时间数据值在5到15的范围//
//
////////////////////////////////////////////////////////////////////////////
voidCreate_ProcInfo(void)
{
ints,i,j;
srand(GetTickCount());//初始化随机数队列的"种子"
ProcNumber=((float)rand()/32767)*5+5;//随机产生进程数量5~10
FinishedProc=0;
for(i=0;i{
proc[i].p_pid=((float)rand()/32767)*1000;
proc[i].p_state='B';//初始都为后备状态
s=((float)rand()/32767)*6+6;//产生的进程数据序列长度在6~12间
proc[i].p_rserial[0]=s;//第一项用于记录序列的长度
for(j=1;j<=s;j++)//生成时间数据序列,数值在10~30间
proc[i].p_rserial[j]=((float)rand()/32767)*10+5;
//赋其他字段的值
proc[i].p_pos=1;
proc[i].p_starttime=((float)rand()/32767)*49+1;
proc[i].p_endtime=0;
proc[i].p_cputime=proc[i].p_rserial[1];
proc[i].p_iotime=proc[i].p_rserial[2];
proc[i].p_next=-1;
}
printf("\n---------------------------\n建立了%2d个进程数据序列\n\n",ProcNumber);
DisData();
printf("\nPressAnyKeyToContinue.......");
_getch();
return;
}
////////////////////////////////////////////////////////////////////////
//显示系统当前状态
////////////////////////////////////////////////////////////////////////
voidDisplay_ProcInfo(void)
{inti,n;
system("cls");
printf("\n当前系统模拟%2d个进程的运行时钟:
%ld\n\n",ProcNumber,ClockNumber);
printf("就绪指针=%d,运行指针=%d,阻塞指针=%d\n",ReadyPoint,RunPoint,WaitPoint);
if(RunPoint!
=-1)
{
printf("当前运行的进程No.%dID:
%d\n",RunPoint,proc[RunPoint].p_pid);
printf("%6d,%6d,%6d\n",proc[RunPoint].p_starttime,proc[RunPoint].p_rserial[proc[RunPoint].p_pos],proc[RunPoint].p_cputime);
}
else
printf("当前运行的进程ID:
NoProcessRunning!
\n");
n=ReadyPoint;
printf("\nReadyProcess......\n");
while(n!
=-1)//显示就绪进程信息
{
printf("No.%dID:
%5d,%6d,%6d,%6d\n",n,proc[n].p_pid,proc[n].p_starttime,proc[n].p_rserial[proc[n].p_pos],proc[n].p_cputime);
n=proc[n].p_next;
}
n=WaitPoint;
printf("\nWaitingProcess......\n");
while(n!
=-1)//显示阻塞进程信息
{
printf("No.%dID:
%5d,%6d,%6d,%6d\n",n,proc[n].p_pid,proc[n].p_starttime,proc[n].p_rserial[proc[n].p_pos],proc[n].p_iotime);
n=proc[n].p_next;
}
printf("\n===================后备进程====================\n");
for(i=0;iif(proc[i].p_state=='B')
printf("No.%dID:
%5d,%6d\n",i,proc[i].p_pid,proc[i].p_starttime);
printf("\n================已经完成的进程=================\n");
for(i=0;iif(proc[i].p_state=='F')
printf("No.%dID:
%5d,%6d,%6d\n",i,proc[i].p_pid,proc[i].p_starttime,proc[i].p_endtime);
//printf("\n指针状态........\n");
//printf("就绪队列指针=%d,运行指针=%d,阻塞队列指针=%d\n",ReadyPoint,RunPoint,WaitPoint);
}
////////////////////////////////////////////////////////////////////////
//显示模拟执行的结果
////////////////////////////////////////////////////////////////////////
voidDisResult(void)
{inti,j;
printf("\n---------------------------------\n");
for(i=0;i{
printf("ID=%4d>%2d",proc[i].p_pid,proc[i].p_rserial[0]);
printf("%4d,%4d",proc[i].p_starttime,proc[i].p_endtime);
printf("\n");
}
}
////////////////////////////////////////////////////////////////////////
//显示进程数据序列
////////////////////////////////////////////////////////////////////////
voidDisData(void)
{inti,j;
for(i=0;i{
printf("ID=%4d%2d>",proc[i].p_pid,proc[i].p_rserial[0]);
for(j=1;j<=proc[i].p_rserial[0];j++)
printf("%4d",proc[i].p_rserial[j]);
printf("\n");
}
}
////////////////////////////////////////////////////////////////////////
//选择下一个可以运行的进程
////////////////////////////////////////////////////////////////////////
voidNextRunProcess(void)
{
if(ReadyPoint==-1){RunPoint=-1;return;}//就绪队列也没有等待的进程
proc[ReadyPoint].p_state='C';
RunPoint=ReadyPoint;
proc[ReadyPoint].p_cputime=proc[ReadyPoint].p_rserial[proc[ReadyPoint].p_pos];
ReadyPoint=proc[ReadyPoint].p_next;
proc[RunPoint].p_next=-1;
}
////////////////////////////////////////////////////////////////////////
//CPU调度
////////////////////////////////////////////////////////////////////////
voidCpu_Sched(void)
{
intn;
if(RunPoint==-1)//没有进程在CPU上执行
{NextRunProcess();return;}
proc[RunPoint].p_cputime--;//进程CPU执行时间减少1个时钟单位
if(proc[RunPoint].p_cputime>0)return;
//{printf("\nRunPoint=%d,ctime=%d",RunPoint,proc[RunPoint].p_cputime);getchar();return;}
//进程完成本次CPU后的处理
if(proc[RunPoint].p_rserial[0]==proc[RunPoint].p_pos)//进程全部序列执行完成
{
FinishedProc++;
proc[RunPoint].p_state='F';
proc[RunPoint].p_endtime=ClockNumber;
RunPoint=-1;//无进程执行
NextRunProcess();
}
else//进行IO操作,进入阻塞队列
{
proc[RunPoint].p_pos++;
proc[RunPoint].p_state='W';
proc[RunPoint].p_iotime=proc[RunPoint].p_rserial[proc[RunPoint].p_pos];
n=WaitPoint;
if(n==-1)//是阻塞队列第一个I/O进程
WaitPoint=RunPoint;
else
{do//放入阻塞队列第尾
{
if(proc[n].p_next==-1)
{proc[n].p_next=RunPoint;
break;
}
n=proc[n].p_next;
}while(n!
=-1);
}
RunPoint=-1;
NextRunProcess();
}
return;
}
////////////////////////////////////////////////////////////////////////
//I/O调度
////////////////////////////////////////////////////////////////////////
voidIO_Sched(void)
{
intn,bk;
if(WaitPoint==-1)return;//没有等待I/O的进程,直接返回
proc[WaitPoint].p_iotime--;//进行1个时钟的I/O时间
if(proc[WaitPoint].p_iotime>0)return;//还没有完成本次I/O
//进程的I/O完成处理
if(proc[WaitPoint].p_rserial[0]==proc[WaitPoint].p_pos)//进程全部任务执行完成
{
FinishedProc++;
proc[WaitPoint].p_endtime=ClockNumber;
proc[WaitPoint].p_state='F';
if(proc[WaitPoint].p_next==-1)
{WaitPoint=-1;return;}
else//调度下一个进程进行I/O操作
{
n=proc[WaitPoint].p_next;
proc[WaitPoint].p_next=-1;
WaitPoint=n;
proc[WaitPoint].p_iotime=proc[WaitPoint].p_rserial[proc[WaitPoint].p_pos];
return;
}
}
else//进行下次CPU操作,进就绪队列
{
bk=WaitPoint;
WaitPoint=proc[WaitPoint].p_next;
proc[bk].p_pos++;
proc[bk].p_state='R';//进程状态为就绪
proc[bk].p_next=-1;
n=ReadyPoint;
if(n==-1)//是就绪队列的第一个进程
{ReadyPoint=bk;return;}
else
{do
{
if(proc[n].p_next==-1){proc[n].p_next=bk;break;}
n=proc[n].p_next;
}
while(n!
=-1);
}
}
return;
}
////////////////////////////////////////////////////////////////////////
//检查是否有新进程到达,有则放入就绪队列
////////////////////////////////////////////////////////////////////////
voidNewReadyProc(void)
{
inti,n;
for(i=0;i{
if(proc[i].p_starttime==ClockNumber)//进程进入时间达到系统时间
{
proc[i].p_state=='R';
proc[i].p_next=-1;
if(ReadyPoint==-1)//就绪队列无进程
ReadyPoint=i;
else//就绪队列有进程,放入队列尾
{
n=ReadyPoint;
while(proc[n].p_next!
=-1)n=proc[n].p_next;
proc[n].p_next=i;
}
}
}//for
return;
}
////////////////////////////////////////////////////////////////////////
//调度模拟算法
////////////////////////////////////////////////////////////////////////
voidScheduler_FF(void)
{
intn,count,pstate;
if(ProcNumber==0)
{printf("必须首先建立进程调度数据!
\n");
system("cls");return;
}
ClockNumber=0;//时钟开始计时,开始调度模拟
while(FinishedProc{
ClockNumber++;//时钟前进1个单位
NewReadyProc();//判别新进程是否到达
Cpu_Sched();//CPU调度
IO_Sched();//IO调度
Display_ProcInfo();//显示当前状态
Sleep(500);
}
DisResult();
getch();return;
}
///////////////////////////////////////////////////////////////////
//主函数
///////////////////////////////////////////////////////////////////
intmain(intargc,char*argv[])
{
charch;
RunPoint=-1;//运行进程指针,-1时为没有运行进程
WaitPoint=-1;//阻塞队列指针,-1时为没有阻塞进程
ReadyPoint=-1;//就绪队列指针,-1时为没有就绪进程
ClockNumber=0;//系统时钟
ProcNumber=0;//当前系统中的进程总数
system("cls");
while(true)
{
printf("***********************************\n");
printf("1:
建立进程调度数据序列\n");
printf("2:
执行调度算法\n");
printf("3:
显示调度结果\n");
printf("4:
退出\n");
printf("***********************************\n");
printf("Enteryourchoice(1~4):
");
do{//如果输入信息不正确,继续输入
ch=