0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTOS中的线程、进程和协程详解

strongerHuang 来源:strongerHuang 2023-11-09 12:36 次阅读

转自 |最后一个bug

看到有小伙伴在讨论【RTOS任务属于线程还是进程】的话题,这里就来分析一下OS中的线程、进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。

三者关系

很多小伙伴在学习OS的过程中会遇到各种程序形态,比如说进程、线程、协程、管程、纤程,oh my god!要是对他们不熟悉还真分辨不清楚,今天作者主要是把大家平时最常遇到的进程、线程和协程这三个概念讲一讲,其他形态作者后续再慢慢补充相关文章,下面我们简单看一下windows里面的进程(Linux也是类似的),如下图所示:

e3ec001c-7eae-11ee-939d-92fbcf53809c.png

我们可以发现每行表示一个进程,同时一个进程包含多个线程,那么进程、线程和协程的关系到底是怎样的呢?作者这里画了个简图,供大家参考。

e3f874f0-7eae-11ee-939d-92fbcf53809c.png

对比分析

1)并发与并行

在讲解进程之前我们先看看并发与并行的概念,并发字面上的意思就是一起发生,在乎的是一种感觉,对于单核CPU而言其对指令的处理都是顺序执行,只是说类似于一种时间上分时交替处理,给用户的一同发生的表象,这就是并发。 并行是指令同一时刻一起运行,这种方式一般在多处理器系统中发生。

e405e72a-7eae-11ee-939d-92fbcf53809c.png

2) 进 程

进程是一种程序的动态执行过程,进程对CPU并不是独占连续执行的,OS管理着进程需要经常打断当前的进程,并对多个进程进行监控调度等,那么在内核中就有一个结构体叫做进程控制块PCB(学RTOS应该听过任务控制块TCB,后面会提到)-(Process Control Block),该结构体包含了该进程几乎所有的信息和资源,那么OS也就是通过这个控制块来获得进程信息并管理进程。

e417ca9e-7eae-11ee-939d-92fbcf53809c.png

进程的设计是为了让各个应用程序能够更好的进行隔离,比如在浏览网页突然浏览器奔溃了这不会影响到我的音乐播放器,前面作者发布的OS对内存的管理可以了解到每个进程都会有自己独立的内存空间,并且通过内存管理模块MMU和页表机制各个进程之间形成了隔离。 如果进行多进程的并发势必需要保存当前进程现场信息,比如寄存器,堆栈,更新页表,甚至还需要从外存(比如磁盘中)置换出进程进行运行,这样对于CPU的开销非常大,于是为了减少开销便有了进程内的并发线程。

3)线 程

进程的目的是隔离并发,可以说线程是实现的共享并发,所有的线程都是共用属于进程的资源,线程是进程指令流的剥离,同样线程有对应的结构体信息管理TCB类似于RTOS中的TCB。

e42052b8-7eae-11ee-939d-92fbcf53809c.png

由于线程资源共享,所以各个线程之间是会存在相互的影响,如果一个线程出现奔溃混乱,极大可能会影响到该进程中的其他线程;同时对于共享资源的读写也就会存在竞争问题,那么这样就产生了一系列的共享资源的处理办法,临界区,互斥信号等等。 同时现在目前大部分OS其线程的管理、调度和并发都是通过内核了完成的,这样就会存在较多系统调用以及从用户态到内核态的切换,都会消耗一些时间,为了更进一步减少开销,直接在用户态实现更好的并发就出现了协程概念。

4) 协 程

之前的总览关系图我们也知道一个线程里面可以运行多个协程,其实函数调用就是一种状态为初态的协程,A函数中调用B函数,可以认为是A任务切换到B任务来执行,然后执行完回到A任务,不过这样调用的任务始终是从初始状态开始,如果一个函数主动放弃CPU通过保存当前现场,比如寄存器值等,然后恢复到另外一个函数的寄存器状态,便实现了任意状态函数的并发执行,就实现了协程。好吧,解释得有点绕,画个图理解理解:

e42ee2f6-7eae-11ee-939d-92fbcf53809c.png

协程的特点:

协程是用户态执行的并发,相对线程开销要小;

协程主动放弃占用,对相关资源不需要进行锁处理;

