C先来先服务算法.docx
- 文档编号:7769320
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:13
- 大小:18.25KB
C先来先服务算法.docx
《C先来先服务算法.docx》由会员分享,可在线阅读,更多相关《C先来先服务算法.docx(13页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 先来先 服务 算法