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 }
时间: 2024-11-01 00:25:45