大学操作系统实验-优先级调度算法

 


#include<stdio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
#include <windows.h>
#include<string.h>
 
typedef struct node
{
    char  name[10];    /*进程标识符*/
    int  prio;          /*进程优先数*/
    int  round;        /*进程时间片轮转时间片*/
    int  cputime;       /*进程占用CPU时间*/
    int  needtime;      /*进程到完成还需要的时间*/
    int  count;        /*进程执行计数器*/
    char  state;       /*进程的状态*/
    struct node *next;   /*链指针*/
}PCB;
 
enum Time{
    before = 1,
    after = 0
}Ti;
int T = 4; /*重新选择进程运行的周期(时间片)*/
PCB* RunQueue; /*运行队列*/
PCB* ReadyQueue; /*就绪队列*/
PCB* FinishQueue; /*完成队列*/
int ProcessCount; /*进程个数*/
int finishedCount = 0; /*已经完成的进程个数*/
const int LIMIT = 5000; /*用于计算优先权, Prio = LIMIT - needtime*/
int curTime = 0; /*运行周期次数*/
 
void initQueue();//初始化队列
void freeQueue();//释放队列内存
PCB* createProcess(char* name,int needtime);//创造进程控制快
void pushProcess(PCB *p,int prio);//根据优先级添加在队列里添加进程
void runProcess();//运行一次进程
void runProcessInRunQueue();//运行运行队列里面的进程
void printProcess(PCB *p);//打印进程信息
void printCurrentState(int Time);//打印进程运行之前的状态
void addToQueue(PCB *head ,PCB *p);//往对应的队列里面添加进程
void addToRunQueue(PCB *p);//往运行队列里添加进程
void addToReadyQueue(PCB *p);//往就绪队列里添加进程
void addToFinishQueue(PCB *p);//往完成队列里添加进程
void prioritySelect();//优先级搜索就绪队列添加进运训队列
void Priority();//优先级调度算法
void deleteProcess(PCB *head, PCB *p);//将进程从对应的队列里面删除
 
//初始化队列
void initQueue(){
    RunQueue = (PCB*)malloc(sizeof(PCB));
    RunQueue->next = NULL;
    ReadyQueue = (PCB*)malloc(sizeof(PCB));
    ReadyQueue->next = NULL;
    FinishQueue = (PCB*)malloc(sizeof(PCB));
    FinishQueue->next = NULL;
}
//释放队列内存
void freeQueue(){
    free(RunQueue);
    free(ReadyQueue);
    free(FinishQueue);
}
//将进程从队列里面删除
void deleteProcess(PCB* head,PCB *p){
    PCB *cur = head;
    while(cur->next != NULL){
        if(strcmp(cur->next->name,p->name) == 0){
            PCB *temp = cur->next;
            cur->next = temp->next;
            temp->next = NULL;
            break;
        }
        cur = cur->next;
    }
}
//创造进程控制快
PCB* createProcess(char* name,int needtime){
    PCB *p = (PCB*)malloc(sizeof(PCB));
    strcpy(p->name, name);
    p->prio =LIMIT-needtime; // 执行完一次后优先数减小
    p->cputime = 0;
    p->needtime = needtime;
    p->count = 0;
    p->state = 'r';
    p->next = NULL;
    ProcessCount++;
    return p;
}
//打印进程信息
void printProcess(PCB *p){
    printf("\tProcess: %s |prio: %d\t| cputime: %d\t| needtime: %d\t| state: %c\n",
        p->name, p->prio, p->cputime, p->needtime, p->state);
}
//打印进程运行状态
void printCurrentState(int Time){
//    system("cls");
    if(Time == before){
        printf("------------------------time %d before exexute---------------------------\n",
            curTime);
    }if(Time == after){
        printf("------------------------time %d after  exexute---------------------------\n",
            curTime);
    }
    puts("");
    puts("Running:");
    PCB *p = RunQueue;
    if(!p->next) puts("\tNone");
    while(p->next){
        printProcess(p->next);
        p = p->next;
    }
    puts("Ready:");
    p = ReadyQueue;
    if(!p->next) puts("\tNone");
    while(p->next){
        printProcess(p->next);
        p = p->next;
    }
    puts("Finish:");
    p = FinishQueue;
    if(!p->next) puts("\tNone");
    while(p->next){
        printProcess(p->next);
        p = p->next;
    }
    puts(" ");
}
//往队列里添加进程
void addToQueue(PCB *head ,PCB *p){
    PCB *cur = head;
    while(cur->next){
        cur = cur->next;
    }
    p->next = NULL;
    cur->next = p;
}
//往运行队列里添加进程
void addToRunQueue(PCB *p){
    p->state = 'E';
    addToQueue(RunQueue,p);
}
//往就绪队列里添加进程
void addToReadyQueue(PCB *p){
    p->state = 'R';
    addToQueue(ReadyQueue,p);
}
//往完成队列里添加进程
void addToFinishQueue(PCB *p){
    p->state = 'F';
    finishedCount++;
    addToQueue(FinishQueue,p);
}   
//运行一次时间片进程
void runProcess(PCB *p){
    if(p->needtime < T)    {
        p->cputime += p->needtime;
        p->needtime = 0;
    }
    else{
        p->cputime += T;
        p->needtime -= T;
    } 
    p->prio = p->prio - T;
    p->count++;
    if(p->needtime == 0) addToFinishQueue(p);
    else addToReadyQueue(p);
    deleteProcess(RunQueue,p);
}
//运行运行队列里面的进程
void runProcessInRunQueue(){
    PCB *p = RunQueue->next;
    while(p){
        runProcess(p);
        p = p->next;
    }
}
//优先级搜索就绪队列添加进运行队列
void prioritySelect(){
    PCB *re = ReadyQueue;
    PCB *maxPrio =(PCB*)malloc(sizeof(PCB));
    maxPrio = re->next;
    while(re->next){
        if(re->next->prio > maxPrio->prio){
            maxPrio = re->next;
        }
        re = re->next;
    }
    PCB *temp = maxPrio;
    deleteProcess(ReadyQueue,maxPrio);    
    addToRunQueue(maxPrio);
}
//优先级调度算法
void Priority(){
    printf("等待进程队列 :");
    //初始化队列
    initQueue();
    //创建进程
    PCB* p1 =  createProcess("p1", 5);
    PCB* p2 =  createProcess("p2", 8);
    PCB* p3 =  createProcess("p3", 12);
    PCB* p4 =  createProcess("p4", 7);
    PCB* p5 =  createProcess("p5", 9);
    PCB* p6 =  createProcess("p6", 4);
    addToReadyQueue(p1);
    addToReadyQueue(p2);
    addToReadyQueue(p3);
    addToReadyQueue(p4);
    addToReadyQueue(p5);
    addToReadyQueue(p6);
    printf("\n");
    printProcess(p1);
    printProcess(p2);
    printProcess(p3);
    printProcess(p4);
    printProcess(p5);
    printProcess(p6);
    while(ReadyQueue->next){
        //根据优先级搜队就绪队列加入到运行队列
        prioritySelect();
        printCurrentState(before);
        //运行运行队列里面的进程
        runProcessInRunQueue();
        printCurrentState(after);
        curTime++;
    }    
}
//伪主函数
int main(){
    Priority();
    return 0;

实验结果:
等待进程队列 :
Process: p1 |prio: 4995 | cputime: 0 | needtime: 5 | state: R
Process: p2 |prio: 4992 | cputime: 0 | needtime: 8 | state: R
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p4 |prio: 4993 | cputime: 0 | needtime: 7 | state: R
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: R
Process: p6 |prio: 4996 | cputime: 0 | needtime: 4 | state: R
------------------------time 0 before exexute---------------------------

Running:
Process: p6 |prio: 4996 | cputime: 0 | needtime: 4 | state: E
Ready:
Process: p1 |prio: 4995 | cputime: 0 | needtime: 5 | state: R
Process: p2 |prio: 4992 | cputime: 0 | needtime: 8 | state: R
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p4 |prio: 4993 | cputime: 0 | needtime: 7 | state: R
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: R
Finish:
None

------------------------time 0 after exexute---------------------------

Running:
None
Ready:
Process: p1 |prio: 4995 | cputime: 0 | needtime: 5 | state: R
Process: p2 |prio: 4992 | cputime: 0 | needtime: 8 | state: R
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p4 |prio: 4993 | cputime: 0 | needtime: 7 | state: R
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 1 before exexute---------------------------

Running:
Process: p1 |prio: 4995 | cputime: 0 | needtime: 5 | state: E
Ready:
Process: p2 |prio: 4992 | cputime: 0 | needtime: 8 | state: R
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p4 |prio: 4993 | cputime: 0 | needtime: 7 | state: R
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 1 after exexute---------------------------

Running:
None
Ready:
Process: p2 |prio: 4992 | cputime: 0 | needtime: 8 | state: R
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p4 |prio: 4993 | cputime: 0 | needtime: 7 | state: R
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: R
Process: p1 |prio: 4991 | cputime: 4 | needtime: 1 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 2 before exexute---------------------------

Running:
Process: p4 |prio: 4993 | cputime: 0 | needtime: 7 | state: E
Ready:
Process: p2 |prio: 4992 | cputime: 0 | needtime: 8 | state: R
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: R
Process: p1 |prio: 4991 | cputime: 4 | needtime: 1 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 2 after exexute---------------------------

Running:
None
Ready:
Process: p2 |prio: 4992 | cputime: 0 | needtime: 8 | state: R
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: R
Process: p1 |prio: 4991 | cputime: 4 | needtime: 1 | state: R
Process: p4 |prio: 4989 | cputime: 4 | needtime: 3 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 3 before exexute---------------------------

Running:
Process: p2 |prio: 4992 | cputime: 0 | needtime: 8 | state: E
Ready:
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: R
Process: p1 |prio: 4991 | cputime: 4 | needtime: 1 | state: R
Process: p4 |prio: 4989 | cputime: 4 | needtime: 3 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 3 after exexute---------------------------

Running:
None
Ready:
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: R
Process: p1 |prio: 4991 | cputime: 4 | needtime: 1 | state: R
Process: p4 |prio: 4989 | cputime: 4 | needtime: 3 | state: R
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 4 before exexute---------------------------

Running:
Process: p5 |prio: 4991 | cputime: 0 | needtime: 9 | state: E
Ready:
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p1 |prio: 4991 | cputime: 4 | needtime: 1 | state: R
Process: p4 |prio: 4989 | cputime: 4 | needtime: 3 | state: R
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 4 after exexute---------------------------

Running:
None
Ready:
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p1 |prio: 4991 | cputime: 4 | needtime: 1 | state: R
Process: p4 |prio: 4989 | cputime: 4 | needtime: 3 | state: R
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: R
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 5 before exexute---------------------------

Running:
Process: p1 |prio: 4991 | cputime: 4 | needtime: 1 | state: E
Ready:
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p4 |prio: 4989 | cputime: 4 | needtime: 3 | state: R
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: R
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F

------------------------time 5 after exexute---------------------------

Running:
None
Ready:
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p4 |prio: 4989 | cputime: 4 | needtime: 3 | state: R
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: R
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F

------------------------time 6 before exexute---------------------------

Running:
Process: p4 |prio: 4989 | cputime: 4 | needtime: 3 | state: E
Ready:
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: R
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F

------------------------time 6 after exexute---------------------------

Running:
None
Ready:
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: R
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: R
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F

------------------------time 7 before exexute---------------------------

Running:
Process: p3 |prio: 4988 | cputime: 0 | needtime: 12 | state: E
Ready:
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: R
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F

------------------------time 7 after exexute---------------------------

Running:
None
Ready:
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: R
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: R
Process: p3 |prio: 4984 | cputime: 4 | needtime: 8 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F

------------------------time 8 before exexute---------------------------

Running:
Process: p2 |prio: 4988 | cputime: 4 | needtime: 4 | state: E
Ready:
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: R
Process: p3 |prio: 4984 | cputime: 4 | needtime: 8 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F

------------------------time 8 after exexute---------------------------

Running:
None
Ready:
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: R
Process: p3 |prio: 4984 | cputime: 4 | needtime: 8 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F
Process: p2 |prio: 4984 | cputime: 8 | needtime: 0 | state: F

------------------------time 9 before exexute---------------------------

Running:
Process: p5 |prio: 4987 | cputime: 4 | needtime: 5 | state: E
Ready:
Process: p3 |prio: 4984 | cputime: 4 | needtime: 8 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F
Process: p2 |prio: 4984 | cputime: 8 | needtime: 0 | state: F

------------------------time 9 after exexute---------------------------

Running:
None
Ready:
Process: p3 |prio: 4984 | cputime: 4 | needtime: 8 | state: R
Process: p5 |prio: 4983 | cputime: 8 | needtime: 1 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F
Process: p2 |prio: 4984 | cputime: 8 | needtime: 0 | state: F

------------------------time 10 before exexute---------------------------

Running:
Process: p3 |prio: 4984 | cputime: 4 | needtime: 8 | state: E
Ready:
Process: p5 |prio: 4983 | cputime: 8 | needtime: 1 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F
Process: p2 |prio: 4984 | cputime: 8 | needtime: 0 | state: F

------------------------time 10 after exexute---------------------------

Running:
None
Ready:
Process: p5 |prio: 4983 | cputime: 8 | needtime: 1 | state: R
Process: p3 |prio: 4980 | cputime: 8 | needtime: 4 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F
Process: p2 |prio: 4984 | cputime: 8 | needtime: 0 | state: F

------------------------time 11 before exexute---------------------------

Running:
Process: p5 |prio: 4983 | cputime: 8 | needtime: 1 | state: E
Ready:
Process: p3 |prio: 4980 | cputime: 8 | needtime: 4 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F
Process: p2 |prio: 4984 | cputime: 8 | needtime: 0 | state: F

------------------------time 11 after exexute---------------------------

Running:
None
Ready:
Process: p3 |prio: 4980 | cputime: 8 | needtime: 4 | state: R
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F
Process: p2 |prio: 4984 | cputime: 8 | needtime: 0 | state: F
Process: p5 |prio: 4979 | cputime: 9 | needtime: 0 | state: F

------------------------time 12 before exexute---------------------------

Running:
Process: p3 |prio: 4980 | cputime: 8 | needtime: 4 | state: E
Ready:
None
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F
Process: p2 |prio: 4984 | cputime: 8 | needtime: 0 | state: F
Process: p5 |prio: 4979 | cputime: 9 | needtime: 0 | state: F

------------------------time 12 after exexute---------------------------

Running:
None
Ready:
None
Finish:
Process: p6 |prio: 4992 | cputime: 4 | needtime: 0 | state: F
Process: p1 |prio: 4987 | cputime: 5 | needtime: 0 | state: F
Process: p4 |prio: 4985 | cputime: 7 | needtime: 0 | state: F
Process: p2 |prio: 4984 | cputime: 8 | needtime: 0 | state: F
Process: p5 |prio: 4979 | cputime: 9 | needtime: 0 | state: F
Process: p3 |prio: 4976 | cputime: 12 | needtime: 0 | state: F


Process exited after 0.6814 seconds with return value 0

Press ANY key to exit...

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值