Linux内核 之 进程调度

        最普通的方法是将可运行进程组织成一个队列,扫描整个可运行队列并计算进程的优先级,从中选出优先级最高的进程以替代当前占用CPU的进程。但它有一个非常致命的缺陷,随着进程数量的增加,扫描所花费的时间也随之增加。

        2.6版本内核采用了一种较为复杂的调度策略。这种策略解决了进程调度时间随进程数量增加的问题。它在一个固定时间内找到最佳进程。所以也被称为O(1)算法。linux中进程的优先级范围为0~MAX_PRIO-1,其中实时进程优先级范围是0~MAX_RT_PRIO-1,非实时进程优先为MAX_RT_PRIO~MAX_PRIO,优先级越小表示优先级越高。实时进程的优先级总高于普通进程。每个CPU都有一个可运行队列,调度程序从中选取需要占用CPU的进程。可运行队列又根据时间片是否用完分为活动进程集合和过期进程集合。分别用active,expired指向他们。

        O(1)算法中,活动集合与过期集合各自都有140个按照优先级所划分的进程链表,并且两个集合还各有一个优先级位图用来表示每个优先级链表是否为空,当调度程序寻找最佳下一个进程时,会在活动进程集合中利用优先级位图从高到低找到第一个为不为0的位,从而对应到相应的进程链表,链表中的进程具有相同的优先级,取出第一个就是最佳进程也就是优先级最高的进程。当活动进程集合为空时只需交换两个集合,也就是交换active指针和expired指针就可以了。由于进程的优先级只有140个,所以寻找最佳进程的时间是不会随着进程数量增加而增加。这就是O(1)算法。

        runqueue中有这样一个字段:prio_array_t *active, *expired, arrays[2]。arrays为活动进程和过期进程的两个集合。 

prio_array_t 结构定义为:

在Linux内核中,实时进程的优先级(0~99)都比普通进程的优先级(100~139)高,且直到死亡之前始终是活动进程,当系统中有实时进程运行时,普通进程几乎是无法分到时间片的(只能分到5%的CPU时间)。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值