www.pudn.com > os.rar > TimeSlice.cpp


#include  
#include"TimeSlice.h" 
using namespace std; 
 
bool TimeSlice::RR_Run(LinkQueue& Q,QueueNode* q, QueueNode* p, const int Round,int& currentTime,PCBNode * ProcessTable) 
{ 
	ProcessTable[q->GetID()].Setstatus(RUN);//进程正在运行 
	cout<<"进程"<GetID()<<"获得时间片,正在运行......"<GetID()].GetremainTime() <= Round)//在此时间片内能够做完,之后退出进程调度 
    { 
        ProcessTable[q->GetID()].SetfinishTime(currentTime + ProcessTable[q->GetID()].GetremainTime())  ; 
        ProcessTable[q->GetID()].SettotalTime(ProcessTable[q->GetID()].GettotalTime()+ProcessTable[q->GetID()].GetremainTime()) ; 
        ProcessTable[q->GetID()].SetweightTotalTime(ProcessTable[q->GetID()].GettotalTime()/ProcessTable[q->GetID()].GetreqTime())  ;  
 
		currentTime = ProcessTable[q->GetID()].GetfinishTime(); 
		p->Setnext(q->GetnextQNode()); 
	 
		ProcessTable[q->GetID()].Setstatus(FINISH);//进程完成标志 
 
		 cout<GetID()<<"完成!"<GetID()].SetremainTime(ProcessTable[q->GetID()].GetremainTime() - Round); 
        ProcessTable[q->GetID()].SettotalTime (Round+ProcessTable[q->GetID()].GettotalTime()); 
        currentTime += Round; 
        ProcessTable[q->GetID()].Setstatus(READY);//进程为执行完,变为就绪 
		//cout<GetID()<<"时间片到变为就绪"<GetnextQNode(); 
	while (q != NULL)//从队首开始依次分配时间片    q:当前进程  r:下一个进程 
	{ 
		do 
        {         
            cout<<"**********************"<GetID()<GetID()<<" 现在需要的时间为:  "<GetID()].GetremainTime()<GetID()<<"时间片到变为就绪"<GetnextQNode() == NULL)  
                { 
					r = Q.head->GetnextQNode(); 
                } 
                else 
                { 
                    r = q->GetnextQNode(); 
                } 
 
				Q.ShowQueue(q,ProcessTable,currentTime);//显示就绪队列 
            } 
            else //否则计算周转时间和带权周转时间 
            { 
                totalTimeSum += ProcessTable[q->GetID()].GettotalTime(); 
                weightTotalTimeSum += ProcessTable[q->GetID()].GetweightTotalTime(); 
 
				flag=q->GetnextQNode(); 
                delete q; //从队列中删除q进程 
                q = p; 
				//Q.ShowQueue(flag,true,ProcessTable,currentTime);//................................................................... 
            } 
 
       }while (!finish &&  (ProcessTable[r->GetID()].GetarriveTime() > currentTime + Round)); 
        //当前进程还为执行完且下一个进程很晚才来,则继续给当前进程分配时间片 
		//否则都轮转 
 
		p = q; 
		q = q->GetnextQNode(); 
		if(q!=NULL) 
		{ 
			currentTime=ProcessTable[q->GetID()].GetarriveTime();//..................................................................... 
			//cout<<"当前时间currentTime: "<GetnextQNode()!=NULL) 
        { 
            p = Q.head; 
			q = p->GetnextQNode(); 
        }  
 
		//Q.ShowQueue();//当前就绪队列中进程/////////////////////////////////////////////////////// 
    }  
 
	//Q.ShowQueue();//当前就绪队列中进程/////////////////////////////// 
 
    delete Q.head; 
    Q.head=NULL; 
 
}