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

    文章

    16977

    浏览量

    350215
  • Linux
    +关注

    关注

    87

    文章

    11219

    浏览量

    208872
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119410
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19646
  • 进程
    +关注

    关注

    0

    文章

    201

    浏览量

    13947

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

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

收藏 人收藏

    评论

    相关推荐

    进程线程的区别

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

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

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

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

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

    线程有什么区别

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

    进程线程定义

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

    线程进程的关系与区别

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

    进程线程分别是什么,它们的区别是什么

    线程的区别是什么?有什么关系?相信大家对于进程都很熟悉了吧,而线程相对于进程而言,是一个更加接近于执行体的概念,为了让大家更好的了解
    发表于 03-24 17:26 9369次阅读
    <b class='flag-5'>进程</b>和<b class='flag-5'>线程</b>分别是什么,它们的区别是什么

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

    今天为大家讲解讲解OS线程进程和协的这几个概念,同时一起看看RTOS
    的头像 发表于 04-19 10:06 3162次阅读
    浅析OS<b class='flag-5'>中</b>的<b class='flag-5'>线程</b>、<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 1825次阅读
    Linux下<b class='flag-5'>线程</b>与<b class='flag-5'>进程</b>的区别

    详解Linux线程线程与异步编程、协与异步

    不是系统级线程,很多时候协被称为“轻量级线程”、“微线程”、“纤(fiber)”等。简单
    的头像 发表于 03-16 15:49 942次阅读

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

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

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

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

    Linux中进程线程和协的基础概念

    进程是计算机运行的程序的实例,它是操作系统中最基本的执行单元之一。每个进程都有自己的独立内存空间、系统资源和代码执行流。这意味着一个进程的崩溃通常不会影响其他
    的头像 发表于 12-06 09:22 782次阅读

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

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

    Python线程和多进程的区别

    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python线程与多
    的头像 发表于 10-23 11:48 306次阅读
    Python<b class='flag-5'>中</b>多<b class='flag-5'>线程</b>和多<b class='flag-5'>进程</b>的区别