CHS_06.2.1.6_2+线程的实现方式和多线程模型
CHS_06.2.1.6_2+线程的实现方式和多线程模型
- 知识总览
- 线程的实现方式
- 用户级线程(User-Level Thread, ULT)
- 内核级线程
- 多线程模型
- 一对一模型
- 多对一
- 多对多模型
- 知识回顾
在上个小节中 我们学习了线程相关的一些基本概念 基础的知识
那这个小节中 我们回来看一下有哪几种线程的实现方式 并且会学习几种多线程模型
知识总览
那线程的实现方式分为用户及线程和内核及线程 另外 还有的系统当中会把这两种实现方式都混合起来使用
线程的实现方式
那这个大家一会会看到实际的例子 那首先我们来看一下 第一种线程的实现方式叫做用户级线程
用户级线程(User-Level Thread, ULT)
其实这种实现方式是在早期的操作系统 也就是只支持进程 还暂时没有支持线程的那些操作系统当中
来使用的 当时所谓的线程是由程序员们写的线程库来实现的
也就是说 在这个时代 操作系统的视角看到的其实依然是只有进程
但是程序员们写的这些应用程序当中 可以使用线程库来实现多个线程并发的运行这样的事情
我们还是来结合上小节当中提到的这个例子来进行理解 上个小节中我们提到过
我们的qq可以一边视频聊天一边文字聊天 一边实现文件传输 那上个小节中我们提出了这样的方案
如果要让这三个事情并发的运行的话 那么在不支持线程的系统当中 我们可以分别建立三个进程 这三个进程分别是处理其中的某一个事情
进程一的代码是不断不断的来处理视频聊天这个事情 进程二是不断不断的来处理这个文字聊天 而进程三是处理这个文件传输
那我们可以看到 处理视频聊天的这个代码是在是用这个循环来一遍一遍一遍的不断的执行的
另外的两个代码也一样 所以其实我们可以用这样的方式来实现 让这三段代码并发的运行
我们用一个循环 让它一直不断的循环 然后这个 i 的值会012012这样循环的变化
当 i 等于零的时候 我们可以让这个进程来处理视频聊天
当 i 等于一的时候 让他处理文字聊天 当 i 等于二的时候让他处理文件传输
那由于我们这个程序 进行y循环的速度是非常快的 那我们其实也可以把这三段代码
看作是三段并发的运行的代码 他们分别处理了不同的事情 所以其实如果我们从单纯代码的角度来看的话
那么一个线程 其实我们可以把它理解为是一段代码逻辑 那这个地方提到的这三段代码逻辑 我们就可以把它看作是三个线程 另外 我们这儿写的循环的这个处理逻辑 其实我们就可以把它看成一个最简陋 最弱智的一个线程库
这个线程库完成了对各个线程的一个管理调度的工作 那这个落那 这个弱质线程库对我们的这些线程的调度规则很简单
就是第一次先处理视频 第二次处理文字 第三次处理文件 第四次又处理视频 第五次处理文字等等等等
这个地方 我们用一个简单的while循环和几个if语句就实现了一个最简单最简单最简单的线程库
那我们很多的编程语言都会提供用于管理线程的线程库
不过他们提供的线程库要比我们的外循环复杂多了 程序员可以利用这个线程库来实现这个用户及线程的创建 销毁 调度等等一系列的功能
那接下来 问题来了 在刚才我们所说的这个例子当中 操作系统其实他只看得到进程
而这个进程上处理机运行的时候 其实是程序员自己写了一个线程库来创建了逻辑上的线程
也就是这所谓的用户及线程 那我们来思考这样的几个问题 第一这些用户及线程的管理工作是由谁来完成的
其实我们刚才写的这个while循环就是简单的实现了对这三个线程的管理 让他们交替的运行
所以 用户级线程的管理工作是由应用程序通过线程库来完成的
并不是操作系统负责的第二个问题 线程切换是否需要cpu
从用户态转换为内核态 那经过刚才的分析 这个问题其实也不难回答
我们的线程切换其实是由我们这个循环来控制的 这并不需要涉及到请求操作系统服务之类的事情
所以 线程切换的管理是由我们的线程库应用程序自己完成的
在用户态下就可以完成线程的切换工作 并不需要操作系统的干涉
第三个问题 操作系统是否能意识到用户级线程的存在 那显然操作系统他只能看到这个进程的存在
他只知道这个进程 它是一坨代码 而在这坨代码里面又分别被分为了几个线程 操作系统是意识不到这些线程的存在了
所以 这也是为什么这种线程的实现方式叫做用户及线程的原因
只有用户才能感知到这个用户及现成的存在 而操作系统其实感知不到这些用户及现成的存在
那最后我们要思考的问题是 这种实现方式 它有什么优点和缺点呢
首先来看优点 刚才我们提到过用户级线程的管理工作 包括切换 创建等等 这些工作都不需要请求操作系统的服务 只需要在用户态下就可以完成
也就是说 对用户级线程的管理并不需要涉及到cpu变态这个事情
而之前我们说过cpu变态是有开销 有成本的 所以那既然用户及线程的管理工作不需要cpu切换到内核态 所以对于他们的管理工作 肯定开销是比较小 效率是比较高的
那接下来来看一下用户级线程 这种实现方式有什么缺点 那我们回到我们自己实现的这三个最简单的用户级线程
我们来看一下 假设此时这个qq进程上处理机运行 而这次运行的时候
i 的值是等于零的 也就说视频聊天的这一段代码会上处理机运行
但是 假设视频聊天的这段代码在运行的过程中发生了阻塞
比如说 他想要申请摄像头那个资源 但是申请失败 那么由于他想要的这个系统资源得不到满足 因此这段代码的执行就会被阻塞
那我们想一下 既然这个代码的执行被阻塞在了这个地方 那么这个while循环还能继续下去吗
肯定不行了 对吧 只有这个阻塞被解除之后 这个循环才可以继续执行下去
所以 这种用户级线程的实现方式有一个很明显的缺点 那就是
如果其中的某一个线程被阻塞 那么其他的这些线程也会被阻塞 也没办法执行下去
那从这段伪代码当中 相信不难理解这一点 所以这就是用户级线程这种实现方式最大的一个缺点
只要其中一个被阻塞 那整个进程都会被阻塞 所以这种方式的并发度并不高
另外 虽然上个小节中我们提到过 引入线程之后 线程成为了cpu调度的基本单位
但是 如果这个线程是用用户籍线程这样的方式来实现的话 那么在这种情况下 其实cpu的调度单位依然是进程
操作系统是给进程分配cpu时间的 因此即便我们的电脑是多核处理机
但是 由于进程才是cpu调度的基本单位 因此这个进程只能被分配一个核心
所以 这些线程并不能并行的运行 那这是早期的操作系统当中人们实现线程的方式
在这个阶段 操作系统还只支持进程 并不支持线程 那之后随着操作系统的发展
越来越多操作系统开始支持线程 那操作系统支持的这种线程就叫做内核级线程
内核级线程
那这种内核及线程就是操作系统视角也可以看得到了线程 那现代的操作系统大多都支持内核级线程 比如说我们很熟悉的windows linux等等
那接下来我们还是要思考同样的三个问题 在引入了内核及线程之后 这个线程的管理工作到底是谁来做呢
那由于这个内核及线程是在操作系统层面实现的线程 因此这个内核级线程的管理工作当然是需要由操作系统来完成
第二个问题 线程的切换是否需要cpu状态的转换 那既然这些内核及线程由操作系统负责管理
那他们的切换 他们的管理工作肯定是需要操作系统介入的 因此在进行线程切换的时候 当然是需要从用户态转变为内核态
第三个问题 操作系统是否能够意识到内核级线程的存在 这个不用说了 最后我们根据刚才认知道的这些信息来分析一下
这种实现方式有什么优点和缺点 首先来看优点 如果某一个操作系统 它支持内核及线程的话
那么 在这种操作系统当中 内核级线程 它是处理机调度的基本单位
而进程只作为分配资源的基本单位 因此在多核cpu的环境下
这几个线程可以分别分配到不同的核心下并行的执行 另外呢 不同的内核及线程中可以跑不同的代码逻辑
比如说这个代码逻辑是实现视频聊天 这个是实现文字聊天 这个是实现文件传输 那么 由于内核及线程 它是处理及分配的基本单位 那在这种情况下 即便其中的某一个线程被阻塞 那其他的两个线程依然可以继续执行下去
所以采用这种方式有一个优点 那就是线程之间的并发能力强 那再来看一下这种方式的缺点
当引入了内核级线程之后 那一个进程有可能会对应多个内核级线程
那操作系统需要对这些线程进行管理 所以内核及线程之间的切换是需要cpu从用户台变为内核态的
当切换完成之后 还需要从内核态转回用户态 而之前我们提到过很多次cpu变态 是有成本有开销的
所以这种实现方式会导致现成的管理成本要更高 开销更大 那刚才我们学习了用户级线程和内核级线程这两种线程的实现方式
那这两种方式都有各自的优点和缺点 那有没有可能把这两种方式结合起来呢
那在支持内核级线程的系统当中 如果在引入线程库的话 那么我们就可以实现把若干个用户及线程应设到某一个内核级线程这样的事情
多线程模型
那根据用户级线程和内核级线程的这种映射关系 就引出了三种多线程模型
像刚才我们一直在讲的这种模型 一个用户及线程对应一个内核及线程 这个是一对一模型
一对一模型
那如果采用这种映射方式的话 一个进程 它有多少个用户级线程 就会有多少个内核级线程 它们都是一对应的
那这种方式的优点呢 就是刚才我们提到过的 一个线程被阻塞之后 别的线程还可以继续执行 因为内核级线程是处理及分配的基本单位
另外 这些代码逻辑 这些线程可以分配到多核处理机上并行的执行 这是它的优点
而缺点呢 和刚才我们所说的一样 就是管理的成本高 开销大 因为线程的管理工作肯定需要切换到内核态
那只要涉及到cpu变态 就会使开销变大 那再来看
第二种多线程模型 叫做多对一
多对一
也就是多个用户级线程映射到一个内核级线程 那如果是这种映射关系的话 其实它就退化成了我们之前提到的
纯粹的用户级线程那种实现方式 那由于一个进程只被分配到了一个内核机的线程
而在这个内核级线程上面 通过线程库又实现了三个用户级的线程 因此这些线程的管理工作只需要在用户态下就可以完成
所以线程的管理开销小 效率高 但是缺点呢就是其中的一个用户级线程阻塞之后 会导致其他的用户级线程也跟着被阻塞 并发性不高
并且 这些用户级线程是不可能并行的运行的 因为只有内核级线程才是处理机的分配单位 如果一个进程 它只对应一个内核级线程的话
那么 在同一时刻 这个进程肯定只能被分配一个cpu的核心 当然如果给这个进程分配多个内核级线程的话
那么在多核cpu环境下 这些内核级线程肯定是可以并行的运行的 不过在我们的考试当中
如果提到这种多对一的线程模型的话 那么我们默认一个进程只被分配了一个内科技的线程
那最后 我们要认识的是多对多模型 就是把n个用户级线程映射到m个内核级线程上
多对多模型
n的数量要大于等于m 那在这个模型当中 由于一个进程 它有两个内核级线程
因此 其中一个内核级线程被阻塞的话 另一个内核级线程是可以继续运行下去的 因此它克服了多对一模型并发度不高的缺点
另方面 这种多对多的模型n是大于等于m的 也就是说内核级线程的数量它要比用户级线程的数量要更小
因此 操作系统对这些线程的管理开销也相应的会更小 而在一对一模型当中 有多少个用户极限程就需要给他创建多少个对应的内核级线程
那内核级线程太多的话 操作系统的管理开销就会更大 所以这种方式他又克服了一对一模型当中
线程管理开销太大的一个缺点 那我们再来总结一下用户级线程和内核级线程的
知识回顾
一个区别和联系 我们可以这么难理解所谓用户级线程
我们可以把它理解为是一个代码逻辑的载体 比如说这个用户及现成
它承载的是文字聊天相关的代码逻辑 这个用户及现成它承载的是文件传输相关的代码逻辑
而内核级线程可以理解为是运行机会的一个载体 因为操作系统在分配处理机cpu资源的时候
是以内核级线程为单位进行分配的 所以在这边这个模型当中虽然有三个用户级线程
但是啊 这个进程最多只可能被分配两个cpu的核心
我们的一段代码逻辑只有获得了运行机会的时候 他才可以被cpu执行
那这可以让我们的线程管理有更多的灵活性 比如说在这边这个例子当中 如果我们的qq视频聊天需要耗费比较多的cpu资源的话
那么我们可以让左边这个内核级线程 让他专门来执行视频聊天相关的
这个代码逻辑 而右边这个内核级线程 我们可以让它并发的执行文件传输和文字聊天这两个部分的逻辑
那如果某一个时刻文件传输又要耗费很多的cpu资源的话 那么我们可以把文字聊天这块的逻辑把它映射到这边 让这个内核级线程来进行处理
那需要注意的是 在引入了内核级线程之后 一个进程可能会对应多个内核级线程
而只有所有的这些内核机线程都被阻塞的时候 我们才说这个进程进入了阻塞状态
那需要再次强调的是 用户级线程是在用户视角能看到的 线程由线程库实现
就像那个很简单粗暴的循环 可以认为是一个最简单的线程库 那内核级线程才是操作系统视角能看到到的线程由操作系统
来负责管理 所以内核及现成才是处理及分配的单位 那对于我们介绍这几种多现成模型来说 大家主要是要理解他们各自的优缺点
另外 这个部分的内容比较容易考察 关于阻塞的问题 这个大家在课后习题当中会有体会
好的 那么以上就是这个小节的全部内容
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
相关文章:

