C语言模拟实现(一)----- 优先权抢占式时间片调度算法
生活随笔
收集整理的這篇文章主要介紹了
C语言模拟实现(一)----- 优先权抢占式时间片调度算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
搶占式優(yōu)先權(quán)調(diào)度算法?
特點:每次把處理機(jī)分配給優(yōu)先權(quán)最高的進(jìn)程,在一個時間片內(nèi),但在執(zhí)行期間,只要出現(xiàn)另一個優(yōu)先權(quán)更高的進(jìn)程,則進(jìn)程調(diào)度程序就立即停止當(dāng)前進(jìn)程的執(zhí)行,并將處理機(jī)分配給新到的優(yōu)先權(quán)最高的進(jìn)程 。
注意:只要系統(tǒng)中出現(xiàn)一個新的就緒進(jìn)程,就進(jìn)行優(yōu)先權(quán)比較?
該調(diào)度算法,能更好地滿足緊迫作業(yè)的要求,故而常用于要求比較嚴(yán)格的實時系統(tǒng)中,以及對性能要求較高的批處理和分時系統(tǒng)中
算法流程圖
代碼實現(xiàn)
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define TIME 2 //定義一個時間片 typedef struct pcb {char name[10];int status;//運行態(tài)(1)、就緒態(tài)(0)int priority;int times; }pcb; typedef pcb ElemType; typedef struct node {ElemType data;//data表示pcb結(jié)構(gòu)體struct node* next; }PCB; //定義隊列 typedef struct linkquene {PCB *front;PCB *rear; }LinkQuene; //初始化pcb隊列 void initPcbQuene(LinkQuene *pcbquene){pcbquene->front = pcbquene->rear = (PCB*)malloc(sizeof(PCB));if(!pcbquene->front){printf("申請失敗");}pcbquene->front->next = NULL; }//錄入進(jìn)程信息 void InputProInfo(int n,LinkQuene *pcbquene){//要錄入的進(jìn)程數(shù)PCB *pt = NULL;int i=0;for(i =0;i<n;i++){pt = (PCB*)malloc(sizeof(PCB));printf("請輸入%d號進(jìn)程的相關(guān)信息\n",i+1);printf("名稱:");scanf("%s",pt->data.name);pt->data.status = 0;//初始化都為就緒態(tài)printf("優(yōu)先數(shù):");scanf("%d",&pt->data.priority);printf("運行時間:");scanf("%d",&pt->data.times);//進(jìn)隊列操作pt->next = NULL;pcbquene->rear->next = pt;pcbquene->rear = pt;} } //根據(jù)優(yōu)先級排序 void sortProcess(LinkQuene *pcbquene){PCB *head = pcbquene->front;PCB *temp=NULL;PCB *p = NULL;ElemType t;//中間變量for(temp = head->next;temp->next != NULL;temp =temp->next){for(p = head->next;p->next != NULL;p=p->next){if(p->data.priority < p->next->data.priority){t= p->data;p->data = p->next->data;p->next->data = t;}}} }//打印進(jìn)程相關(guān)信息 void printProcess(LinkQuene *pcbquene){PCB *pt = pcbquene->front; // if(pcbquene->front->next == pcbquene->rear){ // pcbquene->front == pcbquene->rear; // }if(pcbquene->front == pcbquene->rear){printf("就緒隊列為空");}else{printf("-------------------\n");printf("就緒隊列\(zhòng)n");printf("名稱 運行狀態(tài) 優(yōu)先級 剩余運行時間\n");while(pt->next != NULL){if(pt->next->data.status == 1){//正在運行的進(jìn)程printf("%3s 運行態(tài) %7d %7d\n",pt->next->data.name,pt->next->data.priority,pt->next->data.times);}else if(pt->next->data.status == 0){//就緒隊列中等待著的進(jìn)程printf("%3s 就緒態(tài) %7d %7d\n",pt->next->data.name,pt->next->data.priority,pt->next->data.times);}pt = pt->next;}printf("-------------------\n");} }//遍歷隊列 int Traversal(LinkQuene *pcbquene){int i=0;PCB *pt = pcbquene->front;while(pt->next!=NULL){ // printf("%s",pt->next->data.name);i++;pt = pt->next;}return i; }//運行函數(shù)(修改優(yōu)先級,將隊首元素插入至隊尾) void run(LinkQuene *pcbquene){PCB *pt = pcbquene->front->next;//隊首進(jìn)程出隊列ElemType tmp;if(pcbquene->front == pcbquene->rear){return;}tmp = pt->data;pcbquene->front->next = pt->next;//修改狀態(tài)為運行態(tài)tmp.status = 1;tmp.priority-=2;if(tmp.times-2 <= 0){printf("進(jìn)程名稱:%s 狀態(tài):運行態(tài) 優(yōu)先級%d 剩余運行時間%d\n",tmp.name,tmp.priority,0);}else{printf("進(jìn)程名稱:%s 狀態(tài):運行態(tài) 優(yōu)先級%d 剩余運行時間%d\n",tmp.name,tmp.priority,tmp.times-2);}if(tmp.times <= 2){//如果當(dāng)前進(jìn)程的運行時間小于一個時間片printf("%s運行結(jié)束!\n",tmp.name);if(Traversal(pcbquene) != 0){printProcess(pcbquene);}}else{//大于時間片tmp.times-=TIME;tmp.status = 0;printProcess(pcbquene);//出去的進(jìn)程入隊列至隊尾PCB* curpt = (PCB*)malloc(sizeof(PCB));if(curpt){curpt->data = tmp;curpt->next=NULL;pcbquene->rear->next = curpt;pcbquene->rear = curpt;}else{exit(0);}sortProcess(pcbquene);} }int main() {LinkQuene pcbquene;initPcbQuene(&pcbquene);int n;printf("輸入進(jìn)程數(shù):");scanf("%d",&n);InputProInfo(n,&pcbquene);sortProcess(&pcbquene); // Traversal(&pcbquene);printProcess(&pcbquene);while(pcbquene.rear != pcbquene.front){run(&pcbquene);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的C语言模拟实现(一)----- 优先权抢占式时间片调度算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: To B业务如何获取客户?
- 下一篇: SaaS 转化 3 步曲:让用户变客户