操作系统基础---多线程

news2024/11/24 10:52:50

文章目录

  • 操作系统基础---多线程
    • 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)多对多模型:允许多用户线程映射到同样数量或更少数量的内核线程上。它既可以使多个线程并行地运行在多处理机系统上,也可以减少线程的管理开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

方向导数与梯度下降

文章目录方向角与方向余弦方向角方向余弦方向导数定义性质梯度下降梯度下降法(Gradient descent)是一个一阶最优化算法,通常也称为最速下降法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度&#xff08…

学习数据库第一天

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、数据库的开启和关闭二、数据库的登录 添加数据库以及表1.登录数据库2.查看数据库三 数据表前言 提示:这里可以添加本文要记录的大概内容&#x…

spring cloud脚手架快速开发 微服务架构 JAVA敏捷开发框架源码

核心技术采用Spring Cloud Alibaba、SpringBoot、Mybatis、Seata、Sentinel、RabbitMQ、FastDFS/MinIO、SkyWalking等主要框架和中间件。 私信了解更多! 功能模块: 1、租户管理:运营人员管理所有的租户创建 2、工作台:普通用户…

支持分布式部署的主流方式 - Session 持久化到 Redis

1.为什么要将 Session 存储在 Redis 中如果我们不将 Session 存储在 MySQL 或者 Redis 中, 那么做出来的项目就只能支持单机部署, 不支持分布式部署. 因为之前我们只是将 Session 存储在当前电脑的内存里面. 当张三去登录的时候, 将 Session 信息存储在 A 服务器, 这个时候负载…

码上【call,apply,bind】的手写

一、call (1)官方用法 call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。 语法:function.call(要绑定的this值,参数,参数,…)。不一定这些参数都需要,这些参数都…

寿险业务系统异常处理方案

我们的系统使用的java语言开发,基于Spring框架搭建的业务中台,在讨论业务系统异常处理策略之前,先把java的异常机制进行简单说明。 一、Java的异常机制 1.Java异常分类 【Error】是系统错误或者编译错误,常见的虚拟机运行错误、…

2023,考个软考中级证书稳妥深圳入户,5月考试8月办入户

最新消息!最新消息!最新消息! 2023年2月8日,深圳市发展和改革委员会深圳市公安局深圳市人力资源和社会保障局关于印发《深圳市积分入户办法》的最新通知↓ 来源《深圳市发展和改革委员会》 该积分入户将于2023年2月15日正式实施&…

C++与Lua交互实例 -- 矩阵的加减乘除(版本一)

C与Lua交互实例 – 矩阵的加减乘除(版本一) 关于lua中封装的类模板以及相关知识可参考以下链接: https://ufgnix0802.blog.csdn.net/article/details/128854786 https://ufgnix0802.blog.csdn.net/article/details/128827673 https://ufgnix0…

Python深度学习实战PyQt5窗口切换的堆叠布局示例详解

本文以堆叠窗口控件为例,详细介绍堆叠布局的界面设计和程序实现过程,通过案例带小白创建一个典型的堆叠布局多窗口切换程序软件项目中经常需要多种不同的图形界面,以适应不同的任务场景。选项卡控件(QTackedWidget)通过…

[Java 进阶] synchronized 与 ReentrantLock的区别

祝一切顺利~ 文章目录synchronized 与 ReentrantLock的区别synchronized 与 ReentrantLock的区别 1.ReentrantLock的锁是公平锁,synchronized是非公平锁.(公平锁是指当锁被释放时,由等待时间最长的线程获取锁.非公平锁是锁被释放时,所有线程不论等待时间长短,都一起去竞争) 2.…

小白系列Vite-Vue3-TypeScript:009-屏幕适配

上一篇我们介绍了ViteVue3TypeScript项目中mockjs的安装和配置。本篇我们来介绍屏幕适配方案,简单说来就是要最大程度上保证我们的界面在各种各样的终端设备上显示正常。通用的屏幕适配方案有两种:① 基于rem 适配(推荐,也是本篇要…

线下沙龙|从VUCA到BANI,找到你的“第二曲线”

冷战之后,VUCA盛行,世界已复杂到无可言表;然而,我们正在拼命地理解和适应“VUCA时代”,却又被迷迷糊糊、跌跌撞撞地推进了“BANI时代”。 未来之路在何方?在脚下,却不知该如何去迈? …

elasticsearch使用painless的一些简单例子

文章目录1、背景2、准备数据2.1 mapping2.2 插入数据3、例子3.1 (update)更新文档 id1 的文档,将 age 加 2岁3.2 (update_by_query)如果 province 是北京的话,就将 age 减少1岁3.3 (ctx.op)如果张三的年龄小于20岁就不处理,否则就删除这个文档…

MLX90316KGO-BDG-100-RE传感器 旋转位置 角度测量

介绍MLX90316是Tria⊗is旋转位置传感器,提供在设备表面旋转的小偶极磁铁(轴端磁铁)的绝对角位置。得益于其表面的集成磁集中器(IMC),单片设备以非接触式方式感知应用磁通量密度的水平分量。这种独特的传感原理应用于旋转位置传感器,可在机械(…

(1分钟速通面试) 矩阵分解相关内容

矩阵分解算法--总结QR分解 LU分解本篇博客总结一下QR分解和LU分解,这些都是矩阵加速的操作,在slam里面还算是比较常用的内容,这个地方在isam的部分出现过。(当然isam也是一个坑,想要出点创新成果的话 可能是不太现实的 短期来讲 哈…

【电商】订单系统--售后的简易流程与系统关系

用户进行了订单签收并不意味着终结,这只是一个新的开始,因为商品送达后可能会由于运输过程包装或商品有破损,商品本质量并非商品详情中所描述的那样等各种原因使用户进行退货或换货;还有一种场景是用户签收后发现有的商品漏发、少…

线性卡尔曼滤波详解

自动驾驶面临的第一个问题:从哪里来,到哪里去?要解决这个问题,自动驾驶汽车首先需要准确的知道自己在地图上的位置。理所当然的我们可以想到通过GPS来进行定位,但获取GPS信号需要跟卫星进行通信,这就导致它…

简单的洗牌(数据结构系列4)

目录 前言: 1.思想 1.1基本框架的搭建 1.2洗牌操作 1.3揭牌 2.代码运行结果截图 结束语: 前言: 在上一次的博客中小编与大家分享了ArrayList的模拟实现和一些具体的使用方法,那么接下来我们通过一个简单的洗牌练习来巩固一…

Java创建枚举类并定义使用枚举项

前言 在项目开发中,常量和枚举都是我们经常使用的技巧。都是为了提高开发效率。常量我们一般都会创建一个常量类,里面放一些经常使用的变量,例如: 枚举的定义和使用相比于常量,也是有异曲同工之巧的,下面就…

梅开二度的 axios 源码阅读,三千字详细分享功能函数,帮助扩展开发思维

前言 第一遍看 axios 源码,更多的是带着日常开发的习惯,时不时产生出点联想。 第二遍再看 axios 源码,目标明确,就是奔着函数来的。 当有了明确清晰的目标,阅读速度上来了,思绪也转的飞快。 按图索骥&a…