⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 123.cpp

📁 一个用vc编写的调度算法程序
💻 CPP
字号:
#include<iostream.h>
//int scheduling(int mode);

const int meml=6;//后备队列最大长度。
const int readyl=3;//就绪队列最大长度。
//-------------------------------------------------------------------
//
//      主函数
//
void main(void)
{
	int mode=2;//1:先来先服务,2:短作业优先,3:高优先权优先,4:高响应比优先。
	int mode1=1;//0:非抢占,1:抢占。//1
	int mode2=0;//0:静态优先权,1:动态优先权。//2
	int sa=1,sb=1;//动态优先权变动速率。sa:等待进程优先权上升速率,sb:当前进程优先权下降速率。
	int fnr=0;//当前进程优先级。0为最高。
	int fint=0,fint1=0;//fint:抢占请求标志,1有效,fint1:辅助抢占请求标志,1有效。
	int intnum=0;//中断嵌套计数器。
	int frp=0;//响应比算法启动标志,1有效。
	int stack[meml*3];//堆栈。
	int *pstack=stack;//栈指针。
	int cpu=0;//服务时间计数器。
	int memln=meml;//后备队列实际长度。
	int readyln=0;//就绪队列实际长度。
	int clock;//时钟。
	int i,k;
	int nm[meml],am[meml],bm[meml],cm[meml],dm[meml],em[meml],gm[meml];
	float fm[meml];
	int nr[readyl],ar[readyl],br[readyl],gr[readyl];//g:优先级,
	int *nne=nr,*aae=ar,*bbe=br,*gge=gr;
	int nfd;//进程映射序号。


	if(mode==1||mode==2)
	{
		mode1=0;
		mode2=0;
	}
	if(mode==4)
	{
		mode1=0;
		mode2=1;
		frp=1;
		mode=3;
	}

	for(i=0;i<readyl;i++)
	{
		ar[i]=0;
		br[i]=0;
		nr[i]=0;
		gr[i]=0;
	}	
	for(i=0;i<meml;i++)
	{
		cin>>bm[i];
		if(mode>2)
			cin>>gm[i];
		nm[i]=i;
	}

	for(clock=0;;clock++)
	{
		if(memln&&readyln<readyl)
		{
			am[meml-memln]=clock;
			*aae=am[meml-memln];
			*bbe=bm[meml-memln];
			*nne=nm[meml-memln];
			*gge=gm[meml-memln];
			if(mode==3&&mode1)   //1
				if(*gge<fnr)     //
					fint=1;      //
			aae++;bbe++;nne++;gge++;
			memln--;readyln++;
		}
		if(!cpu||fint)           //1
		{
			if(cpu&&fint)        //1
			{                    //
				*pstack=cpu;     //压栈。
				pstack++;        //
				*pstack=nfd;     //
				pstack++;        //
				*pstack=fnr;     //
				pstack++;        //
				intnum++;        //
			}
			fint=0;              //当cpu不为0,fint为1时(抢占)或cpu为0,fint为1时(
			                     //罕见情况,一个进程执行完毕时正好有一个进程进入就绪队列
			                     //且比挂起队列中进程的优先级高)将fint清0。
			switch(mode)
			{
			case 1:
				k=0;
				break;
			case 2:
				k=0;
				for(i=1;i<readyln;i++)
					if(br[i]<br[k])
						k=i;
				break;
			case 3:
				k=0;
				for(i=1;i<readyln;i++)
					if(gr[i]<gr[k])
						k=i;
				fnr=gr[k];           //1
				break;
//			case 4:
//				k=0;
//				break;
//			case 5:
//				k=0;
//				break;
			}
//			k=scheduling(mode);
			cpu=br[k];
			cm[nr[k]]=clock;
			nfd=nr[k];
			for(;k<readyl-1;k++)
			{
				ar[k]=ar[k+1];
				br[k]=br[k+1];
				nr[k]=nr[k+1];
				gr[k]=gr[k+1];

			}
			aae--;bbe--;nne--;gge--;
			readyln--;
		}

		if(mode2)                                     //2
		{                                             //
			if(mode1)                                 //
				fnr+=sb;                              //
			for(i=0;i<readyln;i++)                    //
			{                                         //
				if(frp)                               //
					gr[i]=(clock-ar[i]+br[i])/br[i];  //
				else                                  //
					gr[i]-=sa;                        //
				if(mode1&&gr[i]<fnr)                  //
					fint=1;                           //
			}
		}
//cout<<"#"<<fnr<<"#"<<gr[0]<<"#"<<readyln<<"#"<<fint<<"#"<<clock<<"#$";
		cpu--;
		if(!cpu)
		{
			dm[nfd]=clock+1;
			if(!fint)                       //1
			{                               //
				pstack--;                   //
				fnr=*pstack;                //
				pstack++;                   //
				k=0;                        //
				for(i=1;i<readyln;i++)      //
					if(gr[i]<gr[k])         //
						k=i;                //
				if(gr[k]<fnr&&readyln)      //
					fint1=1;                //
			}
		}
		if(mode1&&!cpu&&!fint&&intnum&&!fint1)//1
		{                             //
			pstack--;                 //弹栈。
			fnr=*pstack;              //
			pstack--;                 //
			nfd=*pstack;              //
			pstack--;                 //
			cpu=*pstack;              //
			intnum--;                 //
			continue;                 //
		}                             //
		fint1=0;

		if(!memln&&!readyln&&!cpu)
			break;
	}
	for(i=0;i<meml;i++)
	{
		em[i]=dm[i]-am[i];
		fm[i]=(float)em[i]/(float)bm[i];
		cout<<"\n"<<am[i]<<"    "<<bm[i]<<"    "<<cm[i]<<"    "<<dm[i]<<"    "<<em[i]<<"    "<<fm[i];
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -