进程动态优先级调度

Posted shuoed

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程动态优先级调度相关的知识,希望对你有一定的参考价值。

 

  1 /*******************************************
  2 *
  3 *  File    : pro.c
  4 *  describe: 操作系统进程调度,动态优先级算法
  5 *  Author  : 阿Q
  6 *  Iime    : 2016.11.19
  7 *
  8 *******************************************/
  9 #include<stdio.h>
 10 #define P 5
 11 #define PrintF(proprety) printf("%s\t",proprety)
 12 struct pcb {         //定义进程结构
 13     int pid;             //进程Id
 14     struct pcb *next;  //指向下一个进程
 15     int time;    //进程所需执行的时间
 16     int priority;  //进程优先级
 17     int state;  //进程执行的状态,只有0、1状态.0未执行,1已执行
 18 };
 19 struct pcb pro[P]= {//初始化5个进程
 20     {0,1,6,3,0},
 21     {1,2,4,4,0},
 22     {2,3,4,3,0},
 23     {3,4,4,2,0},
 24     {4,0,1,0,0},
 25 };
 26 
 27 /*******************************************
 28 *
 29 *  Function : 显示所有进程的状态
 30 *
 31 *******************************************/
 32 void display() {
 33     int i=0,property=5;
 34     PrintF("\npid");
 35     for(i=0; i<P; i++) {
 36         printf("%d\t",pro[i].pid);
 37     }
 38     PrintF("\nnext");
 39     for(i=0; i<P; i++) {
 40         printf("%d\t",pro[i].next);
 41     }
 42     PrintF("\ntime");
 43     for(i=0; i<P; i++) {
 44         printf("%d\t",pro[i].time);
 45     }
 46     PrintF("\npri");
 47     for(i=0; i<P; i++) {
 48         printf("%d\t",pro[i].priority);
 49     }
 50     PrintF("\nstate");
 51     for(i=0; i<P; i++) {
 52         printf("%d\t",pro[i].state);
 53     }
 54     printf("\n");
 55 }
 56 
 57 /*******************************************
 58 *
 59 *  Function : 对结构体进行排序,按优先级降序*时间升序
 60 *
 61 *******************************************/
 62 int cmp(const void *a,const void *b) {
 63     struct pcb *aa=(struct pcb *)a;
 64     struct pcb *bb=(struct pcb *)b;
 65 
 66     //如果进程执行结束,则直接返回状态
 67     if(aa->time==0||aa->state==1)return 1;
 68     else if(bb->time==0||bb->state==1)return -1;
 69 
 70     if(bb->priority!=aa->priority)
 71         return (bb->priority - aa->priority);
 72     else
 73         return (aa->time - bb->time);
 74 }
 75 
 76 /*******************************************
 77 *
 78 *  Function : 进程排序 需要子函数 cmp()
 79 *
 80 *******************************************/
 81 void reSort() {
 82     qsort(pro,P,sizeof(pro[0]),cmp);
 83 }
 84 
 85 /*******************************************
 86 *
 87 *  Function : 检查是否存在未执行完的程序
 88 *
 89 *******************************************/
 90 int check() {
 91     int i=0;
 92     for(i=0; i<P; i++) {
 93         if(!pro[i].state)return 1;
 94     }
 95     return 0;
 96 }
 97 
 98 /*******************************************
 99 *
100 *  Function : 修改指针指向
101 *
102 *******************************************/
103 void rePoint() {
104     int i=0;
105     for(; i<P; i++) {
106         if(pro[i].state&&i>0) {
107             pro[i-1].next=0;
108         }
109         if(i<(P-1))
110             pro[i].next=pro[i+1].pid;
111     }
112 }
113 
114 int main() {
115     int f=0,i=1;
116     printf("初始状态为:");
117     display();
118     while(check()) {//每执行完一次,测试是否还有进程未执行完
119         printf("第%d次运行后:",i++);
120         //pro[0]为第一个进程,这里当作是在CUP中执行的进程.每次执行执行时间减一,优先级减一。
121         pro[0].time-=1;//执行一次进程执行时间减一
122         pro[0].priority-=1;//动态优先级,每执行一次优先级减一
123 
124         if(pro[0].time==0)pro[0].state=1,pro[0].priority=-1,pro[0].next=0;//如果该进程执行完毕,及执行时间为0,则状态该为1,同时调整优先级,指针调制为0
125         reSort();//重排进程
126         rePoint();//重排指针
127         display();//输出
128     }
129     printf("进程以全部运行完毕\n");
130     return 0;
131 }

 

以上是关于进程动态优先级调度的主要内容,如果未能解决你的问题,请参考以下文章

进程动态优先级调度

窥探 kernel --- 进程调度的目标,nice值,静态优先级,动态优先级,实时优先级

操作系统综合实验——动态高优先权优先进程调度算法

Linux内核设计与实现 进程调度1: 基本概念

利用python画出动态高优先权优先调度

利用python画出动态高优先权优先调度