多线程模型浅谈

devtools/2025/1/17 6:00:33/

优质博文:IT-BLOG-CN

笔者近期在维护的项目中发现了一些比较随机的问题,时有时无的,排查之后发现是使用多线程导致的,恍然之下研究了下多线程的底层模型相关知识,现不大家简要分享下。

一个程序进程可包含多个线程,线程为进程中代码的不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。

而线程模型就是根据内核线程和用户线程之间的映射关系区分出来的。内核线程指需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销。

内核维护进程及线程的上下文信息以及线程切换。内核线程的线程表位于内核中,包括了线程控制快(TCB),一旦线程阻塞,内核会从当前或者其他进程中重新选择一个线程保证程序的执行。用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程
的函数来控制用户线程。那么根据这两者之间的映射关系,有以下三种模型:

1:1模型:用户线程不内核线程内核线程是一对一(1 : 1)的映射模型,也就是每一个用户线程绑定一个实际的内核线程,而线程的调度则完全交付给操作系统内核去做,应用程序对线程的创建、终止以及同步都基于内核提供的系统调用来完成。

大部分编程语言的线程库比如Java的java.lang.Thread是对操作系统的线程(内核级线程)的一层封装,创建出来的每个线程不一个独立的内核线程静态绑定,因此其调度完全由操作系统内核调度器去做。所以java线程如果出现死锁,或者饥饿会导致系统很大开销,因为他使用native调用系统调用,fork出来的内核线程。

这种模型的优势和劣势同样明显:优势是实现简单,直接借助操作系统内核的线程以及调度器,所以CPU可以快速切换调度线程,于是多个线程可以同时运行,因此相较于用户级线程模型它真正做到了并行处理;但它的劣势是,由于直接借助了操作系统内核来创建、销毁和以及多个线程之间的上下文切换和调度,因此资源成本大幅上
涨,且对性能影响很大。

N:1模型:用户线程不内核线程是多对一(N : 1)的映射模型,多个用户线程的一般从属于单个进程并且多线程的调度是由用户自己的线程库来完成,线程的创建、销毁以及多线程之间的卋调等操作都是由用户自己的线程库来负责而无项借助系统调用来实现。

一个进程中所有创建的线程都只和同一个内核线程在运行时动态绑定,也就是说,操作系统只知道用户进程而对其中的线程是无感知的,内核的所有调度都是基于用户进程。由于线程调度是在用户层面完成的,也就是相较于内核调度不需要让CPU在用户态和内核态之间切换,这种实现方式相比内核级线程可以做的很轻量级,对系统资
源的消耗会小很多,因此可以创建的线程数量与上下文切换所花费的代价也会小得多。

但该模型有个原罪:当多线程并发执行时,如果其中一个线程执行IO操作时,内核接管这个操作,如果IO阻塞,用户态的其他线程都会被阻塞,因为这些线程都对应同一个内核调度实体。

在多处理器机器上,内核不知道用户态有这些线程,无法把它们调度到其他处理器,也无法通过优先级来调度。这对线程的使用是没有意义的!

N:M混合模型: 多路复用多个用户级线程到同样数量或更少数量的内核线程。内核线程的数量可能不特定应用程序或特定机器有关(应用程序在多处理器上比在单处理器上可能分配到更多数量的线程)。

混合模型是博采众长之后的产物,充分吸收前两种线程模型的优点且尽量规避它们的缺点。在此模型下,用户线程不内核线程是多对多(N : M)的映射模型:

首先,区别于用户级线程模型,混合模型中的一个进程可以不多个内核线程内核线程关联,于是进程内的多个线程可以绑定不同的内核线程,这点和内核级线程模型相似;

其次,又区别于内核级线程模型,它的进程里的所有线程并不与内核线程一一绑定,而是可以动态绑定同一个内核线程,当某个内核线程因为其绑定的线程的阻塞操作被内核调度出CPU时,其关联的进程中其余用户线程可以重新与其他内核线程绑定运行。

所以,混合模型既不是用户级线程模型那种完全靠自己调度的也不是内核级线程模型完全靠操作系统调度的,而是中间态(自身调度不系统调度卋同巟作),因为这种模型的高度复杂性,而且并不是所有操作系统都支持多对多的混合模型,操作系统内核开发者一般不会使用(Linux的Native POSIXThreads Library就因为其复杂性pass掉了这种实现方式,但是 Solaris JDK 又实现了在Solaris 下的混合多对多模型),所以更多时候是作为第三方库的形式出现。

在这里插入图片描述


http://www.ppmy.cn/devtools/26447.html

相关文章

(学习日记)2024.05.06:UCOSIII第六十节:User文件夹函数概览(uCOS-III->Source文件夹)第六部分

之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。 回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后,经过几经思考,最后决定自己锦上添花,再续上几章。 这…

C# Onnx YOLOv8_Blackjack

C# Onnx YOLOv8_Blackjack 目录 效果 模型 项目 代码 下载 效果 模型 Model Properties ------------------------- date:2024-04-23T17:17:10.378224 description:Ultralytics YOLOv8_Blackjack model trained on data.yaml author:U…

Milvus Cloud 向量数据库Reranker成本比较和使用场景

成本比较:向量检索 v.s. Cross-encoder Reranker v.s. 大模型生成 虽然 Reranker 的使用成本远高于单纯使用向量检索的成本,但它仍然比使用 LLM 为同等数量文档生成答案的成本要低。在 RAG 架构中,Reranker 可以筛选向量搜索的初步结果,丢弃掉与查询相关性低的文档,从而有…

Windows使用SSH登录本机Linux虚拟机

SSH(Secure Shell),一种网络协议,可以在安全外壳下实现数据传输通信,所以主要用于计算机间加密登录,可以简单理解为远程控制。除了计算机间直接互联,在git中也可以看到,常见的协议有…

如何使用dlib库进行目标跟踪

dlib 库本身并不直接提供目标跟踪的功能。目标跟踪是计算机视觉领域的一个独立任务,通常涉及对视频序列中的特定目标(如人脸、车辆、行人等)进行持续的识别和定位。然而,dlib 库中的某些组件(如人脸检测器、HOG特征提取…

交叉调制少样本图像生成用于结直肠组织分类

文章目录 Cross-Modulated Few-Shot Image Generation for Colorectal Tissue Classification摘要方法实验结果 Cross-Modulated Few-Shot Image Generation for Colorectal Tissue Classification 摘要 提出问题: 针对罕见癌症组织的组织病理训练数据稀缺问题&…

BuddyPress 中文汉化包,WordPress插件

汉化包下载地址:BuddyPress 中文汉化包.zip BuddyPress 社区插件 BuddyPress 是一款开源免费有趣灵活的社区、团队社交软件。BuddyPress 可以用来创建属于你的社交网络,帮助您使用 WordPress 构建任何类型的社区网站。 安装方法:下载解压后…

美国国防部数据网格参考架构概述(上)

文章目录 前言一、概述二、DRMA基本概念三、DRMA的能力视图与运行视图前言 美国国防部正在努力成为“一个以数据为中心的组织,以速度和规模优势使用数据,从而获得作战优势并提高效率。”企业数据网格服务(又称数据集成层)是美国国防部首席数字与人工智能办公室(CDAO)为支…