资料介绍
如果说CPU是计算机系统的心脏,那么进程调度就是计算机系统的灵魂,因为它决定了如何使用CPU。例如,Linux是一个多任务操作系统,它的理想状况是保持CPU有效运行。如果某个正在运行的进程转入等待系统资源,操作系统就调度其他进程运行,从而保证CPU的最大利用率。如何使系统能够保证较短的响应时间和较高的吞吐量,使得多个进程竞争CPU时保持公平、高效,是通用操作系统所追求的目标。但对于实时操作系统而言,它的调度算法是基于POSIX规定的基于事件驱动优先级的调度算法,为了及时响应高优先级进程,它宁愿牺牲整体效率。
调度的实现可以分为2步来完成:
①何时启动调度,即解决调度启动时机的问题;
②怎么调度,按优先级调度就是要找到系统当前优先级最高的进程,然后进行上下文切换。
在实时系统中,只有当就绪进程集合发生变动时才有调度的需要,而就绪进程集合的变动只可能发生在几种情况下:
①运行中的进程受阻或自动放弃CPU;
②系统中新建了进程;
③运行中的进程“自杀”或“被杀”;
④运行中的进程唤醒了某个线程;
⑤中断服务子程序结束时唤醒了其他进程。
理想情况下,实时系统在有高优先级的进程转入就绪态时,就应该立即启动调度程序,响应高优先级进程。但实际上却存在着不可调度的时隙,称为不可调度窗口:
①正在进行进程切换,不能进行调度;
②中断响应期间,不能进行调度;
③进入临界区,不能进行调度;
④DMA期间CPU已被挂起,不可能进行调度。
在实时系统里,必须努力缩小不可调度窗口。
在调度启动的时机上,所有的实时操作系统基本一致。
那么接下来要做的就是寻找系统中当前最应该得到运行机会的进程,下面分别看一个最简单的和比较复杂的实现。
1 μC/OS-Il的实现
在μC/OS-II里。只允许有64个优先级且不同进程优先级互不相同。把64个优先级分成8组,数据结构位图OSRdyGrp反映着哪一些进程组中有就绪进程。另外,各个进程组的标志位在位图中的位置也是有规律的,位置靠右边的标志位代表优先级较高的进程组,只要从右到左扫描位图OSRdyGrp,碰到第一个非0的标志位就代表当前优先级最高的就绪进程所在的进程组。这样,就可以预先编制一个对照表,即数组。此数组就是OStJnMapTbl[](该表的详细描述可参阅参考文献的88~90页),以位图OSRdyGrp的数值为下标,就可以直接得到优先级最高者所属组号。
8个标志位共有256种不同组合,所以这个数组大小是256。为了便于与μC/OS-II源代码对照,把以OSRdyGrp的数值为下标,在OSTJnMapTbl[]数组中查得的值称为组号y。知道组号y以后,就可以以此为下标在OSRdyTbl[]中得到相应的组内位图。同理,以这个位图的数值OSRdyThl[y]为下标,又可以在OSUnMapTbl[]内查得该组内优先级最高者进程号。将组号和组内号拼合在一起,就得到了目标进程完整的进程号,即优先级。再以此为下标,就可以从OSTcBPrioTbl[]中得到指向目标进程控制块的OSTCBHighRdy。以下就是进程切换的工作了。
通过上面的分析,不难理解下面这样的语句了:这个过程如此简洁,其根本原因是μC/OS-II严格按优先级调度,并且每个优先级只有一个进程。如果优先级的使用并非唯一,多个线程可以使用相同的优先级,那就还有个相同优先级的就绪进程之间怎样调度的问题,这就使调度过程复杂化了。一些商品的实时操作系统,例如VxWorks,允许多个进程具有相同的优先级,因为不支持不同进程可以有相同优先级的系统,无法采用优先级继承算法来解决实时系统里令人讨厌的优先级反转现象,但它不公开源代码。下面选择一个公开源代码的实时操作系统Nut/OS进行分析。它有256个优先级且允许不同进程具有相同的优先级。在这样的系统里,是不可能采用类似于位图这样的机制来实现调度的。
2Nut/OS的实现
为了叙述方便,设计一个完整的进程运行的情景来说明。另外Nut/0S中采用了线程的概念,在不分系统空间和用户空间的系统中,进程等价于线程。而进程和任务本来就是同一个概念的不同叫法。Nut/Os是一个嵌入式实时操作系统,不分系统空间和用户空间,所以以下的叙述中,线程、进程和任务混用,意思完全一样。
在Nut/OS中,可以通过下面的函数创建一个线程:

