在多道程式設計系統中,記憶體中有多道程式運行,他們相互爭奪處理機這一重要的資源。處理機調度就是從就緒佇列中,按照一定的算法選擇一個進程並將處理機分配給它運行,以實現進程並發地執行。
基本介紹
- 中文名:處理機調度
- 釋義:照算法選擇進程並將處理機分配
- 目的:實現進程並發地執行
- 功能:記住進程的狀態等
- 性能準則:不同的調度算法
- 因素:CPU利用率等
功能
性能準則
調度算法
先來先服務調度算法(FCFS)
短作業優先調度算法
優先權調度算法
基於時間片的輪轉調度算法
算法的實現
#include<iostream>#include<string>usingnamespacestd;#defineMAXSIZE10structPCB{intname;//進程名intpriority;//進程優先數inttime;//進程執行時間};structQueue_Process{PCBdata[MAXSIZE];//PCB佇列intfront;//隊首intrear;//隊尾};voidInitQueue(Queue_Process*Q){Q->front=Q->rear=0;}boolIsQueueEmpty(Queue_ProcessQ)//隊空判斷函式{return(Q.front==Q.rear)?true:false;}boolIsQueueFull(Queue_ProcessQ)//隊滿判斷函式{return(Q.front==(Q.rear+1)%MAXSIZE)?true:false;}voidEnQueue(Queue_Process*Q,PCBx)//入隊函式{if(IsQueueFull(*Q))//判斷佇列是否為滿{cout<<"隊滿,入隊操作失敗!"<<endl;exit(0);}//佇列非滿,將PCB入隊,將其中信息填入Q->data[Q->rear].name=x.name;Q->data[Q->rear].priority=x.priority;Q->data[Q->rear].time=x.time;Q->rear=(Q->rear+1)%MAXSIZE;//佇列隊尾指針後移}voidDeleQueue(Queue_Process*Q){if(IsQueueEmpty(*Q))//判斷佇列是否為空{cout<<"隊空,出隊操作失敗!"<<endl;exit(0);}Q->front=(Q->front+1)%MAXSIZE;//將佇列首指針後移}voidSortPCB(PCB*pcb,intn)//PCB優先數大小從大到小排列函式{PCBtemp;boolexchange=true;//交換標誌for(inti=n-1;i>0&&exchange;i--)//冒泡排序算法排序{exchange=false;for(intj=0;j<i;j++){if(pcb[j].priority<pcb[j+1].priority)//交換PCB中的數據{temp.name=pcb[j].name;temp.priority=pcb[j].priority;temp.time=pcb[j].time;pcb[j].name=pcb[j+1].name;pcb[j].priority=pcb[j+1].priority;pcb[j].time=pcb[j+1].time;pcb[j+1].name=temp.name;pcb[j+1].priority=temp.priority;pcb[j+1].time=temp.time;exchange=true;}}}}voidInput(PCB*pcb,intn)//進程信息輸入函式{cout<<"請輸入每個進程的優先數和執行時間:"<<endl;intp,t;for(inti=0;i<n;i++)//輸入每個進程的優先數和執行時間{cin>>p>>t;pcb[i].name=i;pcb[i].priority=p;pcb[i].time=t;}}voidDisplay(Queue_Process*queue)//輸出每個時刻的進程運行情況函式{cout<<"進程名\t"<<"優先數\t"<<"執行時間\t"<<"進程狀態"<<endl;do{if(queue->data[queue->front].time>1){cout<<""<<queue->data[queue->front].name<<"\t"<<""<<queue->data[queue->front].priority<<"\t\t"<<""<<queue->data[queue->front].time<<"\t\t"<<"執行中..."<<endl;queue->data[queue->front].priority-=1;queue->data[queue->front].time-=1;for(inti=1;i<queue->rear-queue->front;i++)cout<<""<<queue->data[queue->front+i].name<<"\t"<<""<<queue->data[queue->front+i].priority<<"\t\t"<<""<<queue->data[queue->front+i].time<<"\t\t"<<"等待中..."<<endl;cout<<endl<<endl;}else{cout<<""<<queue->data[queue->front].name<<"\t"<<""<<queue->data[queue->front].priority<<"\t\t"<<""<<queue->data[queue->front].time<<"\t\t"<<"執行中..."<<endl;for(inti=1;i<queue->rear-queue->front;i++)cout<<""<<queue->data[queue->front+i].name<<"\t"<<""<<queue->data[queue->front+i].priority<<"\t\t"<<""<<queue->data[queue->front+i].time<<"\t\t"<<"等待中..."<<endl;cout<<"進程"<<queue->data[queue->front].name<<"執行完畢!"<<endl<<endl<<endl;DeleQueue(queue);}SortPCB(queue->data,queue->rear-queue->front);//對佇列中的優先數進程重新排序}while(!IsQueueEmpty(*queue));}voidmain(){PCBprocess[MAXSIZE-1];//進程數組Queue_Processqueue;//進程佇列intnum;//要輸入的進程數cout<<"請輸入進程同步數num:"<<endl;cin>>num;InitQueue(&queue);//初始化佇列Input(process,num);for(inti=0;i<num;i++)//通過循環使每個進程入隊{EnQueue(&queue,process[i]);}SortPCB(queue.data,queue.rear-queue.front);//對進程按優先數從大到小排列cout<<endl<<"\t\t進程執行情況:"<<endl;Display(&queue);//進程運行函式}