操作系统基础---多线程
文章目录
- 操作系统基础---多线程
 - 1.为何引入线程
 - 程序并发的时空开销
 - 线程的设计思路
 - 线程的状态和线程控制块TCB
 
- 2.线程与进程的比较
 - 3.线程的实现⭐
 - 1.内核支持线程KST
 - 2.用户级线程
 - 3.组合方式
 
操作系统基础—多线程
1.为何引入线程
利用传统的进程概念和设计方法已经难以设计出适合于SMP(多对称处理机)结构计算机系统的OS,其根本原因在于多处理机环境下进程的创建,调度,分配所花费的时空开销太大,引入线程,以线程作为调度和分派的基本单位可以提升系统的并发性,改善多处理机系统的性能。
程序并发的时空开销
1.创建进程:系统在创建一个进程时,必须为它分配其所必须的,除处理机外的所有资源,如内存空间,IO设备,以及建立相应的PCB。
2.撤销进程:系统在撤销进程时,必须先对其所占有的资源执行回收操作,然后再撤销PCB;
3.进程切换:对进程进行上下文切换时,需要保留当前进程的CPU环境,设置新选中的CPU环境,需要花费不少处理机时间。
线程的设计思路
设法将进程的两个属性分开,即:不把作为调度和分派的基本单位也同时作为拥有资源的单位,以做到“轻装上阵”;而对于拥有资源的基本单位,又不对之施以频繁的切换。
线程的状态和线程控制块TCB
线程运行的三个状态:
- 1)执行状态:线程已获得处理机而正在运行
 - 2)就绪状态:线程已获得除处理机外的所有执行条件,获得处理机后可立即执行
 - 3)阻塞状态:线程在执行中因某事件受阻而处于暂停状态
 
线程控制块TCB
- ①线程标识符
 - ②一组寄存器
 - ③线程运行状态
 - ④优先级
 - ⑤线程专有存储区
 - ⑥信号屏蔽
 - ⑦堆栈指针
 
2.线程与进程的比较
1.调度的基本单位
 在引入线程的OS中,已把线程作为调度和分派的基本单位,当线程切换时,仅需保存和设置少量寄存器内容,切换代价远低于进程。在同一进程中,线程的切换不会引起进程的切换,但从一个进程的线程切换到另一个进程的线程时,必然会引起进程的切换。
2.并发性
 在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,甚至允许一个进程中的所有线程都能并发执行,不同进程中的线程也能并发执行。使OS具有了更好的 并发性。
3.拥有资源
 进程可以拥有资源,并作为系统中拥有资源的一个基本单位。然而,线程本身并不拥有资源,而是仅有一点必不可少的,能保证独立运行的资源。每个线程中都应具有一个用于控制线程运行的线程控制块TCB,用于指示被执行指令序列的程序计数器,保留局部变量,少数状态参数和返回地址等的一组寄存器和堆栈。
 多个线程可以共享该进程所拥有的资源,属于同一进程的所有线程都具有相同的地址空间,线程可以访问该地址空间中的每一个虚地址;此外,还可以访问进程所拥有的资源,如已打开的文件,定时器,信号量机构等的内存空间和它所申请的IO设备等。
4.独立性
 同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。为防止进程之间彼此干扰和破坏,每个进程都拥有一个独立的地址空间和其它资源,除了共享全局变量外,不允许其它进程访问。但是同一进程的不同线程往往为了提高并发性以及进行相互之间的合作而创建的,它们共享进程的内存地址空间和资源,如每个线程都可以访问它们所属进程地址空间中的所有地址,一个线程的堆栈可以被其它线程读,写,甚至完全清除。由一个线程打开的文件可以供其它线程读,写。
5.系统开销
 在创建或撤销进程时,系统都要为之分配和回收进程控制块,分配或回收其它资源,如内存空间和IO设备等。OS为此所付出的开销明显大于线程创建或撤销时所付出的开销。此外由于一个进程中多个线程具有相同的地址空间,线程之间的同步和通信也比进程的简单。因此一些OS中,线程的切换,同步和通信都无需操作系统内核的干预。
6.支持多处理机系统
 在多处理机系统中,单线程进程只能在一个处理机上运行,但多线程进程可以将一个进程中的多个线程分配到多个处理机上,使它们并行执行。
多线程OS中的进程:
- 在多线程OS中,进程仍是作为系统资源分配的基本单位
 - 一个进程内的多个线程可并发执行
 - 进程已不是可执行的实体:多线程OS中把线程作为独立运行的基本单位,此时进曾不再是基本可执行实体。
 - 但进程仍具有与执行相关的状态: 