创建一个线程的过程,实际上就是从堆栈空间中申请一个放置线程控制块的空间,在这个空间中建立线程控制块并完成对控制块的赋值的过程。为了更好地说明线程控制块的作用,下面用一个图表来说明,如图1所示。

调度的实现可以分为2步来完成:
①何时启动调度,即解决调度启动时机的问题;
②怎么调度,按优先级调度就是要找到系统当前优先级最高的进程,然后进行上下文切换。
在实时系统中,只有当就绪进程集合发生变动时才有调度的需要,而就绪进程集合的变动只可能发生在几种情况下:
①运行中的进程受阻或自动放弃CPU;
②系统中新建了进程;
③运行中的进程“自杀”或“被杀”;
④运行中的进程唤醒了某个线程;
⑤中断服务子程序结束时唤醒了其他进程。
理想情况下,实时系统在有高优先级的进程转入就绪态时,就应该立即启动调度程序,响应高优先级进程。但实际上却存在着不可调度的时隙,称为不可调度窗口:
①正在进行进程切换,不能进行调度;
②中断响应期间,不能进行调度;
③进入临界区,不能进行调度;
④DMA期间CPU已被挂起,不可能进行调度。
在实时系统里,必须努力缩小不可调度窗口。
在调度启动的时机上,所有的实时操作系统基本一致。
那么接下来要做的就是寻找系统中当前最应该得到运行机会的进程,下面分别看一个最简单的和比较复杂的实现。
1 μC/OS-Il的实现
在μC/OS-II里。只允许有64个优先级且不同进程优先级互不相同。把64个优先级分成8组,数据结构位图OSRdyGrp反映着哪一些进程组中有就绪进程。另外,各个进程组的标志位在位图中的位置也是有规律的,位置靠右边的标志位代表优先级较高的进程组,只要从右到左扫描位图OSRdyGrp,碰到第一个非0的标志位就代表当前优先级最高的就绪进程所在的进程组。这样,就可以预先编制一个对照表,即数组。此数组就是OStJnMapTbl[](该表的详细描述可参阅参考文献的88~90页),以位图OSRdyGrp的数值为下标,就可以直接得到优先级最高者所属组号。
8个标志位共有256种不同组合,所以这个数组大小是256。为了便于与μC/OS-II源代码对照,把以OSRdyGrp的数值为下标,在OSTJnMapTbl[]数组中查得的值称为组号y。知道组号y以后,就可以以此为下标在OSRdyTbl[]中得到相应的组内位图。同理,以这个位图的数值OSRdyThl[y]为下标,又可以在OSUnMapTbl[]内查得该组内优先级最高者进程号。将组号和组内号拼合在一起,就得到了目标进程完整的进程号,即优先级。再以此为下标,就可以从OSTcBPrioTbl[]中得到指向目标进程控制块的OSTCBHighRdy。以下就是进程切换的工作了。
通过上面的分析,不难理解下面这样的语句了:这个过程如此简洁,其根本原因是μC/OS-II严格按优先级调度,并且每个优先级只有一个进程。如果优先级的使用并非唯一,多个线程可以使用相同的优先级,那就还有个相同优先级的就绪进程之间怎样调度的问题,这就使调度过程复杂化了。一些商品的实时操作系统,例如VxWorks,允许多个进程具有相同的优先级,因为不支持不同进程可以有相同优先级的系统,无法采用优先级继承算法来解决实时系统里令人讨厌的优先级反转现象,但它不公开源代码。下面选择一个公开源代码的实时操作系统Nut/OS进行分析。它有256个优先级且允许不同进程具有相同的优先级。在这样的系统里,是不可能采用类似于位图这样的机制来实现调度的。
2Nut/OS的实现
为了叙述方便,设计一个完整的进程运行的情景来说明。另外Nut/0S中采用了线程的概念,在不分系统空间和用户空间的系统中,进程等价于线程。而进程和任务本来就是同一个概念的不同叫法。Nut/Os是一个嵌入式实时操作系统,不分系统空间和用户空间,所以以下的叙述中,线程、进程和任务混用,意思完全一样。
在Nut/OS中,可以通过下面的函数创建一个线程:

创建一个线程的过程,实际上就是从堆栈空间中申请一个放置线程控制块的空间,在这个空间中建立线程控制块并完成对控制块的赋值的过程。为了更好地说明线程控制块的作用,下面用一个图表来说明,如图1所示。