非常适合IO密集型任务,比如非常经典的生产者与消费者的双线程模式,如果用协程,生产出来以后立马让步给消费者进行处理,效率非常高。

RTOS任务属于多线程

对于目前主流的RTOS,比如ucosfreeRTOSRT-thread等等,都是属于并发的线程,其实从RT-thread名字上看,其表示的就是实时的线程。

首先对于MCU上的资源每个任务都是共享的,可以认为是单进程多线程模型。

MCU一般没有内存管理模块MMU等等,这样无法很好的实现进程的安全,如果用软件实现,开销太大,对于MCU没有太多的必要,这也是为什么我们当个任务程序跑飞会导致整个程序无法运行的原因。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16017

    浏览量

    343627
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206736
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118796
  • 线程
    +关注

    关注

    0

    文章

    489

    浏览量

    19495
  • 进程
    +关注

    关注

    0

    文章

    193

    浏览量

    13876

原文标题:RTOS任务属于线程、进程、还是协程?

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    进程线程的区别

    系统对应用的并发性。进程线程的区别在于:简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线
    发表于 12-12 09:28

    【MiCOKit试用体验】庆科MiCO系统篇(1)MiCO RTOS线程

    2mico_rtos_delete_thread删除进程,使之进入终止状态,并在IDLE线程清除资源3mico_rtos_suspend_
    发表于 10-24 16:26

    线程进程、程序的区别

    ,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程
    发表于 03-23 13:09

    进程线程的区别和联系介绍

    的操作系统,通常一个进程都有若干个线程,至少需要一个线 。下面,我们从调度、并发性、 系统开销、拥有资源等方面,来比较线程
    发表于 07-04 00:18

    线程进程有什么相同与不同之处

    (c) 线程和子进程共享父进程的资源;线程和子进程独立于它们的父
    发表于 08-05 08:09

    请问uCOS-II的任务是进程还是线程

    的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享
    发表于 06-03 05:07

    线程有什么区别

    线程的区别协线程的共同目的之一是实现系统资源的上下文调用,不过它们的实现层级不同;线程(Thraed)是比
    发表于 12-10 06:23

    LEDs状态灯任务(线程)设计 (基于RTOS

    LEDs状态灯任务(线程)设计(基于RTOS
    的头像 发表于 03-12 11:30 2055次阅读

    进程线程定义

    线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程进程中一个单一顺序的控制流,一个
    的头像 发表于 11-20 10:23 2393次阅读

    线程进程的关系与区别

    线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程进程中一个单一顺序的控制流,一个
    的头像 发表于 11-29 11:01 1.3w次阅读

    浅析OS中的线程进程和协程与RTOS任务属于那种

    今天为大家讲解讲解OS中的线程进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。
    的头像 发表于 04-19 10:06 2798次阅读
    浅析OS中的<b class='flag-5'>线程</b>、<b class='flag-5'>进程</b><b class='flag-5'>和协</b>程与<b class='flag-5'>RTOS</b>任务属于那种

    Linux下线程进程的区别

    线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序
    的头像 发表于 08-24 15:37 1630次阅读
    Linux下<b class='flag-5'>线程</b>与<b class='flag-5'>进程</b>的区别

    RTOS中的任务是线程进程?还是协程?

    今天为大家讲解讲解OS中的线程进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。
    的头像 发表于 06-04 17:19 1231次阅读
    <b class='flag-5'>RTOS</b>中的任务是<b class='flag-5'>线程</b>?<b class='flag-5'>进程</b>?还是协程?

    关于Python多进程和多线程详解

    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程
    的头像 发表于 11-06 14:46 307次阅读
    关于Python多<b class='flag-5'>进程</b>和多<b class='flag-5'>线程</b><b class='flag-5'>详解</b>

    基于RTOS的应用进程中的典型线程

    RTOS中的关键因素是最小的中断延迟和最小的线程切换延迟。RTOS的价值在于它的响应速度或可预测性,而不是它在给定时间段内可以执行的工作量。
    发表于 03-05 09:32 115次阅读
    基于<b class='flag-5'>RTOS</b>的应用<b class='flag-5'>进程</b>中的典型<b class='flag-5'>线程</b>