MIPS处理器下Linux调度器的调度时机

来源:互联网 发布:家装颜色搭配技巧知乎 编辑:程序博客网 时间:2024/05/17 01:55

1. Linux的调度器,N多书有介绍,但是这些介绍基本都是给个大致概念,具体还要看代码。这部分的实现,不同的内核版本有一定的差异,我看的内核版本是2.6.21.7。

2. 关于调度器,我的理解,无外乎3点:什么时候去检查是否需要调度(调度时机),如何选择应该运行的任务(调度策略),怎样做任务的切换。任务的切换,也就是上下文切换,相对简单。调度策略,Linux下有SCHED_RR, SCHED_FIFO,SCHED_OTHER, N多书上对他们差别的讲解足够,且易于理解。我主要学习了调度时机。

 

3. 由于要进行调度,需要调用schedule()函数,在Linux内核里搜索调用这个函数的地方,可以大致将调度时机分成如下4类:

        a) 各种驱动主动的调用schedule函数,这种情况在代码里看到的最多;

        b) 进程从中断返回时,调用ret_from_irq,ret_from_irq会检查need_sched, 如果thread_info->flag的TIF_NEED_RESCHED位置位,则调用函数preempt_schedule_irq()进而调用schedule. need_sched 在N多书里说是task_struct的一个成员,在实际实现的时候,作为thread_info->flag的一个Bit实现的,可以加速访问。

      具体何处会设置need_sched标识,可以搜索函数set_tsk_need_resched(struct task_struct *tsk), set_need_resched(), 前者指定要设置的task,后者是设置current。可见一个主要的地方是在task_running_tick中,task_running_tick是在tick timer的中断中调用的,task_running_tick检查当前运行task的time_slice是否用完,如果用完,且是SCHED_RR,会把当前task放到rq->active的队尾&重新赋值time_slice。 如果是SCHED_FIFO,没time_slice概念。如果不是上面两种realtime的policy,还会将rq->active和expire进行调换。realtime的并不调换,说明在realtime下,如果有高优先级的处于task_running状态,低优先级的永远得不到运行,这和vxworks相同。

         c)从异常返回时也会检查是否need_resched, 具体看代码;

         d) 当进程调用函数,yield, sleep, exit等函数时,这些函数内部也会在改变task状态后,去调用下schedule。其中yield不改变进程状态,是将处理器让给同优先级的任务使用,sleep让给低优先级的使用。

 

4. 如果是SMP方式的多核,做balance的是SCHED_SOFTIRQ。

原创粉丝点击