ThreadX线程的执行和调度

任务,进程,线程
嵌入式应用程序面临的一个主要问题就是如何在不同任务中分配处理器。在实时操作系统中,有时用进程和线程来代替任务的使用。进程是一个完全独立的程序有自己的地址空间,线程是一个半独立的程序段,在进程内执行。多个线程共用所属进程的地址空间,线程管理的开支是很小的。

-----------------------------
线程执行
应用程序线程的调度、执行时操作系统最重要的行为。以简单的ThreadX嵌入式操作系统为例,线程是在初始化阶段或线程执行阶段通过动态的调用tx_thread_create来建立的。



在ThreadX中线程有五个状态,即就绪、挂起、执行、停止和完成。线程的就序状态是指其处于待执行的时候。就序的线程直到其优先全最高的时候才能得到执行。当这种情况发生时,ThreadX执行状态已转为执行的线程。
①当一个优先权更高的线程处于就序状态的时候,正在执行的线程退回到就序状态。新的处于就序状态的优先权更高的线程开始执行,同时其状态变为执行。这种在就绪状态和执行状态之间的互相转换在每一次线程抢占发生的时候都会出现。
②在任意一个特定的时刻只有一个线程处于执行状态。
③处于挂起状态的线程不能用来执行,线程挂起的原因包括等待时间、队列消息、时间标志、内存以及基本的线程挂起。一旦等待的原因被移除,线程重新进入就序状态。
④线程处于停止状态将不能被执行。
⑤当线程建立的时候,将被分配一个代表其重要性或优先权的数值。
⑥在程序中线程可以拥有相同的优先权。同时,在运行中线程的优先权可以改变。
⑦ThreadX 对线程的调度基于其优先权。就序状态的优先权最高的线程首先得到执行。
⑧如果相同优先权的多线程同时处于就序状态,则将以先进先出(FIFO)的方式执行。

-----------------------------
线程调度
循环调度(Round-robin scheduling)
此服务给所有拥有相同优先权的就绪线程一个执行的机会。

时间片 (Time-Slicing)
时间片是指线程完全占有处理器的最大的定时器计数的个数。当时间片终止时,所有其它具有相同或更高优先权的线程在时间片已用完的线程再次执行之前得到执行的机会。

抢占 (Preemption)
抢占是指更高优先的线程临时中断正在运行线程的过程。这个过程对正在执行的线程来说是不可见的。当优先权更高的线程执行完后,控制转移回先占发生的地方。这在实时系统中是一个非常重要的特点,因为其可以对重要的程序事件作出快速的反应。抢占入口允许线程定义一个禁止抢占的优先权限度。优先权高于这个限度的仍然允许抢占,优先权低的则不允许。抢占可能引起一系列的问题,包括线程挨饿、超时开支、优先权倒置、死锁等。

-----------------------------
线程堆栈区
每个线程必须有它自己的堆栈来存放其上一次执行的内容和供编译器使用。大多数C编译器用堆栈来调用函数,还用来放置临时的局部变量。下图给出了一个典型的线程堆栈。 堆栈应该多大呢?这是关于线程的一个常被问到的问题。线程的堆栈区应该大到足以放置情况最坏时的函数调用嵌套、局部变量以及存储最后一次的执行内容。

    推荐阅读