|
【RT-Thread读书笔记】10. RT-Thread 学习17章读后感
[复制链接]
第17章 线程管理17.1 线程的基本概念
线程是RTOS的精髓,小到嵌入式OS大到桌面电脑服务器的OS,linux/windows等都有线程概念,线程是处理任务的基本单元。常常听Intel的超线程,1个CPU内可以运行2个线程,只有i7支持,逻辑核多了1个。
其实,线程的概念是软件层面的,硬件层面就是执行code, 执行指令。
好了闲话不多说,直接回答书上。
这一章主要涉及线程管理,因此首先回顾了一下线程的基本概念,这里要说的是栈对线程切换的意义,所有线程都需要堆栈来保存其上下文。堆是一个完全二叉树,堆的性质决定了堆在RTOS是一个重要的数据结构,大家可以再温习一下数据结构。
另外:RT-Thread中的线程是抢占式调度机制,同时支持时间片轮转调度方式。高优先级的线程可打断低优先级线程,低优先级线程必须在高优先级线程阻塞或结束后才能得到调度。
17.2 线程调度器的基本概念
RT-Thread中提供的线程调度器是基于优先级的全抢占式调度:在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身。
RT-Thread内核中采用了基于位图的优先级算法(时间复杂度O(1),即与就绪线程的多少无关),通过位图的定位快速的获得优先级最高的线程,具体见10.1.1 小节。 这一点不得不说,确实非常巧妙,否则,查找优先级最高的线程就会耗费大量的时间,造成OS实时性降低。
RT-Thread内核中也允许创建相同优先级的线程。相同优先级的线程采用时间片轮转方式进行调度(也就是通常说的分时调度器),时间片轮转调度仅在当前系统中无更高优先级就绪线程存在的情况下才有效。
RT-Thread系统中的每一线程都有多种运行状态。系统初始化完成后,创建的线程就可以在系统中竞争一定的资源,由内核进行调度。
线程状态通常分为以下四种:初始态(RT_THREAD_INIT)、就绪态(RT_THREAD_READY)、运行态(RT_THREAD_RUNNING)、挂起态(RT_THREAD_SUSPEND)、关闭态(RT_THREAD_CLOSE)。
17.6 线程的设计要点
在设计之初就应该考虑下面几点因素:线程运行的上下文环境、线程的执行时间合理设计。
中断服务函数是一种需要特别注意的上下文环境,它运行在非线程的执行环境下(一般为芯片的一种特殊运行模式(也被称作特权模式)),在这个上下文环境中不能使用挂起当前线程的操作,不允许调用任何会阻塞运行的API函数接口。另外需要注意的是,中断服务程序最好保持精简短小,快进快出,一般在中断服务函数中只做标记事件的发生,让对应线程去执行相关处理,因为中断服务函数的优先级高于任何优先级的线程,如果中断处理时间过长,将会导致整个系统的线程无法正常运行。所以在设计的时候必须考虑中断的频率、中断的处理时间等重要因素,以便配合对应中断处理线程的工作。
线程的程序不能出现了死循环操作(此处的死循环是指没有不带阻塞机制的线程循环体),那么比这个线程优先级低的线程都将无法执行,当然也包括了空闲线程,因为死循环的时候,线程不会主动让出CPU,低优先级的线程是不可能得到CPU的使用权的,而高优先级的线程就可以抢占CPU。
空闲线程(idle线程)是RT-Thread系统中没有其他工作进行时自动进入的系统线程。用户可以通过空闲线程钩子方式,在空闲线程上钩入自己的功能函数。通常这个空闲线程钩子能够完成一些额外的特殊功能,例如系统运行状态的指示,系统省电模式等。除了空闲线程钩子,RT-Thread系统还把空闲线程用于一些其他的功能,比如当系统删除一个线程或一个动态线程运行结束时,会先行更改线程状态为非调度状态,然后挂入一个待回收队列中,真正的系统资源回收工作在空闲线程完成,空闲线程是唯一不允许出现阻塞情况的线程,因为RT-Thread需要保证系统用于都有一个可运行的线程。
此内容由EEWORLD论坛网友传媒学子原创,如需转载或用于商业用途需征得作者同意并注明出处
|
|