下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- μC/OS-II的多任务系统实时性解析 2次下载
- 一种μC/OS-II任务调度硬件指令的实现 2次下载
- μC/OS-II 在Nios上的移植
- 基于μC/OS-II的无线调度策略分析与实现
- 基于μC/OS-Ⅱ的实时分层调度算法研究
- 实时操作系统μC/OS-II调度算法的研究
- 基于μC/OS-II 的CAN总线驱动程序设计
- 在μC OS-II中实现同优先级调度的方法
- 嵌入式实时操作系统μC OS-II与eCos的比较
- μC OS-II 在Nios 上的移植1
- 编写μC OS-II 实时内核下的串行驱动
- μC/OS-II 任务调度机制的改进
- 嵌入式实时操作系统μC/OS-II与eCos的比较
- 基于μC/OS-II的嵌入式音频系统设计
- μC/OS II中文教程
- 基于μC/OS-II和TMS320LF2407A实现集散式数据采集系统的设计 2.9k次阅读
- 基于实时嵌入式操作系统mC/OS-II实现GPRS终端系统的设计 3.2k次阅读
- 基于嵌入式工控模块和μC/OS-II实现车载状态监控系统的设计 2.8k次阅读
- 基于μC/OS-II操作系统实现在P89V51RD2微控制器上运行 1.1k次阅读
- 基于μC/OS-II操作系统在SPCE061A上的移植优化研研究 1.1k次阅读
- 51单片机对μC/OS-II实时操作系统的移植 3k次阅读
- LPC213X通过μC/OS-II的多种移植方案 974次阅读
- 浅论uC/OS-II 在电动车电池管理系统中的应用研究 1.8k次阅读
- μC/OS-II系统基础嵌入式开发编程教程 5.1k次阅读
- μC/OS—II中的时钟节拍管理机制技术分析 1.7k次阅读
- LPC2119简介 μC/OS-II在LPC2119上的移植 3.3k次阅读
- 车辆调度系统的整体设计 UC/OS-II的内核调度机理 1.6k次阅读
- 通过实时调度与日前调度的协调使换电站抑制波动影响同时兼顾用户利益 6.8k次阅读
- 利用μC/OS-II的嵌入式激光测距系统 4k次阅读
- 用AndesCore N1033A-S处理器实现μC/OS-II的移植 4.7k次阅读
下载排行
本周
- 1冷柜-电气控制系统讲解
- 13.68 MB | 4次下载 | 10 积分
- 2安川A1000变频器中文版说明书
- 20.16 MB | 3次下载 | 3 积分
- 3直流电路的组成和基本定律
- 1.67 MB | 2次下载 | 免费
- 4丹佛斯2800系列变频器说明书
- 8.00 MB | 1次下载 | 5 积分
- 5PC8011同步开关型降压3.5A单节锂电池充电管理电路技术手册
- 0.74 MB | 1次下载 | 免费
- 6ES7243E+ES8311音频录制与播放电路资料
- 0.06 MB | 1次下载 | 5 积分
- 7SDM02 激光测距模块产品手册
- 0.43 MB | 1次下载 | 免费
- 8SDFM 激光测距模块模组手册
- 0.54 MB | 1次下载 | 免费
本月
- 1CH341编程器软件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下载 | 1 积分
- 22025智能家居传感器市场分析及创新应用
- 3.11 MB | 43次下载 | 免费
- 3RV1126B系列开发板产品资料
- 4.19 MB | 18次下载 | 免费
- 4CH341编程软件下载
- 2.50 MB | 16次下载 | 5 积分
- 5全志系列-米尔基于T153核心板开发板 四核异构、3路千兆网,赋能多元化工业场景
- 3.05 MB | 12次下载 | 免费
- 6【开源】60余套STM32单片机、嵌入式Linux、物联网、人工智能项目案例及入门学习资源包
- 10.55 MB | 8次下载 | 免费
- 7冷柜-电气控制系统讲解
- 13.68 MB | 4次下载 | 10 积分
- 8特斯拉MODEL S车载充电机主电路回路原理图
- 0.81 MB | 4次下载 | 3 积分
总榜
- 1matlab软件下载入口
- 未知 | 935137次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420064次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233094次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191448次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183356次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81604次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73824次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65991次下载 | 10 积分
电子发烧友App





创作
发文章
发帖
提问
发资料
发视频
上传资料赚积分
评论