LiteOS-a调度与Linux调度对比分析

Linux 标准内核实现两个调度类:采用 CFS 调度算法的默认调度类和实时调度类

关于Linux调度的具体详解,可参考以下链接

Linux进程调度策略(CFS调度)详解

而LiteOS-a是鸿蒙轻量级系统的内核关于两者的对比可以从以下几个方面来进行:

  1. 调度算法的公平性,即在多大程度上能够避免线程被饿死的现象,同时又能保证抢占式优先级调度。
  2. 调度算法的复杂度,即单次调度的时间复杂度与调度对象数量的关系。
  3. 调度算法的实时性,即调度本身引起的时延以及调度逻辑引起的时延。

1.调度算法的公平性
Linux内核使用CFS(完全公平调度程序)作为调度算法,实现了默认调度类(正常任务)和实时调度类(实时任务),并采用两个优先级范围,实时调度类的优先级较高。在默认调度类中,对优先度较高的任务分配较低比例的处理器处理时间。在实时调度类中采用SCHED_FIFO或SCHED_RR实时策略来调度任务,比普通任务具有更高的优先级。而LiteOS-a使用FIFO或RR调度策略。所以我认为Linux内核的CFS进程调度算法比LiteOS-a的公平性更高。对于抢占式的任务,Linux可以通过FIFO或者RR来保证其优先级调度;对于正常任务,有默认调度类来按照优先级高低分配处理器时间,很大程度上避免了线程被饿死。

2.调度算法的复杂度
Linux CFS调度程序采用高效算法,每个可运行的任务放在红黑树上(一种平衡的,二分搜索数,它的键基于虚拟运行时间)。根据二叉搜索树的性质,最左侧的结点有最小的键值,即具有最高优先级的任务。由于红黑树是平衡的,找到最左侧结点会需要O(log N)操作(N为树内结点数),不过为了高效起见,Linux调度程序将这个值缓存在变量中,从而确定哪个任务运行只需检索缓存的值。而LiteOS-a中采用两级优先级队列,g_priqueueBitmap记录了各个优先级的标志位,每次取队顶节点可以直接用CLZ函数获取最高的优先级,找到最高优先级任务只需要取两次。所以两个调度算法的复杂度都是O(1)。

3.调度算法的实时性
在调度对象数量一样的情况下,两个算法调度本身引起的时延的差别可以忽略不计,但是在调度逻辑中,根据上文所述,由于采用的算法不同,LiteOS-a的实时性更高。

你可能感兴趣的:(鸿蒙,linux,harmonyos)