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

📄 program.txt

📁 先来先服务的调度算法
💻 TXT
字号:
void FinFout()      //先来先服务算法
{
	QueueReady ready;
	QueueBlock block;
	int n;
	cout<<"输入演示的进程个数:";
	cin>>n;
	srand((unsigned)time(NULL));  //先产生一系列随机数,然后为每一个进程的数据成员赋值
	for(int i=1;i<=n;i++)
	{
		PCB *p=new PCB(i);
		p->cpunumber=0;
		p->io=int (rand()%10*0.2);
		p->iofinish=0;                          //io=0 1
		p->iotime=int(rand()%10*0.4)+2;         //iotime=2 3 4 5 
		p->n=0;
		p->priority=0;
		p->weight=0;
		p->slicenumber=1;   
		int k=int(rand()%10*0.3)+3;             //k=3 4 5
		p->totalnumber=k*(p->slicenumber);      //totalnumber=3~5倍slicenumber
		p->when=int(float(rand()%10*0.1)*k)+1;  //when=1 2 3...k
        ready.Enqueue(p);
	}
	ready.output(1);
	PCB *process;                               //当前运行进程
	while(ready.Isempty()==0||block.Isempty()==0)
	{
		if(ready.Isempty()==0)                  //检查就绪队列是否为空
		{
			process=ready.Getfront(1);
			cout<<"进程"<<process->name<<"开始运行"<<endl<<endl;	
			for(int i=process->n+1;i<=process->totalnumber&&process->cpunumber<=process->totalnumber;i++)  
			{
				Time(1);                    //运行一个时间片
				process->n=i;
				process->cpunumber++;
				if(block.Isempty()==0)            //考察阻塞队列中是否有IO完成的进程
				{
					block.addiofinish();
					while(block.Isempty()==0&&block.Isfinish()==1)   
					{ 
						PCB *p=block.Getfinish();              
						if(p->cpunumber<p->totalnumber)
						{
							ready.Enqueue(p);
							cout<<"进程"<<p->name<<"完成IO请求,入就绪队列"<<endl<<endl;
						}
						else
							cout<<"进程"<<p->name<<"已完成IO,并且整个进程均已完成."<<endl<<endl;

					}
				}
				if(process->io==1&&i==process->when)		//处理当前进程
				{
					block.Enqueue(process);                              //判断当前进程是否有IO请求	
					cout<<"进程"<<process->name<<"有IO请求,入阻塞队列"<<endl<<endl;
					break;
				}
				if(process->cpunumber==process->totalnumber)			
					cout<<"进程"<<process->name<<"已完成."<<endl<<endl;
			}
			
		
			block.addiofinish(); 	
			while(block.Isempty()==0&&block.Isfinish()==1)   //如果有完成IO的进程
			{ 
				PCB *p=block.Getfinish();
				if(p->cpunumber<p->totalnumber)
				{	ready.Enqueue(p);
				    cout<<"进程"<<p->name<<"完成IO请求,入就绪队列"<<endl<<endl;
				}
				else cout<<"进程"<<p->name<<"已完成IO,并且整个进程已完成."<<endl<<endl;
			}
	
		} 		
		else                                                 //如就绪队列已空,只处理阻塞队列
		{
			Time(1);                                    //运行一个时间片		
			block.addiofinish(); 	
			while(block.Isempty()==0&&block.Isfinish()==1)   //如果有完成IO的进程
			{ 
				PCB *p=block.Getfinish();
				if(p->cpunumber<p->totalnumber)
				{	ready.Enqueue(p);
				    cout<<"进程"<<p->name<<"完成IO请求,入就绪队列"<<endl<<endl;
				}
				else cout<<"进程"<<p->name<<"已完成IO,并且整个进程均已完成."<<endl<<endl;
			}
		}
	}
}

⌨️ 快捷键说明

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