- 进程执行状态:实际上指该进程的某线程正在执行
 - 将某进程挂起:实际上将该进程的所有线程也挂起
 - 将某进程激活:实际上将该进程的所有线程也激活
 
 
3.线程的实现⭐
1.内核支持线程KST
概念介绍:
 kST——Kernel Supported Threads
 内核支持线程KST是在内核的支持下运行的,它们的创建,阻塞,撤销和切换等,都是在内核空间实现的。为了对内核线程进行控制和管理,在内核空间为每一个内核线程设置了一个线程控制块,内核根据该控制块而感知某线程的存在,并对其加以控制。当前大多数OS都支持内核支持线程。
内核支持线程的优点:
- ①在多处理器系统中,内核能够同时调度同一进程中的多个线程并行执行;
 - ②如果进程中的一个线程被阻塞了,内核可以调度该进程中的其它线程占有处理器运行,也可以运行其它进程中的线程;
 - ③内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小;
 - ④内核本身也可采用多线程技术,可提高系统的执行速度和效率。
 
内核支持线程的缺点:
- 对于用户的线程切换而言,其模式切换的开销较大,在同一个进程中,从一个线程切换到另一个线程时,需要从用户态转到核心态进行,这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核实现的,系统开销较大。
 
内核支持线程的实现
系统在创建一个新进程时,便为它分配一个任务数据区PTDA(Per Task Data Area),其中包括若干个线程控制块TCB空间。
 在每一个TCB中可保存线程标识符,优先级,线程运行的CPU状态等信息。
 这些信息与用户级线程TCB中的信息相同,但是现在却是被保存在内核空间当中。
 每当进程要创建一个线程时,便为新线程分配一个TCB,将有关信息填入该TCB中,并为之分配必要的资源。内核支持线程的调度和切换与进程的调度和切换十分相似。
2.用户级线程
概念介绍:
 用户级线程是在用户空间中实现的。对于线程的创建,撤销,同步与通信等功能,都无需内核的支持,即用户级线程是与内核无关的。在一个系统中的用户级线程的数目可以达到数百个至数千个。由于这些线程的任务控制块都是设置在用户空间,而线程所执行的操作也无需内核的帮助,因而内核完全不知道用户级线程的存在。
 注:对于设置了用户级线程的系统,其调度仍是以进程为单位进行的。
 而内核支持线程调度是以线程为单位进行的
用户级线程的优点:
- ①线程切换不需要转移到内核空间。对一个进程而言,所有线程的管理数据结构均在该进程的用户空间中,管理线程切换的线程库也在用户地址空间运行,因此进程不必切换到内核方式来做线程管理,从而节省了模式切换的开销。
 - ②调度算法可以是进程专用的。在不干扰OS调度的情况下,不同的进程可以根据自身需要选择不同的调度算法,对自己的线程进行管理和调度,而与OS的低级调度算法是无关的。
 - ③用户级线程的实现与OS平台无关。因为对于线程管理的代码是属于用户程序的一部分,所有的应用程序都可以对之进行共享。因此,用户级线程甚至可以在不支持线程机制的操作系统平台上实现。
 
用户级线程的缺点:
- ①系统调用的阻塞问题
 - ②在单纯的用户级线程实现方式中,多线程应用不能利用多处理机进行多重处理的优点,内核每次分配给一个进程仅一个CPU,进程中仅有一个线程可以执行,其它线程在该线程放弃CPU之前只能等待。
 
用户级线程的实现
 用户级线程是在用户空间实现的。所有的用户级线程都具有相同的结构,它们都运行在一个中间系统上。当前有两种方式实现中间系统:
