查看原文
其他

【OS】你知道什么叫 " 超线程 " 吗?

bug菌 最后一个bug 2021-01-31


1、聊一聊

     相信各位小伙伴在各种浩大的场面都会听到过这首bgm,它的名字叫《Victory》,以后玩视频剪辑配乐可别忘记了
    好了,今天为大家带来几个OS相关的概念,详细说明一下线程切换与进程切换的差异,总结了一下个人对任务调度的理解,然后是介绍什么是超线程?让大家有个感性的认识。

2、进程切换与线程切换

    之前作者有发布一篇<【完全解读】RTOS中的任务是线程?进程?还是协程?>,为大家详细介绍了线程与进程的概念,一句话总结为 : 进程是资源分配的最小单位,线程是指令执行的最小单位。(目前大部分单片机大家可以认为就是一个进程)    

    听不懂?作者就再啰嗦一下 : 进程既然是资源分配的基本单元,那么一个进程就拥有一块独立的资源,这里的资源我们暂且就认为是内存,至于其进程内部的单元所使用的内存资源都是要共用其进程的所属资源。线程仅仅是进程的指令部分其操作系统的调度的基本单位也就是线程,不同的OS对于进程和线程的实现上稍许有些差异,不过其广义概念上来讲是没问题的。

分析一下:
  •  进程和线程通过调度器不断的切换就形成了多任务的并发执行,进程切换与线程切换都是为了实现更好的并发,不过进程切换由于需要实现各进程之间的隔离,所以当其被挂起其所属资源、页表项都需要进行保存,同时由于内存资源的变化会导致切换到其他进程其cache命中率下降,引起更多的缺页异常,从而增加了非常多不必要的开销。

  •  而对于线程由于资源共享,保存一下上下文寄存器等即可,这种应该大部分使用RTOS的小伙伴都知道RTOS的调度中保存现场基本上就只需要保存对应的寄存器即可,和这里的线程切换不谋而合,从而我们也看得出来进程切换相对一个进程中的线程切换会给系统任务调度带来更大的开销。

  

3、简单聊聊OS的调度

    上面一小节聊了聊进程切换与线程切换,其实调度就只剩下决策部分了---也就是我们所谓的调度算法,调度算法说白了就是决定最终哪个线程运行的一种决策。

    根据不同的OS需求,肯定会产生不同的调度算法,比如简单的说RTOS中的基于优先级的任务抢占式调度其实就是让用户确定好任务的轻重缓急来进行实时性调度的算法当我们觉得两个任务需要公平竞争也就是优先级一样,便产生了时间片调度算法,每个任务执行一个时间片的内容,当时间片结束便切换到其他任务的时间片等等还有什么先来先服务、短任务优先、多级反馈队列,以及各种组合从而达到性能的平衡。

    那么他们这些调度算法其实都是为了达到一些调度性能指标而诞生的,如下:

  • CPU利用率 : CPU处于运行有效指令的时间占比;

  • 吞吐量 : 一定时间内能够完成的进程个数;

  • 周转时间 : 每个进程从起始到一轮结束的总时间;

  • 等待时间 : 进程结束到下一次运行时间;

  • 响应时间 : 当事件发生到进程处理的最长时间;

  • 。。。

    根据用户的需求和使用背景,真个是无穷尽也,这也是为什么如今OS多种多样,并且在不同领域不同的OS占比个不同的原因。

4、超线程

    超线程其实属于一种硬件并行技术,我们都知道单个CPU一般都是取指令-->译码-->执行指令,然而不同的指令将会使用到不同的处理单元,比如说我们执行一个整形计算,那么CPU肯定不会无缘无故的使用大浮点运算单元(fpu),设计师们看到这样设计的CPU中好像很多单元都比较闲,于是想着再加一个处理单元看是否可以在进行整形运算的时候,顺便并行把浮点运算也运算了,于是便产生了超线程设计。

    为什么叫超线程(Super-Thread)不叫超进程呢 ? 第二小节回答得非常明白了。所以这样看来一个CPU可以同时执行两条指令,那岂不是由一个核变成了两个核 ? 所以几年前买电脑的小伙伴不清楚这个概念的时候,店家统一把"线程数"说成"核心数",还跟你打开下图界面:

    你可能还暗自欣喜以较低的价位买到了4核电脑,不知过了多少天偶然之间跟同事或者同学比较电脑配置,上面写着双核四线程,才知道当初买电脑的时候被套路了,并非真四核电脑,下面为大家分析一下单核超线程的优劣:

超线程优劣:
  •  超线程毕竟是模拟,当两个线程同时访问到一个资源的时候需要把其中一个线程挂起,所以相比真双核肯定要慢的。

  • 一定相比单核性能会加快吗 ? 这个问题需要具体情况具体分析,毕竟超线程是一种复用技术,根据CPU负载率的不同,处理指令的不同,CPU真核个数与进程的比例情况都会影响到两者的比较,不过整体上性能会得到较大提升。

  • 会增加相关软件的设计难度,毕竟伪双核其处理的相对单核复杂。

5、最后小结

    今天就为大家讲解这么多知识内容吧,大家先形成一种感性的认识,以后阅读相应的源码回想起作者的一些分享,应该会有一种豁然开朗的感觉。

    好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。同时非常感谢各位小伙伴的支持,我们下期精彩见!

推荐好文  点击蓝色字体即可跳转

【√】以后复位芯片,数据再也不会丢了(理论篇)

【涨知识】OS下的内存使用原来这么复杂

【√】以后复位芯片,数据再也不会丢了(实战篇)

【重磅】剖析MCU的IAP升级软件设计(设计思路篇)

☞ 【典藏】别怪"浮点数"太坑(C语言版本)

GUI必备知识之“告别”乱码(浅显易懂)

【典藏】大佬们都在用的结构体进阶小技巧

【经典】把脉printf中的C进阶技巧

【典藏】自制小型GUI界面框架(设计思想篇)

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存