Пример #1
0
 const NavNode& NavPath::popFront()
 {
     const NavNode& node = peekFront();
     mNodes.pop_front();
     return node;
 }
void roundRobin(int map[N][5],int proc_count,char filename[])
{
	QUEUE q;
	int cur_time=0;
	int new_proc[N];
	int i,k,quantum_used,p,temp,c,cpu_util=0;
	int blocked[N]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
	int turn_around[N];
	int proc_added=0;
	q.rear=q.front=-1;
	
	FILE *fp=fopen(filename,"w");
	fclose(fp);
	
	while(1)
	{
		int process_state[N]={0};		
		k=0;
		for(i=0;i<proc_count;i++)
		{
			if(cur_time==map[i][3])
			{
				new_proc[k++]=i;
				proc_added++;
			}
		}
		
		for(i=0;i<proc_count;i++)
		{
			if(blocked[i]==cur_time)
			{
				new_proc[k++]=i;
				blocked[i]=-1;
			}
		}
		
		sort_proc(new_proc,k);
		
		for(i=0;i<k;i++)
			insertQ(&q,new_proc[i]);
		
		if(q.rear!=q.front)
		{
			p=peekFront(q);
			process_state[p]=1;
			cpu_util++;
			quantum_used=(quantum_used+1)%2;
			map[p][4]++;
			
			if(map[p][4]==map[p][1])
			{
				removeQ(&q);
				quantum_used=0;
				turn_around[p]=cur_time;
			}
			if(quantum_used==0 && map[p][4]!=map[p][1] && map[p][4]!=(map[p][1])/2)
			{
				p=removeQ(&q);
				quantum_used=0;
				insertQ(&q,p);
			}
			
			if(map[p][4]==(map[p][1])/2)
			{
				p=removeQ(&q);
				quantum_used=0;
				blocked[p]=map[p][2]+cur_time+1;
			}
		}
			
		temp=q.front;
		while(temp!=q.rear)
		{
			temp=(temp+1)%N;
			if(q.arr[temp]!=p)
				process_state[q.arr[temp]]=2;
		}
		for(i=0;i<proc_count;i++)	
		{
			if(blocked[i]!=-1 && i!=p)
			{
				process_state[i]=3;
			}
		}	
		
		printProcessStateToFile(filename,process_state,proc_count,cur_time);
		
		c=checkBlocked(blocked,proc_count);
			
		if(q.front==q.rear && c && proc_added==proc_count)
			break;
		
		cur_time++;
		p=-1;
	}
	fp=fopen(filename,"a");
	fprintf(fp,"\n");
	fprintf(fp,"Finishing Time : %d\n",cur_time);
	fprintf(fp,"CPU utilization : %3.2f\n",(float)cpu_util/(cur_time+1));
	for(i=0;i<proc_count;i++)
	{
		temp=turn_around[i]-map[i][3]+1;
		fprintf(fp,"Turnaround process %d : %d\n",i,temp);
	}			
	fclose(fp);
}