📄 123.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 + -