C先来先服务算法.docx

上传人:b****6 文档编号:7769320 上传时间:2023-01-26 格式:DOCX 页数:13 大小:18.25KB
下载 相关 举报
C先来先服务算法.docx_第1页
第1页 / 共13页
C先来先服务算法.docx_第2页
第2页 / 共13页
C先来先服务算法.docx_第3页
第3页 / 共13页
C先来先服务算法.docx_第4页
第4页 / 共13页
C先来先服务算法.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

C先来先服务算法.docx

《C先来先服务算法.docx》由会员分享,可在线阅读,更多相关《C先来先服务算法.docx(13页珍藏版)》请在冰豆网上搜索。

C先来先服务算法.docx

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;i

if(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;i

if(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=(c

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1