优先数调度算法常用于批处理系统中。在进程调度中,每次调度时,系统把处理机分配给就绪队列中优先数最高的进程。它又分为两种:非抢占式优先数算法和抢占式优先数算法。
在非抢占式优先数算法下,系统一旦把处理机分配给就绪队列中优先数最高的进程后,这个进程就会一直运行,直到完成或发生某事件使它放弃处理机,这时系统才能重新将处理机分配给就绪队列中的另一个优先数最高的进程。
在抢占式优先数算法下,系统先将处理机分配给就绪队列中优先数最高的进程度让它运行,但在运行的过程中,如果出现另一个优先数比它高的进程,它就要立即停止,并将处理机分配给新的高优先数进程。
1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef struct node//一个进程的结构 4 { 5 int pid; //进程ID号 6 int priority; //进程优先数 7 int time; //进程分配的时间片 8 char state; //进程的状态 9 struct node * next; 10 }pcb; 11 12 13 pcb * p; 14 pcb * creat(); //进程的创建 15 int output(); //输出队列信息 16 pcb * insert(pcb * head,pcb * p); //进程p的插入 17 pcb * del(pcb * head,pcb * p); 18 int priority(pcb * head); 19 int s=0; 20 int a[10000]; 21 22 23 pcb * creat() //基于进程链表的创建 24 { 25 pcb * p1,* head; 26 int i,num; 27 head=NULL; 28 printf("进程个数:\n"); 29 scanf("%d",&num); 30 for(i=0;i<num;i++) 31 { 32 printf("请输入第%d个进程的信息:\n",i+1); 33 p1=(pcb *)malloc(sizeof(pcb)); 34 printf("输入进程优先数:\n"); 35 scanf("%d",&p1->priority); 36 printf("输入进程分配的时间:\n"); 37 scanf("%d",&p1->time); 38 p1->pid=i+1; 39 printf("\n"); 40 p1->state='W'; 41 head=insert(head,p1); 42 } 43 return head; 44 } 45 46 int output(pcb * head) //输出链表信息 47 { 48 pcb * p; 49 p=head; 50 do 51 { 52 printf("%d %d %d %c\n",p->pid,p->priority,p->time,p->state); 53 p=p->next; 54 } 55 while(p!=NULL); 56 return 0; 57 } 58 59 pcb * insert(pcb * head,pcb * p) //将p按照优先级插入链表 60 { 61 pcb * p0,* p1,* p2; 62 p1=head; 63 p0=p; 64 if(head==NULL) 65 { 66 head=p0; 67 p0->next=NULL; 68 } 69 else 70 { 71 while((p1->priority>=p0->priority) && (p1->next!=NULL)) //寻找位置 72 { 73 p2=p1; 74 p1=p1->next; 75 } 76 if(p0->priority>p1->priority) //如果p0大于p1的优先级,找到存放的位置 77 { 78 if(head==p1) //并且p1正在运行,此时链表为p1,NULL 79 { 80 head=p0; 81 p0->next=p1; 82 p1->next=NULL; 83 } 84 else 85 { 86 p2->next=p0; 87 p0->next=p1; 88 } 89 } 90 else //因为p1->next=NULL跳出 91 { 92 p1->next=p0; 93 p0->next=NULL; 94 } 95 } 96 return head; 97 } 98 99 pcb * del(pcb * head,pcb * p) //进程p的删除 100 { 101 p->state='F'; 102 printf("进程%d已经DELETE\n",p->pid); 103 printf("\n"); 104 return head; 105 } 106 107 int priority(pcb * head) //进程的调度 108 { 109 char flag; 110 pcb * p,* rp; 111 p=head; 112 while(NULL!=p) 113 { 114 rp=p; 115 p=p->next; 116 do 117 { 118 flag='y'; 119 printf("进程%drunning\n",rp->pid); 120 rp->state='R'; 121 rp->priority=rp->priority-3; 122 rp->time--; 123 a[s++]=rp->pid; 124 output(rp); 125 rp->state='W'; 126 printf("\n"); 127 if(0==rp->time) 128 p=del(p,rp); 129 else 130 { 131 if((p==NULL) || (rp->priority>=p->priority)) 132 flag='n'; 133 else 134 { 135 p=insert(p,rp); 136 printf("当前链表信息\n"); 137 output(p); 138 printf("\n"); 139 } 140 } 141 } 142 while(flag=='n'); 143 } 144 return 0; 145 } 146 147 int main() 148 { 149 int i; 150 pcb * head=NULL; 151 printf("please input data!\n"); 152 head=creat(); 153 printf("链表信息\n"); 154 output(head); 155 printf("\n"); 156 printf("begin running!\n"); 157 printf("\n"); 158 priority(head); 159 for(i=0;i<s;i++) 160 { 161 printf("%d",a[i]); 162 if(i!=s-1) 163 printf("-->"); 164 } 165 printf("\n"); 166 return 0; 167 }