CHS_06.2.1.6_2+线程的实现方式和多线程模型
CHS_06.2.1.6_2线程的实现方式和多线程模型 知识总览线程的实现方式用户级线程(User-Level Thread, ULT)内核级线程 多线程模型一对一模型多对一多对多模型 知识回顾 在上个小节中 我们学习了线程相关的一些基本概念 基础的知识 那这个小节中 我们回来看…...

k8s集群配置NodeLocal DNSCache
一、简介 当集群规模较大时,运行的服务非常多,服务之间的频繁进行大量域名解析,CoreDNS将会承受更大的压力,可能会导致如下影响: 延迟增加:有限的coredns服务在解析大量的域名时,会导致解析结果…...
Superpoint Transformer for 3D Scene Instance Segmentation
Abstract 现有的大多数方法通过扩展用于3D物体检测或3D语义分割的模型来实现3D实例分割。然而,这些非直接的方法存在两个缺点:1) 不精确的边界框或不令人满意的语义预测限制了整体3D实例分割框架的性能。2) 现有方法需要一个耗时的中间聚合步骤。为了解决这些问题,本文提出…...
adb调试软件下载 及 常用调试命令
一、软件下载 Windows版本:下载 Mac版本:下载 Linux版本:下载 二、常见调试命令 进入ADB调试 在文件路径栏输入cmd,回车,即可进入adb调试。注意:以下3条不要登录设备 shell (一)显…...

