基于优先数进程调度算法

优先数调度算法常用于批处理系统中。在进程调度中,每次调度时,系统把处理机分配给就绪队列中优先数最高的进程。它又分为两种:非抢占式优先数算法和抢占式优先数算法。

非抢占式优先数算法下,系统一旦把处理机分配给就绪队列中优先数最高的进程后,这个进程就会一直运行,直到完成或发生某事件使它放弃处理机,这时系统才能重新将处理机分配给就绪队列中的另一个优先数最高的进程。

抢占式优先数算法下,系统先将处理机分配给就绪队列中优先数最高的进程度让它运行,但在运行的过程中,如果出现另一个优先数比它高的进程,它就要立即停止,并将处理机分配给新的高优先数进程。

 

  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 }

 

转载于:https://www.cnblogs.com/Fchengli/p/4107569.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值