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