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

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

3天内不再提示

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

strongerHuang 来源:CSDN技术社区 作者:最后一个bug 2021-04-19 10:06 次阅读

今天为大家讲解讲解OS中的线程、进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。

1、三者整体关系图

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

98d01e38-9ff4-11eb-8b86-12bb97331649.png

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

98dc8b14-9ff4-11eb-8b86-12bb97331649.png

2、详细分析一下

1)并发与并行

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

并行是指令同一时刻一起运行,这种方式一般在多处理器系统中发生。

98e63f38-9ff4-11eb-8b86-12bb97331649.png

2) 进 程

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

98eef6aa-9ff4-11eb-8b86-12bb97331649.png

进程的设计是为了让各个应用程序能够更好的进行隔离,比如在浏览网页突然浏览器奔溃了这不会影响到我的音乐播放器,前面作者发布的OS对内存的管理可以了解到每个进程都会有自己独立的内存空间,并且通过内存管理模块MMU和页表机制各个进程之间形成了隔离。

如果进行多进程的并发势必需要保存当前进程现场信息,比如寄存器,堆栈,更新页表,甚至还需要从外存(比如磁盘中)置换出进程进行运行,这样对于CPU的开销非常大,于是为了减少开销便有了进程内的并发线程。

3) 线 程

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

993e5c5e-9ff4-11eb-8b86-12bb97331649.png

由于线程资源共享,所以各个线程之间是会存在相互的影响,如果一个线程出现奔溃混乱,极大可能会影响到该进程中的其他线程;同时对于共享资源的读写也就会存在竞争问题,那么这样就产生了一系列的共享资源的处理办法,临界区,互斥信号等等。

同时现在目前大部分OS其线程的管理、调度和并发都是通过内核了完成的,这样就会存在较多系统调用以及从用户态到内核态的切换,都会消耗一些时间,为了更进一步减少开销,直接在用户态实现更好的并发就出现了协程概念。

4) 协 程

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

99601aec-9ff4-11eb-8b86-12bb97331649.png

协程的特点:

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

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

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

3、RTOS任务属于多线程

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

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

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

4、最后小节

可能部分小伙伴对于这几个概念还有诸多疑惑,其并不是对这几个概念不理解而是对OS的运行原理有些迷惑,所以大家对这部分感兴趣也可以查找相关书籍进行系统的学习,加油!
编辑:lyn

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

    关注

    21

    文章

    809

    浏览量

    119411
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19646
  • 进程
    +关注

    关注

    0

    文章

    201

    浏览量

    13947

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

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

收藏 人收藏

    评论

    相关推荐

    socket 多线程编程实现方法

    是指在同一个进程运行多个线程,每个线程可以独立执行任务线程共享
    的头像 发表于 11-12 14:16 196次阅读

    Python线程和多进程的区别

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

    为什么RTOS SDK的Rom指针比非OS SDK少?

    我不使用 NON-OS SDK,因为我更喜欢 RTOS 版本。 令我惊讶的是,这些函数在 RTOS SDK 不存在。 有人可以告诉我RTO
    发表于 07-10 07:53

    一句话让你理解线程进程

    今天给大家分享一下线程进程,主要包含以下几部分内容:一句话说明线程进程操作系统为什么需要进程为什么要引入
    的头像 发表于 06-04 08:04 1068次阅读
    一句话让你理解<b class='flag-5'>线程</b>和<b class='flag-5'>进程</b>

    鸿蒙OS开发实例:【ArkTS类库多线程CPU密集型任务TaskPool】

    CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。 基于多
    的头像 发表于 04-01 22:25 787次阅读
    鸿蒙<b class='flag-5'>OS</b>开发实例:【ArkTS类库多<b class='flag-5'>线程</b>CPU密集型<b class='flag-5'>任务</b>TaskPool】

    鸿蒙OS开发实例:【ArkTS类库多线程I/O密集型任务开发】

    使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程其它任务的执行,这时需要使用多
    的头像 发表于 04-01 16:32 453次阅读
    鸿蒙<b class='flag-5'>OS</b>开发实例:【ArkTS类库多<b class='flag-5'>线程</b>I/O密集型<b class='flag-5'>任务</b>开发】

    基于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>

    嵌入式系统线程进程任务概念与区别

    每个线程与主程序共用地址空间,受限于2GB地址空间; 2)线程之间的同步和加锁控制比较麻烦;一个线程的崩溃可能影响到整个程序的稳定性
    发表于 03-04 15:03 1177次阅读
    嵌入式系统<b class='flag-5'>中</b>的<b class='flag-5'>线程</b>、<b class='flag-5'>进程</b>与<b class='flag-5'>任务</b>概念与区别

    线程是什么的基本单位 进程线程的本质区别

    线程是操作系统处理器调度的基本单位,它代表着独立的执行流。在一个进程,可以包含多个线程,这些线程
    的头像 发表于 02-02 16:30 857次阅读

    鸿蒙OS 线程管理开发指导

    场景介绍 如果应用的业务逻辑比较复杂,可能需要创建多个线程来执行多个任务。这种情况下,代码复杂难以维护,任务线程的交互也会更加繁杂。要解决此问题,开发者可以使用“TaskDispat
    的头像 发表于 01-29 16:22 799次阅读

    mcu线程进程的区别是什么

    是程序执行的基本单位,它是进程的一个实体,是进程内的一条执行路径。线程是CPU调度的最小单位,它可以看作是轻量级的进程,不拥有独立的地址空
    的头像 发表于 01-04 10:45 682次阅读

    你还是分不清多进程和多线程吗?一文搞懂!

    同时运行多个独立的进程。每个进程都有自己独立的内存空间,可以同时执行不同的任务。多进程之间通过进程
    的头像 发表于 12-19 16:07 534次阅读

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

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

    如何设定RTOS任务栈(线程栈)大小呢?

    首先说明的是,在 `RT-Thread` ,将本文提及的 `任务` 称之为 `线程`。
    的头像 发表于 12-01 16:40 1813次阅读

    RTOS内功修炼记(一)— 任务到底应该怎么写?

    本篇文章讲述了任务的三大元素:任务控制块、任务栈、任务入口函数,并讲述了编写RTOS任务入口函数
    的头像 发表于 12-01 16:36 706次阅读
    <b class='flag-5'>RTOS</b>内功修炼记(一)— <b class='flag-5'>任务</b>到底应该怎么写?