【第6章】进程调度【二】

本文介绍了一种基于优先级的进程调度算法。通过在进程控制块(PCB)中增加优先级和计数器字段,实现了不同优先级进程的调度。在时钟中断处理程序中更新计数器,选择最高ticks值的进程运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     上一篇中我们是用Milli_Delay函数调用系统调用Get_Ticks并在用户级的进程调用Milli_Delay来延迟不同的时间来实现进程优先级的,这其实并不好,进程调度应该是在内核态下执行的,而这里是在用户态实现的。我们就想办法在内核态中实现,我们应该为每个进程设置一个优先级别,因此应该在PCB中添加这个字段,每发生一次调度这个值就减1,那总有减到0的时候,到时候还得恢复原值,还得添加一个字段,这个字段是常量,到时候提供原值,那么就修改PCB结构:

Code:
  1. typedef struct s_proc_item   
  2. {   
  3.     Stack_Frame stack_frame;   
  4.     u16 LDT_Selector;   
  5.     Descriptor ldts[2];   
  6.     int ticks;   
  7.     int priority;   
  8. }PCB;  

     接下来在Init_PCB函数中初始化它:

Code:
  1. PCB_Tables[0].ticks = PCB_Tables[0].priority = 150;   
  2. PCB_Tables[1].ticks = PCB_Tables[1].priority = 50;   
  3. PCB_Tables[2].ticks = PCB_Tables[2].priority = 30;  

     然后修改Clock_Handler中的进程调度部分,不再是时间片轮转了,并把当前进程的PCB的ticks减1:

Code:
  1. void Clock_Handler(u32 irq_no)   
  2. {   
  3.     Ticks++;   
  4.     p_Resume_PCB->ticks--;   
  5.     if(Is_Reenter != 0)   
  6.     {   
  7.         Disp_Color_Str("!",0xe);   
  8.         return;        
  9.     }   
  10.        
  11.     PCB *p_PCB;   
  12.     int greatest_ticks = 0;   
  13.        
  14.     while(!greatest_ticks)   
  15.     {   
  16.         for(p_PCB = PCB_Tables ; p_PCB < PCB_Tables + PROC_NUM ; p_PCB++)   
  17.         {   
  18.             if(p_PCB->ticks > greatest_ticks)   
  19.             {   
  20.                 greatest_ticks = p_PCB->ticks;   
  21.                 p_Resume_PCB = p_PCB;   
  22.             }   
  23.         }   
  24.            
  25.         if(!greatest_ticks)   
  26.         {   
  27.             for(p_PCB = PCB_Tables ; p_PCB < PCB_Tables + PROC_NUM ; p_PCB++)   
  28.             {   
  29.                 p_PCB->ticks = p_PCB->priority;   
  30.             }   
  31.         }   
  32.     }   
  33. }  

     在此算法中,先遍历PCB表,找到ticks值最高的进程,指定为要恢复的进程,如果每个进程的ticks值都为0,便把每个进程的ticks值恢复为各自进程的priority的值。

     既然已经实现优先级,那么就把各个进程的执行体中的延迟函数的参数都改为200吧,修改过程略掉。

     编译链接,运行,结果如图所示:

     可以看到,每个进程的执行体的延迟时间是一样的,但是还是有优先级的区别。

     让我们来统计一下各字母的数量,结果如下:

     它们之间的比大概为A:B:C = 2.49:1.4:1,与直观上的优先级比15:5:3 = 5:1.67:1差距较大,为什么会这样呢?休息一下再说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值