eCos的进程调度和管理

eCos 支持两种进程调度方式, 一种是bitmap scheduler, 另外一种叫multi-queue scheduler.

先说第一种, 所谓bitmap scheduler -- 为什么叫这个? 我也不知道.

就是说每个优先级只能有一个任务, 优点和缺点都很明显, 优点就是scheduler很简单而且高效, 其实简单就意味着高效了 -- 我认为; 所以顺便表达一个观点 -- 如果你是个程序员, 程序能工作只是很基础的一个东西, 简单, 高效, 易懂才是你应该追求的.

那么其缺点是什么呢? 很明显, 如果它只有32个优先级, 那么它只能有32个task. eCos就只有32个优先级, 0最高, 31最底; 对一般应用来说也够了. 有人说那我多增加点优先级不就ok了吗? 不是那么简单的, 有10万个优先级你查一遍得花多少时间?

 

第二种, multi-queue scheduler

与第一种的区别就是一个优先级上可以支持多个task, 也就是说理论上支持尽可能多的task. 不同优先级之间的调度没有什么需要再多说的了, 主要是同一优先级上的任务如何调度?

eCos也支持两种策略, 一就是通常的round-robin, 也就是time-slicing, 你可以设置一个time slice的长度, 当没有更高优先级的task可以运行的状况下, 相同优先级的task会以一个time-slice的长度为单位平分CPU的时间(除非你主动放弃CPU, 比如说block on semaphore或者yield), 另外一种就是eCos不会主动按照某个time-slice schedule到下一个task, 只有task自己yield cpu或者block on a semaphore或者mutex, 以上这些在编译eCos kernel时都有对应的选项,这里就不一一列出来了.

 

另外eCos还有一个选项对multi-queue scheduler的影响也比较大, 就是一个叫CYGIMP_KERNEL_SCHED_SORTED_QUEUES的选项, 其作用一般可能用不到, 具体作用为, 假设有两个task A 和B, A的优先级大于B, 如果他们同时等待一个Semaphore C:

   A->WaitSemaphore(C);

   B->WaitSemaphore(C);

 

当C被POST的时候, 我们期望的值应该是优先级高的task先运行, 但如果你不enable 这个选项, 则结果相反. 因为eCos的task在等待一个semaphore的default 对task的处理方式是 last-in-first-out queuing.

 

ok, 今天到此为止了, 睡觉先.

你可能感兴趣的:(eCos的进程调度和管理)