-  
1.运行时系统:实质上是用于管理和控制线程的函数的集合,包括用于创建和撤销线程的函数,线程同步和通信的函数以及实现线程调度的函数等。这些函数能使用户级线程与内核无关。运行时系统中的所有函数都驻留在用户空间,并作为用户级线程与内核之间的接口。
用户级线程在切换时不须转入核心态,而是由运行时系统中的线程切换过程来执行切换任务。当线程需要系统资源时,将该要求传送给运行时系统,由后者通过相应的系统调用来获得系统资源。 -  
2.内核控制线程:这种线程又称为轻型进程LWP。
- 每一个进程都可拥有多个LWP
 - 同用户级线程一样,每个LWP都有自己的数据结构如TCB,其中包括线程表示符,优先级,状态,另外还有栈和局部存储区等。
 - LWP也可以共享进程所拥有的资源。
 - LWP可以通过系统调用来获得内核提供的服务
 - 当一个用户级线程运行时,只须将它连接到一个LWP上,此时它便具有了内核支持线程的所有属性。这种线程的实现方式就是组合方式!
 - 每一个LWP都要连接在一个内核级线程上,LWP可把用户级线程与内核连接起来
 - 同时LWP实现了内核与用户级线程之间的隔离,内核所看到的总是多个LWP而看不到用户级线程,从而使用户级线程与内核无关
 
 
为了节省资源,将多个LWP做成一个缓冲池,称为线程池。
 用户进程中的任何一个线程都可以连接到LWP池中的任何一个LWP上。
 多个用户级线程可多路复用一个LWP,但是只有当前连接到LWP上的线程才能和内核通信,其余线程或阻塞或等待LWP。
3.组合方式
概念介绍:
 在组合方式线程系统中,内核支持多个内核支持线程的建立,调度和管理,同时也允许用户应用程序建立,调度和管理用户级线程。
由于用户级线程和内核支持线程连接方式不同,从而形成了三种不同模型:
 
- 1)多对一模型:将多个属于一个进程的用户线程映射到一个内核控制线程。当用户线程需要访问内核时,将其映射到这个内核控制线程上,但每次只允许一个线程进行映射。该模型优点是线程管理开销小,效率高;缺点是如果一个线程在访问内核时发生阻塞,则整个进程都会被阻塞,并且任何时间只有一个线程可访问内核,多个线程不能同时在多个处理机上运行。
 - 2)一对一模型:每一个用户级线程映射到一个内核支持线程。解决了多对一模型的缺点,它唯一的缺点是:每创建一个用户线程,就相应地创建一个内核线程,开销较大,需要限制整个系统的线程数。
 - 3)多对多模型:允许多用户线程映射到同样数量或更少数量的内核线程上。它既可以使多个线程并行地运行在多处理机系统上,也可以减少线程的管理开销。
 