变电站综合自动化监控系统在某物流园35kV变电站中应用
摘 要:Acrel-1000变电站综合自动化系统,是我司根据电力系统自动化及无人值守的要求,总结国内外的研究和生产的先进经验,专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能,可实现无人…...

技术的本质,是解决需求
分享下今日朋友圈精华内容。 很多人在初学时,走了很多弯路,一味追求热门、高性能、高复杂的芯片,或者系统,学了一堆东西,最后连个简单的功能,都实现不了。 大概是忘了,学技术的本质,…...

【刷题】leetcode 1 . 两数之和
两数之和 两数之和1 思路一 (简单突破)2 思路二 (进行优化)3 思路三 (哈希表 我还不会) 谢谢阅读Thanks♪(・ω・)ノ下一篇文章见!!! 两数…...

Sip - Ubuntu 配置 miniSIPServer 服务器(测试用)
客户提供的账号过期了,简单搭建 SIP 服务器,以便测试使用。个人认为这个配置起来最为简单,且测试功能足够。 官网miniSIPServer - 基于 Windows 以及 Linux 平台的 VoIP (SIP) 服务器软件. miniSIPServer 可能是最容易使用的 VoIP(SIP) 服务器…...
SpringCloud openFeign 之 获取被调用服务名
SpringCloud openFeign 之 获取被调用服务名 一. 概述 低版本 feign 只能获取到被调用方法的信息。 只有高版本 feign 才支持获取到被调用服务的信息。 二. 代码实现 package com.zxguan.springcloud2.template.user;import com.zxguan.springcloud2.template.user.config…...
ChatGPT和文心一言哪个更好用?
ChatGPT和文心一言都是基于深度学习技术的自然语言处理模型,它们各自具有优势和局限性,需要根据具体需求进行选择。以下是两者的比较: 算力:ChatGPT由OpenAI开发,具有强大的文本生成能力和语言理解能力,其训…...

