调度策略
- 时间片轮转算法
在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
- 优先级调度算法
每个进程根据它重要程度的不同被赋予不同的优先级,调度器在每次调度时,总选择优先级最高的进程开始执行。在当前进程的执行过程中若有更高优先级的进程进入就绪状态时,此时cpu的调度方式又分为
非剥夺型调度
和剥夺型调度
。所谓“非剥夺型调度”是指:一旦某个进程被调度执行,则该进程一直执行下去直至该进程结束,或由于某种原理自行放弃CPU进入等待状态,才将CPU重新分配给其它进程。所谓“剥夺型调度”是指:一旦就绪状态中出现优先权更高的进程,或者运行的进程已用满了规定的时间片时,便立即剥夺当前进程的运行(将其放回就绪状态),把CPU分配给其它进程。
常见可运行于小型单片机系统
- UCOS-II
- eCOS
- Free RTOS
- uCLinux
UCOS-II
任务调度:抢占式实时内核,即优先级最高的任务优先运行,不论什么时候,只要就绪的任务中有比当前正在执行的任务优先级更高的任务,就暂停当前的任务去执行优先级最高的任务(固定优先级抢占式)。UCOS-II中共有64个任务,分为8组,每8个为一组。
实时性很高
内存管理:μC/OS-II提供的内存管理机制是把连续的大块内存按分区来管理,每个分区中包含整数个大小相同的内存块,不同分区的大小可不相同,同一个分区的大小相同。因申请的空间大小固定,故即使是频繁地申请和释放内存也不会产生内存碎片问题,但其缺点是内存的利用率相对不高。
Free RTOS
任务调度:FreeRTOS内核既支持优先级调度算法,同时支持轮换调度算法。同时,支持用户自定义可剥夺和不可剥夺。当进行任务调度时,调度算法首先进行优先级调度。系统按照优先级从高到低的顺序从就绪任务链表数组中寻找第一个最高就绪优先级,据此实现优先级调度。若此优先级下只有一个就绪任务,则此就绪任务进入运行态;若此优先级下有多个就绪任务,则需采用轮换调度算法实现多任务轮流执行。
调度方式灵活
内存管理:提供5种内存管理机制,分别放置于heap_*.c文件中。
- heap_1.c 最简单的分配器,不允许内存释放。
- heap_2.c 比heap_1.c改进的地方就是可以释放内存。
- heap_3.c 是针对线程安全的。包装了malloc(),free()
- heap_4.c 可以合并相邻的空块,避免碎片,可以指定绝对地址。
- heap_5.c 比heap_4.c改进的地方是可以合并不相邻的空闲内存.
FreeRTOD
优势:免费
劣势:仅是一个系统内核,需扩展第三方GUI、TCP/IP协议栈、FS文件系统
UCOS-II
优势:实时性强、功能完整(UCOS/GUI、UCOS/FS、UCOS/tcp-ip无缝结合)
uClinux
内存管理:继承了标准linux的管理方式,但因为缺少MMU(内存管理单元)导致对内存的操作是对真实地址进行,无法做到程序隔离。
任务调度:uClinux在结构上继承了标准Linux的多任务实现方式(分实时进程和普通进程采用不同的调度策略、即先来的先服务调度和时间片轮转调度)
优点:着重网络应用、文件系统、
缺点:实时性一般(不支持抢占)、内核大(512KRAM,1Mflash)、少了内存保护和虚拟内存模块
eCOS
进程调度:支持两种进程调度,位图调度(一个任务一个优先级)、多队列调度(一个优先级可对应多个任务)
内存管理:ecos提供了两种内存池:一种是变长内存池(variable size memory pool),根据申请的大小进行分配;另一种是定长内存池(fixed size memory pool),以固定大小的块为单位进行分配。变长内存池使用链表来进行管理,定长内存池使用位图来进行管理。C库函数malloc使用变长内存池实现内存分配,用户可以直接使用C库函数malloc和free管理内存。