003 RT-ThreadStudio 线程介绍

线程的概念

        在操作系统中,一个线程就好比做事的某一个人,一个操作系统可以有多个线程,不同的线程完成不同的小人物,他们各司其职,共同协作完成整个系统的大任务。

        首先,讲个故事带入一下,这个故事很重要!!!

        小朋友想要玩黑神话:悟空,但是幼儿园里面只有一个装有七彩虹 RTX 3090 Ti显卡的电脑,但想玩的小朋友很多,那怎么办?

        可爱的幼师小姐姐就想了一个办法:想玩的小朋友要排队,一个一个轮流玩,而且每个人只能玩30分钟,如果还想再玩一次,就得重新排队。这样,听话的小朋友们再可爱的幼师小姐姐的统一调度下开心有序地玩起了国产第一个3A大作——黑神话:悟空。

        回归正题,我们将线程的一系列概念,代入这个故事。

线程调度

        对于单核系统来说,CPU就好比装有3090的电脑;线程就好比游乐场的小朋友,系统中有很多个线程;每个线程的运行都要占用CPU,而CPU只有一个,这样,想让所有线程在操作系统上有序地调度,就需要一个统一的调度者,这个调度者我们称为解调器,在上面的故事中就是幼师小姐姐,而她的工作就是负责线程调度,给不同的线程分配运行时间,使操作系统上的所有线程有序的运行。

        综上所述,线程调度是指按照特定机制为多个线程分配的CPU的使用权。

        常见的线程调度分为:分时调度,抢占式调度。分时调度是所有线程轮流拥有CPU的使用权,平均分配每个线程占用CPU的时间;抢占式调度就是让优先级高的线程优先使用CPU,如果线程的优先级相同,则会像分时调度一样轮流使用CPU。RT-Thread操作系统采用的调度方式是抢占式调度方式。

上下文切换

        继续上面的故事,每个小朋友玩完黑神话:悟空之后都会把自己玩的部分进行存档,下一位小朋友也会打开之前自己的存档,继续玩自己的部分。

        操作系统的调度器在进行线程调度时,会发生上下文切换,从正在运行的线程的上下文,切换到另一个线程的上下文。这相当于从一个程序代码,切换到另一个程序代码,但又不仅是代码的切换,还有上下文的内容,如数据、堆栈、寄存器、程序计数器等也要一起切换。

        如小朋友玩黑神话:悟空,是需要有高配置电脑和自己的存档的,线程的运行也是需要运行环境的。

        对于线程来说,运行环境就是CPU资源,包括运算单元、程序指针、堆栈指针以及各种通用寄存器。当线程运行时,线程会认为自己是以独占CPU资源的方式在运行,会根据自己的需要对这些资源进行修改。

        而CPU的资源只有一套,当另一个线程(B)运行时,它(B)也想独占CPU资源,那么前面已占有CPU资源的线程(A)必须把资源让给后面的线程(B)使用。但它又担心后面的线程(B)把CPU资源修改了,所以(A)在让出资源前,还要做一件重要的事情,就是把它当前的资源使用情况记录下来(这个动作叫做保护现场),方便下次运行重新布置资源。

        总结上一段话:小朋友A正在玩,此时到点了,该让小朋友B玩了,小朋友A在让出电脑之前,保存了自己当前的数据,进行存档,一方便下次打开可以继续玩。小朋友B拿到电脑后,也是打开自己的上一次的存档继续玩,而不是玩小朋友A的存档。

        当另一个线程得到资源后,此时得到的资源的状态可能不适合它运行,因此在运行之前,它必须根据自己的需要把资源重新不知(恢复现场)才能运行。

        这种把CPU资源从一个状态切换到另一个状态的过程,就是上下文切换。

线程的重要性

        线程栈        

        RT-Thread的每一个线程都具有独立的栈,当进行线程切换时,会将当前线程的上下文保护在栈中,当线程恢复运行时,再从栈中读取上下文信息,进行恢复。

        线程栈还用来存放函数中的局部变量,函数中的局部变量从线程栈空间中申请;函数中的局部变量在初始化从寄存器中分配,当这个函数再调用另一个函数时,这些局部变量将放入栈中。

        线程的状态

        同一时间内只允许一个线程在处理器中允许,从运行的过程的过程上过分,线程有多种不同的运行状态。RT-Thread中一共有5中状态。初始状态、就绪状态、运行状态、挂起状态、关闭状态。

        线程优先级

        RT-Thread线程的优先级是表示线程被调度的优先调度。每个线程都具有优先级,线程越重要,赋予的优先级就应越高。

        RT-Thread最大支持256个线程优先级,数值越小优先级越高。在一些资源比较紧张的系统中,可以根据实际情况选择只支持8个或32个优先级的系统配置;对于ARM-M系列,普遍采用32个优先级,最低优先级默认分配给空闲线程使用,用户一般不使用。

        在系统中,当有比当前优先级更高的线程就绪时,当前线程将理科被换出,高优先级线程抢占处理器运行。

        线程时间片

        操作系统的线程也不能一直占用CPU,每个线程都有时间片这个参数,表示线程每次可以占用CPU运行时间,当时间片用完,线程就要让出CPU。但时间片仅对优先级相同的就绪状态有效。系统对优先级相同的就绪状态线程采用时间片轮转的调度方式进行调度。

        时间片起着约束线程单次运行时长的作用,其单位是一个系统节拍(OS Tick)。

        线程的入口函数

        1.无限循环模式
void thread_entry(void *paramenter)
{
    while(1)    
    {
    /*等待事件的发生*/

    /*对事件进行服务、进行处理*/
    }
}
        2.顺序执行或有限次循环模式
static void thread_entry(void *parameter)
{
    /*处理事务 #1*/
    
    /*处理事务 #2*/

    /*处理事务 #3*/

}

RT-Thread命令查看系统线程信息

        两个命令和线程有关,分别是ps和list_thread。这两个命令都可以用于查看系统中存在哪些线程,以及线程的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值