您的位置 首页 芯闻

实时操作系统的使命调度原因剖析

最近看了一些实时操作系统的源码,关于任务调度是实时操作系统的重要组成部分,但是何时发生调度,怎样才能发生调度却不是非常的清晰,书中

最近看了一些实时操作体系的源码,关于使命调度是实时操作体系的重要组成部分,可是何时产生调度,怎样才能产生调度却不是十分的明晰,书中一本而言所说的都是“假如有更高优先级使命安排妥当,就会产生调度”,这会让许多的读者产生很大的歧义:

在当时的使命中,并没有关于安排妥当表等全局变量的拜访,当时的使命也有自己的仓库空间,我并不知道是否有更高优先级的使命安排妥当,之所以产生这些疑问是没有搞清楚什么时候产生调度,怎样知道需求调度。当时运转的使命,一般来说便是所谓的最高优先级的使命,在没有拜访一系列全局变量的进程中,内核又是怎么知道存在一个更高优先级的使命被安排妥当了呢?

一般来说,关于抢占型实时内核,一般在同步、或许通讯的进程中会自动的调用调度函数,或许使命的挂起函数中运用调度函数,其他的函数中并没有发现其他的调度函数,并且这种状况下都是手动的调度使命,那么在没有这些函数的状况下,实时操作体系中内核是怎么知道需求调度的呢?

我细心查找了一些材料,他人总结了一些操作体系产生调度的原因如下:
  (1)正在履行的进程履行结束。这时,假如不挑选新的安排妥当进程履行,将糟蹋处理机资源。
  (2)履行中进程自己调用堵塞原语将白己堵塞起来进入睡觉等状况。
  (3)履行中进程调用了P原语操作,然后因资源缺乏而被堵塞;或调用了v原语操作激活了等候资源的进程行列。
  (4)履行中进程提出I/O恳求后被堵塞。
  (5)在分时体系中时间片现已用完。
  (6)在履行完体系调用等体系程序后回来用户进程时,这时可看作体系进程履行结束,然后可调度挑选一新的用户进程履行。
  以上都是在可掠夺方法下的引起进程调度的原因。在CPU履行方法是可掠夺时.还有
  (7)安排妥当行列中的某进程的优先级变得高于当时履行进程的优先级,然后也将引发进程调度。
我对比了在实时操作体系中常常运用的调度方法发现,原因(2)、(3)、(7)是首要的原因,其他的一般在实时操作体系中很难找到。可是这仍是不能答复什么时候产生调度这个问题。

我以为在实时操作体系中产生调度的首要有两个部分:
(1)本身需求睡觉等候,有必要手动的调用调度函数(信息量,或许通讯机制)。
(2)产生中止过,当履行完中止服务函数今后,需求从头调度。

其间原因(2)是咱们在剖析实时操作体系中实时功能的首要因素,许多人又会有许多的疑问,假如操作体系中很少运用中止,实质上在实时体系中有必要存在的一个中止便是时间节拍中止,这个中止的存在就能确保实时操作体系的实时型。这个时间节拍挑选也是规划进程中有必要留意的。咱们可以参看uC/OS-II的时间节拍代码,其间完结了一切对非使命挂起的使命的安排妥当操作(时间到期),这时也就知道了那个使命需求咱们调度。在其他的中止服务函数履行完结今后也就需求那个使命需求被履行,从而完结了实时操作。

void OSTimeTick (void)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPUstatusregister */
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb;

OSTimeTickHook(); /* Call user definable hook */
#if OS_TIME_GET_SET_EN > 0
OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
OSTime++;
OS_EXIT_CRITICAL();
#endif
if (OSRunning == TRUE) {
ptcb = OSTCBList; /* Point at first TCB in TCB list */
while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
OS_ENTER_CRITICAL();
if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
if (–ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
} else {
/* Yes, Leave 1 tick to prevent … */
ptcb->OSTCBDly = 1; /* … loosing the task when the … */
} /* … suspension is removed. */
}
}
ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
OS_EXIT_CRITICAL();
}
}
}

从上面的代码中咱们可以知道每个使命都会被扫描一次,检测是否可以安排妥当,假如可以安排妥当就将安排妥当表中的值设置,这样也就知道了是否有更高优先级的使命安排妥当,是否需求调度操作。由于时间节拍中止的不断产生就能确保最高优先级使命的产生。因而时间节拍中止函数是在实时操作体系中十分重要的函数之一。当然使命之间切换以及在中止中切换到新的使命中的切换代码也是十分重要的,可是这些一般涉及到CPU寄存器的值,需求汇编代码完结。
由于中止完结今后许多的使命或许由于信号量等信息的开释现已安排妥当,这时候必定需求使命的调度操作,这时候也就知道了那个使命是最高优先级的,那个使命应该被履行。这时也便是产生调度的时间。

在UC/OS-II中一般选用封闭中止的方法进入临界区,由于封闭了中止,一切的中止服务函数都不会被履行,也就不会产生使命的调度。那么只要一个状况才会产生调度,也便是使命本身需求睡觉,手动挑选调度函数,可是在临界区中不应该产生睡觉等,因而也就不或许手动调度,因而一切产生调度的或许都被清除了,这样也就确保了临界区代码的安全性。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/317755.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部