Contents

多线程的一些思考

一些问题

  • 双核四线程中的线程与多线程编程中的线程是一种东西吗
  • 线程池预设的是完整的线程吗,可以预设多少,可以全部都并行吗
  • 协程是轻量化的线程,轻在哪

一些概念

  • 进程:是应用程序执行过程中指令的发起者,及资源的申请者;有完整的堆区,栈区,数据区,代码区
  • 线程:是CPU调度和分派的基本单位,线程也有自己的私有数据,比如栈和寄存器
  • 并行:强调的是多条指令开始执行的时间的一致性;执行开始时间的同时性;应与串行相对;描述软件的执行方式;如分布式服务
  • 并发:强调的是下一条指令开始执行的时间可以早于当前指令执行结束时间;执行过程的同时性;用来描述并行方式下的并发过程中产生的问题,如CAP

多核技术及超线程技术 (摘自百度百科 英特尔超线程技术 )

  • 英特尔® 超线程技术是一项硬件创新,允许在每个内核上运行多个线程。更多的线程意味着可以并行完成更多的工作
  • 超线程技术为每个物理处理器设置了两个入口─AS(Architecture State,架构状态)接口,从而使操作系统等软件将其识别为两个逻辑处理器。这两个逻辑处理器像传统处理器一样,都有独立的IA-32架构,它们可以分别进入暂停、中断状态,或直接执行非凡线程,并且每个逻辑处理器都拥有APIC(Advanced Programmable Interrupt Controller,高级可编程中断控制器)
  • 多线程架构
    https://static.duan1v.top/images/20220702191306.png
    multi-process
  • SMT——Simultaneous MultiThreading SMT具有多个执行单元,可以同时运行多条指令,因此才叫做“同步多线程”!CMT和FMT都是在单个执行单元下的技术,不同的线程在指令级别上并不是真正的“并行”,而SMT则具有多个执行单元,同一时间内可以同时执行多个指令,因此前两者有时先归类为 TMT(Temporal MultiThreading,时间多线程),以和SMT相区分
  • 对于非SMT架构的CPU:超线程中的两个逻辑处理器并没有独立的执行单元、整数单元、寄存器甚至缓存等等资源。它们在运行过程中仍需要共用执行单元、缓存和系统总线接口。在执行多线程时两个逻辑处理器均是交替工作,假如两个线程都同时需要某一个资源时,其中一个要暂停并要让出资源,要待那些资源闲置时才能继续。因此,超线程技术所带来的性能提升远不能等同于两个相同时钟频率处理器带来的性能提升。可以说Intel的超线程技术仅可以看做是对单个处理器运算资源的优化利用。而双核心技术则是通过“硬”的物理核心实现多线程工作:每个核心拥有独立的指令集、执行单元,与超线程中所采用的模拟共享机制完全不一样。在操作系统看来,它是实实在在的双处理器,可以同时执行多项任务,能让处理器资源真正实现并行处理模式,其效率和性能提升要比超线程技术要高得多
  • Intel的HyperThreading超线程技术采用的是英特尔专有的同时多线程技术

一些思考

关于执行单元

  • 并行的基本条件是独立的执行单元
  • 概念
    https://static.duan1v.top/images/20220702155013.png
    multi-process

CPU层面的多线程

  • 将物理核心上的功能在软件上独立出来,有不同的架构,SMT则是有着多个执行单元;网传的厨师店员客户模型并不准确,对于SMT架构来说就是有多个厨师

多线程编程

  • 可以看出执行单元才是多线程的难点,多线程编程中,实例化的线程只是线程所需的上下文数据,也就是线程中的栈和寄存器等,所以这个和可用内存有关的,线程上下文实例完成后,需要等待执行单元执行
  • 这是对真正的执行单元的辅助,预加载上下文其实就是io层面进行优化

协程

  • 是轻量化的线程,它依旧需要线程去处理
  • 轻在什么地方?1个是寄存器,协程中只有1个Program Counter,还有两个寄存器Stack Pointer,Base Pointer,而线程中需要的比较多;2个是创建时候的初始栈内存,线程需要1M(64位是2M,线程还需要一个guard page,以划分其他线程),协程需要2k;3个是协程创建是用户级代码层面的,而线程是内核级的
  • 对比多线程编程中的线程,将执行函数所需的上下文进一步独立,以减少切换上下文的资源消耗

所有策略都是为了更好的压榨cpu,让cpu一刻不得闲

  • 多核或多线程相对于单核单线程,是有一个调度的优化,无需在长时间阻塞时一直等待,如io或复杂的计算;
  • 正是由于io问题,多线程编程才有可能提高cpu的利用率;
  • 如果是cpu密集型程序,需要多核并行处理才能提高效率。

本文参考

coffee