第07章_面向对象编程(进阶)拓展练习(关键字:this,继承性和方法重写,关键字:super,多态性,Object类)
文章目录 第07章_面向对象编程(进阶)拓展练习01-关键字:this1、Circle类2、MyDate类3、Card类 02-继承性和方法重写4、Person、Student、Teacher类5、DepositCard、CreditCard类6、Employee、Programmer、Designer、Architect类7、判断输出结…...
小米路由器有线中继模式设置固定IP
第一步 小米路由器切换为有线中继模式后,进电脑版web管理界面,点击中继设置,把web页面地址中apsetting修改为setting(如下)后按回车键加载新页面。 修改前: http://192.168.1.168/cgi-bin/luci/;stokxxxx…...
用python实现给出关键字查找并标注pdf文件中关键字
要在Python中标注PDF文件中的关键字,可以使用Python的PDFMiner库和Python的matplotlib库。 首先,需要安装这两个库。可以使用pip命令进行安装: shell 复制代码 pip install pdfminer.six matplotlib 接下来,可以使用以下代码实现…...

postman自动化接口测试
背景描述 有一个项目要使用postman进行接口测试,接口所需参数有: appid: 应用标识;sign:请求签名,需要使用HMACSHA1加密算法计算,签名串是:{appid}${url}${stamp};stamp࿱…...

