请教 RT线程间是何时发生切换

33 views
Skip to first unread message

Hugo Yu

unread,
Aug 2, 2012, 10:36:22 AM8/2/12
to rt-threa...@googlegroups.com
我下载的是最新的trunk代码。

线程间切换调用的是 rt_hw_context_switch 函数, 也就是切换了线程的上下文.
调用顺序如下: 
scheduler.c->rt_schedule()->rt_hw_context_switch(......).

rt_schedule函数分别被如下函数调用过:
rt_thread_startup
rt_thread_yield
rt_thread_sleep
rt_thread_timeout
rt_thread_exit
在ipc.c中也有好些次调用
初步分析,这些函数应该都是被线程自身调用的,和调度器没有关系啊.

问题一:
不明白rt_schedule()函数是何时被调度器相关的代码调用的?

-------------------------------------------------------------------------

初始化线程的时候,最后一个参数是 tick, 关于这个参数的解释如下(见<RT-Thread实时操作系统编程指南, 版本 0.3.0>第51页)
"时间片(tick) 的单位是操作系统的时钟节拍,当系统中存在相同优先级线程时,这个参数指
定线程一次调度能够运行的最大时间长度,这段时间片运行结束后,调度器自动选择下一个就绪
的同优先级线程进行运行。"

问题二:
调度器是随时随地都在监控每个线程的运行时间片么? 如果是,那调度器也是一个线程吗? 它会很频繁的一直运行吗?
如果不是线程,那调度器是如何运行的? 固定周期的中断?

希望能够结合源代码帮我解答上述疑问, 我刚接触RTT,代码还没看懂,非常感谢!




bernard

unread,
Aug 2, 2012, 10:44:19 AM8/2/12
to rt-threa...@googlegroups.com
1. 任务切换由rt_schedule()去触发,所以调度发生在程序需要被调度的时刻。
或者说RTOS是一种“被动调度”,都是由当前任务主动放弃CPU(例如当前任务由于获取不到信号量,任务状态变更为阻塞状态,从而主动放弃CPU,被动地调度到其他任务去)

这个“被动调度”双引号在中断时变成不一样,即中断服务程序中唤醒了其它任务,在中断退出时会切换到其它任务去。

2. 如前面描述的“被动调度”,OS时钟中断也是一种中断,当这个中断发生时可以进行一些额外的事情,例如说唤醒系统中一些任务。系统本身不存在线程,调度器也不是线程。

Himm

unread,
Aug 2, 2012, 11:16:14 AM8/2/12
to rt-threa...@googlegroups.com
谢谢bernard,我还有一些疑问:

1: 如果当前线程需要执行一个特别特别费时的任务,或者不小心写了个死循环的代码,那其他线程就一直得到不响应吗?(假设不存在通过中断唤醒其他任务)
2: 创建线程的时候  tick 这个参数, 设置的是线程一次可以执行的最大时间片,还是线程最多等待被执行的时间片?

在 2012年8月2日星期四UTC+8下午10时44分19秒,bernard写道:

吴洋勇

unread,
Aug 2, 2012, 11:19:27 AM8/2/12
to rt-threa...@googlegroups.com
1. 如果没有任何中断(也没有tick),那么就会一直while(1)下去。
2. 一次可以执行的最大时间片
在编程指南里面有写,请去下载
--
吴洋勇

Himm

unread,
Aug 2, 2012, 6:30:13 PM8/2/12
to rt-threa...@googlegroups.com
2. 一次可以执行的最大时间片
----------------------------------------------------------

如果线程不主动让出CPU,线程就会一直执行,那这个时间片(参数tick)有什么限制作用呢?


在 2012年8月2日星期四UTC+8下午11时19分27秒,aozima写道:

bernard

unread,
Aug 2, 2012, 6:36:32 PM8/2/12
to rt-threa...@googlegroups.com
在 2012年8月3日 上午6:30,Himm <yum...@gmail.com>写道:
2. 一次可以执行的最大时间片
----------------------------------------------------------

如果线程不主动让出CPU,线程就会一直执行,那这个时间片(参数tick)有什么限制作用呢?

线程A、线程B,他们的优先级相同,都处于就绪状态,时间片分别为10,20
那么,线程A执行完10个时间片后,切换到线程B去执行,执行20个时间片后,再回到线程A执行。

Himm

unread,
Aug 2, 2012, 9:32:28 PM8/2/12
to rt-threa...@googlegroups.com
早上我再看了一遍相关代码,发现强制进行进程切换的是 tick 中断函数 rt_hw_timer_handler, 这个是系统定时器,以固定的周期执行,它会调用函数rt_tick_increase().

void rt_tick_increase(void)
{
struct rt_thread *thread;

/* increase the global tick */
++ rt_tick;

/* check time slice */
thread = rt_thread_self();

-- thread->remaining_tick;
if (thread->remaining_tick == 0)
{
/* change to initialized tick */
thread->remaining_tick = thread->init_tick;

/* yield */
rt_thread_yield();      //如果耗尽规定的时间片,则强制发生进程切换。
}

/* check timer */
rt_timer_check();
}

因此,即使一个线程在无限制的while(1)死循环,只要tick中断存在,其他线程还是能够执行的。


在 2012年8月3日星期五UTC+8上午6时36分32秒,bernard写道:

枫孜

unread,
Aug 2, 2012, 11:09:55 PM8/2/12
to rt-threa...@googlegroups.com

线程执行的最大时间片,只在存在同优先级线程时作用。
时间片耗尽,若无更高优先级线程,仍继续执行本线程。

枫孜

unread,
Aug 2, 2012, 11:13:23 PM8/2/12
to rt-threa...@googlegroups.com
更正一下:
线程执行的最大时间片,只在存在同优先级线程时作用。
时间片耗尽,若无同优先级线程,仍继续执行本线程。

 
Reply all
Reply to author
Forward
0 new messages