相关文章:
操作系统基础---多线程
文章目录操作系统基础---多线程1.为何引入线程程序并发的时空开销线程的设计思路线程的状态和线程控制块TCB2.线程与进程的比较3.线程的实现⭐1.内核支持线程KST2.用户级线程3.组合方式操作系统基础—多线程 1.为何引入线程 利用传统的进程概念和设计方法已经难以设计出适合于…...
2022-12-10青少年软件编程(C语言)等级考试试卷(六级)解析
2022-12-10青少年软件编程(C语言)等级考试试卷(六级)解析T1、区间合并 给定 n 个闭区间 [ai; bi],其中i1,2,...,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3…...
太酷了,用Python实现一个动态条形图!
大家好,我是小F~说起动态条形图,小F之前推荐过两个Python库,比如「Bar Chart Race」、「Pandas_Alive」,都可以实现。今天就给大家再介绍一个新的Python库「pynimate」,一样可以制作动态条形图,…...
单元测试junit+mock
单元测试 是什么? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个方法、类、功能模块或者子系统。 单元测试通…...
2022Q4手机银行新版本聚焦提升客群专属、财富开放平台、智能化能力,活跃用户规模6.91亿人
易观:2022年第4季度,手机银行APP迭代升级加快,手机银行作为零售银行服务及经营的主阵地,与零售银行业务发展的联系日益紧密。迭代升级一方面可以顺应零售银行发展战略及方向,对手机银行业务布局进行针对性调整优化&…...
YOLO-V1~V3经典物体检测算法介绍
大名鼎鼎的YOLO物体检测算法如今已经出现了V8版本,我们先来了解一下它前几代版本都做了什么吧。本篇文章介绍v1-v3,后续会继续更新。一、节深度学习经典检测方法概述1.1 检测任务中阶段的意义我们所学的深度学习经典检测方法 ,有些是单阶段的…...
SparkSQL 核心编程
文章目录SparkSQL 核心编程1、新的起点2、SQL 语法1) 读取 json 文件创建 DataFrame2) 对 DataFrame 创建一个临时表3) 通过SQL语句实现查询全表3、DSL 语法1) 创建一个DataFrame2) 查看DataFrame的Schema信息3) 只查看"username"列数据4) 查看"username"列…...
Android核心开发【UI绘制流程解析+原理】
一、UI如何进行具体绘制 UI从数据加载到具体展现的过程: 进程间的启动协作: 二、如何加载到数据 应用从启动到onCreate的过程: Activity生产过程详解: 核心对象 绘制流程源码路径 1、Activity加载ViewRootImpl ActivityThread…...
计算机组成原理第七章笔记记录
仅仅作为笔记记录,B站视频链接,若有错误请指出,谢谢 基本概念 演变过程 I/O系统基本组成 I/O软件 包括驱动程序、用户程序、管理程序、升级补丁等 下面的两种方式是用来实现CPU和I/O设备的信息交换的 I/O指令 CPU指令的一部分,由操作码,命令码,设备…...
ORB-SLAM2编译、安装等问题汇总大全(Ubuntu20.04、eigen3、pangolin0.5、opencv3.4.10)
ORB-SLAM2编译、安装等问题汇总大全(Ubuntu20.04、eigen3、pangolin0.5、opencv3.4.10) 1:环境说明: 使用的Linux发行版本为Ubuntu 20.04 SLAM2下载地址为:git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2 2&a…...
QuickBuck:一款专为安全研究人员设计的勒索软件模拟器
关于QuickBuck QuickBuck是一款基于Golang开发的勒索软件模拟工具,在该工具的帮助下,广大研究人员可以通过更简单的方法来判断反病毒保护方案是否能够有效地预防勒索软件的攻击。 功能介绍 该工具能够模拟下列勒索软件典型行为,其中包括&a…...
【八大数据排序法】堆积树排序法的图形理解和案例实现 | C++
第二十一章 堆积树排序法 目录 第二十一章 堆积树排序法 ●前言 ●认识排序 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ● 总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增…...
低代码开发平台|生产管理-生产加工搭建指南
1、简介1.1、案例简介本文将介绍,如何搭建生产管理-生产加工。1.2、应用场景在主生产计划列表中下达加工后,在加工单列表可操作领料、质检。2、设置方法2.1、表单搭建1)新建表单【产品结构清单(BOM)】,字段…...
Python类型-语句-函数
文章目录类型动态类型:变量类型会随着程序的运行发生改变注释控制台控制台输入input()运算符算术关系逻辑赋值总结语句判断语句while循环for循环函数链式调用和嵌套调用递归关键字传参在C/java中,整数除以整数结果还是整数,并不会将小数部分舍弃…...
真兰仪表在创业板开启申购:募资约20亿元,IPO市值约为78亿元
2月9日,上海真兰仪表科技股份有限公司(下称“真兰仪表”,SZ:301303)开启申购,将在深圳证券交易所创业板上市。本次上市,真兰仪表的发行价为26.80元/股,市盈率43.06倍。 据贝多财经了解…...
【2023】Prometheus-Prometheus与Alertmanager配置详解
记录一下Prometheus与Alertmanager的配置参数等内容 目录1.Prometheus1.1.prometheus.yml1.2.告警规则定义2.alertmanager2.1.alertmanager.yml2.1.1.global:全局配置2.1.1.1.以email方式作为告警发送方2.1.1.2.以wechat方式作为告警发送方2.1.1.3.以webhook方式作为…...
华为HCIE学习之openstack基础
文章目录一、Openstack各种文件位置二、Openstack命令操作1.使用帮助三、用命令发放云主机1、创建租户2、创建用户并与租户绑定3、注册镜像4、创建规格5、创建公有网络及其子网(做弹性IP用)6、创建私有网络及其子网7、创建路由并设置网关与端口8、创建安…...
Python实现贝叶斯优化器(Bayes_opt)优化BP神经网络分类模型(BP神经网络分类算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器,用来寻找最优参数。贝叶斯优化器是基…...
Elasticsearch(九)搜索---搜索辅助功能(下)--搜索性能分析
一、前言 上篇文章我们学习了ES的搜索辅助功能的一部分–分别是指定搜索返回的字段,搜索结果计数,分页,那么本次我们来学习一下ES的性能分析相关功能。 二、ES性能分析 在使用ES的过程中,有的搜索请求的响应比较慢,…...
化繁为简|中信建投基于StarRocks构建统一查询服务平台
近年来,在证券服务逐渐互联网化,以及券商牌照红利逐渐消退的行业背景下,中信建投不断加大对数字化的投入,尤其重视数据基础设施的建设,期望在客户服务、经营管理等多方面由经验依赖向数据驱动转变,从而提高…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