React入门 - 04(从编写一个简单的 TodoList 说起)
继上一节我们已经对 React组件和 ”JSX语法“有了大概的了解,这一节我们继续在 react-demo这个工程里编写代码。这一节我们来简单实现一个 TodoList来更加了解编写组件的一些细节。 1、在编辑器中打开 react-demo这个工程 2、打开 index.js文件,将组件 …...
EDM群发的优势
在当今这个数字化的时代,电子邮件营销(EDM)已经成为企业与客户沟通的重要手段。相较于传统的营销方式,EDM群发具有许多独特的优势,使其在商业竞争中占据了不可替代的地位。 首先,EDM群发具有精准的目标定位…...

AI对决:ChatGPT与文心一言的深度比较
. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 引言ChatGPT与文心一言的比较Chatgpt的看法文心一言的看法Copilot的观点chatgpt4.0的回答 模型的自我评价自我评价 ChatGPT的优势在这里插入图片描述 文…...
在国产操作系统下管理Oracle数据库
Oracle公司是全球最大的信息管理软件及服务供应商,其开发的数据库产品因性能卓越而闻名,占有最大的市场份额,被广泛用于各个市场领域。 然而在信创化的时代,国产操作系统已然是大势所趋,但是由于历史原因,…...

RTSP/Onvif安防视频监控平台EasyNVR漏洞扫描及解决方法
视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。安防视频监控平台可提供视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频…...

Ovtio不同版本下载
关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩! 主要专栏内容包括: †《LAMMPS小技巧》: ‾ \textbf…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...

SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...