RTOS中位图的调度算法

在我看的两种RTOS中,线程都是以优先级队列的方式存储,有的可能支持同优先级的线程,那每一个优先级的线程就以循环链表的方式存储。而这个优先级队列是以数组的方式存储。如下图所示:

在内核调度时,需要从就绪队列中找出优先级最高的线程,乍看下狠高端,其实简化下,就是在数组中找最大数的算法。而且,数的范围是事先知道的。则问题描述如下:

  1. 一个固定长度的数组,如32个数的数组。
  2. 每个位置代表一个优先级,即数。
  3. 每个优先级上可能为空,即没有线程在这个优先级,没有的不参与运算。
  4. 在不为空的优先级上找出最小的优先级(即最高的优先级)。

解决这个问题有两个方法。

  1. 采用传统方法,遍历就绪队列,找出最小值,但这个时间是不确定的,时间复杂度为O(n)。
  2. 采用空间换时间的方法。因为在嵌入式OS中,线程的数目不会很大,通常在256个以内,所以可以事先把所有情况列出。比如系统最多8个线程,假设现在有2,3两个线程,则为 0b00000110,则这种情况下最高优先级为2。那个二进制也是节省空间的做法。

那由上述的第二种做法,假如有8个优先级,我们事先做好优先级表:

?

01.const unsigned char bitmap[] =

02.{

03. /* 00 */ 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

04. /* 10 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

05. /* 20 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

06. /* 30 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

07. /* 40 */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

08. /* 50 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

09. /* 60 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

10. /* 70 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

11. /* 80 */ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

12. /* 90 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

13. /* A0 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

14. /* B0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

15. /* C0 */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

16. /* D0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

17. /* E0 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

18. /* F0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0

19.};

?

这样,任意的线程组合下,都能在O(1)时间内把最高优先级找出来。

?

当然,还有问题,在8个优先级下,表的体积是可以忍受的,但在32,256这些优先级下,表的体积过大。解决方法是,例如32个优先级,则把32看作是4个字节,针对每个字节采用上述的8优先级表,分别找出每个字节的最值,最后合并,找出最高优先级。

时间: 2024-11-09 00:57:33

RTOS中位图的调度算法的相关文章

操作系统中常见的调度算法

一.先来先服务调度算法 先来先服务的调度算法(FCFS)是一种最简单的调度算法,该算法既可以用于作业调度,也可以用于进程调度.当在作业调度中采用该算法时,每次都是从后备作业队列选择一个或多个最先进入该队列的作业,将他们调入内存,为他们分配内存,为他们分配资源,创建进程,然后放入就绪队列中.在进程中采用FCFS算法时,则每次调度室从就绪队列中选择一个最先进入该队列的进程,位置分配处理机,使之投入运行.该进程一直运行到完成或发生某事件而阻塞后才放弃处理机. FCFS调度算法有利于cpu繁忙型的作业,

批处理系统中采用的调度算法

1.CPU调度的概念 CPU调度是指按照一定的调度算法从就绪队列中选择一个进程,把CPU的使用权交给被选中的进程. 如果没有就绪进程,系统会安排一个系统空闲进程或者idle进程上CPU运行. 2.衡量调度算法的指标 吞吐量--单位时间完成的进程的数目. 周转时间--每个进程从提出请求到运行完成的时间. 响应时间--从提出请求到第一次回应的时间. CPU利用率--CPU做有效工作的时间比例. 等待时间--每个进程在就绪队列中等待的时间. 3.批处理系统中采用的调度算法 (1)先来先服务(FCFS)

linux中O(1)调度算法与完全公平(CFS)调度算法

一.O(1)调度算法 1.1:优先级数组 O(1)算法的:一个核心数据结构即为prio_array结构体.该结构体中有一个用来表示进程动态优先级的数组queue,它包含了每一种优先级进程所形成的链表. 1 #define MAX_USER_RT_PRIO        100 2 #define MAX_RT_PRIO             MAX_USER_RT_PRIO 3 #define MAX_PRIO                (MAX_RT_PRIO + 40) 4 typed

linux中O(1)调度算法与全然公平(CFS)调度算法

一.O(1)调度算法 1.1:优先级数组 O(1)算法的:一个核心数据结构即为prio_array结构体. 该结构体中有一个用来表示进程动态优先级的数组queue,它包括了每一种优先级进程所形成的链表. 1 #define MAX_USER_RT_PRIO        100 2 #define MAX_RT_PRIO             MAX_USER_RT_PRIO 3 #define MAX_PRIO                (MAX_RT_PRIO + 40) 4 type

交互式系统中采用的调度算法

1.轮转调度 (1)时间片轮转调度算法 CPU的时间分成一段一段的,每一段就是一个时间片,进程轮流使用时间片.示意图如下: (2)虚拟轮转法 时间片轮转调度算法对IO型进程不公平:对于CPU型进程,该进程获得CPU时间片后总是会用完整个时间片:但是对于IO型,它经常是运行一部分时间片后就去等待IO事件,总是用不完自己的时间片.为了解决这个问题,提出了虚拟轮转法,该算法的示意图如下: 虚拟轮转调度算法的思想是:进程用完时间片后,回到就绪队列:而进程因为等待某个事件放弃CPU,该进程等待的事件发生后

OS中常用的调度算法总结

一.常见的批处理作业调度算法 1.先来先服务调度算法(FCFS):就是按照各个作业进入系统的自然次序来调度作业.这种调度算法的优点是实现简单,公平.其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不满意,因为短作业等待处理的时间可能比实际运行时间长得多. 2.短作业优先调度算法(SPF): 就是优先调度并处理短作业,所谓短是指作业的运行时间短.而在作业未投入运行时,并不能知道它实际的运行时间的长短,因此需要用户在提交作业时同时提交作业运行时间的估计值. 3.最高响应比优先算法(

OS中常用的调度算法总结 (转)

http://blog.chinaunix.net/uid-25132162-id-361291.html 一.常见的批处理作业调度算法 1.先来先服务调度算法(FCFS):就是按照各个作业进入系统的自然次序来调度作业.这种调度算法的优点是实现简单,公平.其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不满意,因为短作业等待处理的时间可能比实际运行时间长得多. 2.短作业优先调度算法(SPF): 就是优先调度并处理短作业,所谓短是指作业的运行时间短.而在作业未投入运行时,并不能

WIN32汇编语言中位图的使用

说到位图,我们其实很早就接触过,从最早接触计算机,我们应该就知道有图片这个东西,然后再进一步说,图片在电脑上有好几种格式比如jpg. gif .png.pcx.bmp等等,其中bmp格式的图片文件其实就是位图(windows的说法是DIB),位图文件也分为几种(因为存储的位置不同).因为在学的是罗云斌老师的书籍,这次依旧还拿他老人家的程序学习,拓展创新,学为己用,毕竟还不是老手,一步一步走才可以. 了解了位图是什么东西,下面总结一下制作一个能显示位图的时钟的大体流程: 资源脚本文件  1.创建资

计算机操作系统中常用的调度算法总结

一.常见的批处理作业调度算法 1.先来先服务调度算法(FCFS):就是按照各个作业进入系统的自然次序来调度作业.这种调度算法的优点是实现简单,公平.其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不满意,因为短作业等待处理的时间可能比实际运行时间长得多. 2.短作业优先调度算法(SPF): 就是优先调度并处理短作业,所谓短是指作业的运行时间短.而在作业未投入运行时,并不能知道它实际的运行时间的长短,因此需要用户在提交作业时同时提交作业运行时间的估计值. 3.最高响应比优先算法(