首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

UCOS之任务调度机制(4)

UCOS之任务调度机制(4)

八. uCOS II的初始化:
      OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低。
      这两个任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。换句话说,OSTCBList总是指向最后建立的那个任务。链的终点指向空字符NULL(也就是零)。
      因为这两个任务都处在就绪态,在就绪任务表OSRdyTbl[]中的相应位是设为1的。还有,因为这两个任务的相应位是在OSRdyTbl[]的同一行上,即属同一组,故OSRdyGrp中只有1位是设为1的。
      uCOS II还初始化了4个空数据结构缓冲区,如图F3.8所示。每个缓冲区都是单向链表,允许uCOS II从缓冲区中迅速得到或释放一个缓冲区中的元素。控制块OS_TCB的数目也就自动确定了。当然,包括足够的任务控制块分配给统计任务和空闲任务。
  附:调度机制
  进程调度是计算机的灵魂。在实时系统里,要使重要紧急的进程一经唤醒使被优先调度运行,系统就必须有基于进程优先级的实时调度策略。通过深入考察和对比μC/OS-II对实时调度算法的实现,可以深刻理解实时操作系统。
     如果说CPU是计算机系统的心脏,那么进程调度就是计算机系统的灵魂,因为它决定了如何使用CPU。例如,Linux是一个多任务操作系统,它的理想状况是保持CPU有效运行。如果某个正在运行的进程转入等待系统资源,操作系统就调度其他进程运行,从而保证CPU的最大利用率。如何使系统能够保证较短的响应时间和较高的吞吐量,使得多个进程竞争CPU时保持公平、高效,是通用操作系统所追求的目标。但对于实时操作系统而言,它的调度算法是基于POSIX规定的基于事件驱动优先级的调度算法,为了及时响应高优先级进程,它宁愿牺牲整体效率。    
    调度的实现可以分为2步来完成:
         ①何时启动调度,即解决调度启动时机的问题;
         ②怎么调度,按优先级调度就是要找到系统当前优先级最高的进程,然后进行上下文切换。     

     在实时系统中,只有当就绪进程集合发生变动时才有调度的需要,而就绪进程集合的变动只可能发生在几种情况下:
         ①运行中的进程受阻或自动放弃CPU;
         ②系统中新建了进程;
         ③运行中的进程“自杀”或“被杀”;
         ④运行中的进程唤醒了某个线程;
         ⑤中断服务子程序结束时唤醒了其他进程
。      

     理想情况下,实时系统在有高优先级的进程转入就绪态时,就应该立即启动调度程序,响应高优先级进程。但实际上却存在着不可调度的时隙,称为不可调度窗口:
         ①正在进行进程切换,不能进行调度;
         ②中断响应期间,不能进行调度;
        ③进入临界区,不能进行调度;
         ④DMA期间CPU已被挂起,不可能进行调度。 在实时系统里,必须努力缩小不可调度窗口。在调度启动的时机上,所有的实时操作系统基本一致。
继承事业,薪火相传
返回列表