当前位置: 首页 > news >正文

线程(操作系统408)

基本概念

我们说引入进程的目的是更好的使用多道程序并发执行,提高资源的利用率和系统吞吐量;而引入线程的目的则是减小程序在并发执行的时候所付出的时间开销,提高操作系统的并发性能

线程可以理解成"轻量级进程",它是CPU的基本执行单元(进程是操作系统的资源分配的基本单元)也是程序执行的最小单元。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建或撤销另一个线程,同时一个进程间的多个线程可以并发执行(与进程十分相似)。线程也有就绪态,阻塞态和运行态这三种状态。

引入线程的概念之后,进程就只作为除了CPU以外的系统资源的分配单元(CPU会被分配给线程而不是进程),而线程则作为处理机的分配单元。由于一个进程内有多个线程,如果线程的切换发生在同一个进程里面,就只需要很少的时间开销(因为上下文保存的东西比进程少多了)。

与进程的比较

1.调度:

传统的操作系统中(就是没有线程的操作系统中),每次调度都需要进行上下文切换,开销非常大。而在同一个进程中,线程是独立调度的基本单位,而线程的切换代价远低于进程,因为在同一进程中,线程之间的切换不会引起进程之间的切换。

2.并发性:

在引入线程的操作系统中,不仅进程之间可以并发执行,一个进程的多个线程之间也可以并发执行,不同进程之间的不同线程也能并发执行。从而使操作系统具有更好的并发性,提高了系统资源的利用率和系统的吞吐量

3.拥有资源:

进程使系统中拥有资源的基本单位,而线程不拥有系统资源(只拥有一点必不可少、能保证独立运行的资源,比如说CPU时间片),但是线程可以访问其隶属进程的系统资源。

4.独立性:

每个进程都拥有独立的地址空间和资源,除了共享全局变量,不允许其他进程访问。某进程中的线程对其他进程不可见。同一进程中的不同线程是为了提高并发性以及进行相互之间的合作而创建的,他们共享进程的地址空间和资源

5.系统开销:

在创建或撤销进程的时候,系统都要为之分配或是回收进程控制块PCB以及其它资源,开销很大。而线程创建和撤销的时候需要管的只是一小部分的寄存器的内容,开销很小。此外,由于同一进程的多个线程共享进程的地址空间,因此这些线程之间的同步很容易实现,甚至不需要操作系统的干预。

6.支持多处理机系统:

对于传统单线程进程,不管有多少处理机,进程只能运行在一个处理机上面。而对于多线程的进程,可以把一个进程里面的不同线程分配给不同的处理机上面执行。

线程的属性

多线程操作系统中的进程以及不再是一个基本的执行实体,但是它仍然具有执行相关的状态。所谓的进程处于执行状态,也可以理解为这个进程内的某个线程正在执行。线程的主要属性如下:

  1. 线程是一个轻型实体,它不拥有资源,但每个线程都拥有一个唯一的标识符和一个线程控制块(进程也有一个唯一的标识符和进程控制块(PCB))线程控制块记录了线程执行的寄存器和栈等现场状态

  2. 不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用的时候,操作系统把他们创建成不同的线程

  3. 同一进程中的不同线程共享这个进程的所有资源

  4. 线程是处理机的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,各个线程可以交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,如果各个CPU同时为一个进程的各线程服务,就可以缩短进程的处理时间

  5. 一个线程被创建后,便开始了它的生命周期,直到线程终止。线程在生命周期内会经历阻塞态,就绪态和运行态等各种状态的变化

线程的状态和状态切换

与进程十分相似,进程在运行的时候有三种基本状态,而线程也一样:

  1. 执行状态:线程已获得处理机而正在运行

  2. 就绪状态:线程已经具备各种执行条件,只需要再获得CPU便可以立即执行

  3. 阻塞状态:线程在执行中因某个事件受阻而处于暂停状态

线程这三种基本状态之间的转换和进程的基本状态之间的转换是一样的

线程的组织和控制

1.线程控制块:

与进程类似,系统也会给每个线程分配一个线程控制块TCB,用于记录控制和管理线程的信息。线程控制块通常包括:

  1. 线程标识符

  2. 一组寄存器

  3. 线程运行状态,用于描述线程正处于何种状态

  4. 优先级

  5. 线程专有存储区,线程切换的时候用于保存现场(线程上下文)

  6. 堆栈指针,用于过程调用时保存局部变量和返回地址等

同一进程的所有线程都完全共享进程的地址空间和全局变量。各个线程都可以访问进程地址空间中的每个单元,所以讲一个线程可以读、写甚至清楚另一个线程的堆栈

2.线程的创建:

线程也是有生命周期的,它由创建而产生,调度而执行,由终止而消亡。相应的,在操作系统中就有用于创建线程和终止线程的函数。

用户程序启动的时候,通常只有一个称为"初始化线程"的线程正在执行,这个线程的主要功能是创建新线程。等线程创建函数执行完之后,会返回一个线程标识符。

3.线程的终止:

当线程完成自己的任务之后,或者是出现了异常而需要强制终止的时候,由终止进程调用相应的函数执行种植操作。但有些线程一旦被建立,就会一直运行下去而不会终止。通常,线程被终止之后不会立即释放它所占有的资源,只有当进程中的其它线程执行了分离函数之后,被终止进程才会与资源分离,这个时候的资源才会被其它的线程利用。

被终止单还没有释放资源的线程仍然可以被其它的线程调用,被调用之后,这个线程会重新恢复运行。

线程的实现方式

线程的实现方式分为两类:用户级线程(ULT)和内核级线程(KLT),其中内核级线程又被称为内核支持的线程。

1.用户级线程(ULT):

用户级线程中,有关线程管理(创建,撤销)的所有工作都由应用程序在用户空间中完成,线程对于内核来说是透明的,内核不知道线程的存在,只看得到进程。应用程序可以通过使用线程库设计成多线程程序。通常,应用程序从单线程开始,在这个线程中开始运行,在运行中的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程。

对于设置了用户级线程的系统,其调度仍然是以进程为单位的(毕竟内核看不到你的线程),各个进程轮流执行一个时间片。

优点

  1. 线程之间的切换不需要转换到内核空间,减少开销

  2. 调度算法可以是进程专用的,不同的进程可以根据自己的需要,对自己的线程选择不同的调度算法

  3. 用户及线程的实现与操作系统平台无关,对线程管理的代码库是属于用户程序的一部分

缺点

  1. 系统效用的阻塞问题,当线程执行一个系统条用被阻塞的时候,整个进程都被阻塞了,这个进程里面的其它线程是不能去执行的

  2. 不能发挥多处理机优势,毕竟内核又看不到你线程,咋让多个处理机处理同一个进程内的多个线程?

 

 

2.内核级线程(KLT):

操作系统中,无论是系统进程还是用户进程,都是在系统内核的支持下运行的,与内核紧密相关。内核级线程同样也是在内核的支持下运行的,线程管理的所有工作也是在内核空间内实现的。内核空间也为每个内核级线程设置一个线程控制块,内核根据控制块感知某线程的存在,并对线程加以控制。

优点

  1. 能发挥多处理机的优势。多个处理机能够同时处理一个进程的不同线程

  2. 如果进程中的一个线程被阻塞了,还有其它的线程可以被执行

  3. 内核支持县城具有很小的数据结构和堆栈,线程切换比较快

  4. 内核本身也可以采用多线程技术,可以提高系统的执行速度和效率

缺点

  1. 同一进程中的线程切换,需要从用户态转到核心态进行系统开销较大。这是因为用户进程的线程在用户态进行,而线程调度是在核心态实现的。

 

3.组合方式:

把上述两个方法结合起来,内核支持多个内核级线程的建立、调度和管理,同时也允许用户程序建立、调度和管理用户级线程。一些内核级线程对应多个用户级线程,这是用户级线程通过时分多路复用内核级线程实现的。同一进程中的多个线程也可以同时在多处理机上面并行执行,且在一个线程阻塞的时候不会导致整个进程阻塞。

线程实现方式的介绍中,提到了通过线程库来创建和管理线程。线程库是为程序员提供创建和管理线程的API。实现线程库的主要方法为以下两种:

  1. 在用户空间中提供一个没有内核支持的库。这个库的所有代码和数据结构都位于用户空间中,这意味着,调用库内的一个函数只导致用户空间中的一个本地函数的调用

  2. 实现由操作系统直接支持的内核级的一个库。对于这种情况,库内的代码和数据结构都在内核空间内。调用库中的API通常会导致对内核的系统调用。

 

多线程模型

有些系统同时支持用户级线程和内核级线程,由于用户级线程和内核级线程的连接方式的不同,从而形成了下面三种不同的多线程模型:

1.多对一模型:

讲多个用户级线程映射到一个内核级线程。这些用户级线程一般属于一个进程,线程的调度和管理在用户空间完成。只有当用户线程访问内核的时候,才将其映射到一个内核级线程上,但是每次只允许一个线程进行映射。

优点:线程管理在用户空间中进行,效率比较高

缺点:如果一个线程发生了阻塞,整个进程都会被阻塞;不支持多处理机的分布式运行

 

 

2.一对一模型:

将每个用户级线程映射到一个内核级线程

优点:当一个线程被阻塞之后,允许调度另一个线程运行

缺点:每创建一个用户级线程,就要创建一个内核级线程,开销较大

 

 

3.多对多模型:

将n个用户级线程映射到m个内核级线程上,要求n≥m。

克服了多对一模型并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核级线程而开销太大的缺点。此外,还拥有上面两个模型各自的优点。

 

相关文章:

线程(操作系统408)

基本概念 我们说引入进程的目的是更好的使用多道程序并发执行,提高资源的利用率和系统吞吐量;而引入线程的目的则是减小程序在并发执行的时候所付出的时间开销,提高操作系统的并发性能。 线程可以理解成"轻量级进程",…...

功耗降低99%,Panamorph超清VR光学架构解析

近期,投影仪变形镜头厂商Panamorph获得新型VR显示技术专利(US11493773B2),该专利方案采用了紧凑的结构,结合了Pancake透镜和光波导显示模组,宣称比传统VR方案的功耗、发热减少99%以上,可显著提高…...

【数据结构】带你深入理解栈

一. 栈的基本概念💫栈是一种特殊的线性表。其只允许在固定的一端进行插入和删除元素的操作,进行数据的插入和删除的一端称作栈顶,另外一端称作栈底。栈不支持随机访问,栈的数据元素遵循后进先出的原则,即LIFO&#xff…...

认识CSS之如何提高写前端代码的效率

🌟所属专栏:前端只因变凤凰之路🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新前端的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简…...

Vue中watch和computed

首先这里进行声明,这个讲的是vue2的内容,在vue3发生了什么变动与此无关 这里是官网: https://v2.cn.vuejs.org/v2/guide/installation.html computed > 计算属性 watch > 侦听器(也叫监视器) 其区别如下&…...

华为鲲鹏+银河麒麟v10 安装 docker-ce

设备:硬件:仅有ARM处理器,无GPU和NPU,操作系统麒麟银河V10,Kunpeng-920 #######参考原链接######### 华为鲲鹏银河麒麟v10 安装 docker-ce 踩坑 - akiyaの博客 在 arm64(aarch64) 架构服务器上基于国产化操作系统安…...

Lambda,Stream,响应式编程从入门到放弃

Lambda表达式 Java8新引入的语法糖 Lambda表达式*(关于lambda表达式是否属于语法糖存在很多争议,有人说他并不是语法糖,这里我们不纠结于字面表述)*。Lambda表达式是一种用于取代匿名类,把函数行为表述为函数式编程风…...

C语言枚举使用技巧

什么是C语言枚举 C语言枚举是一种用户自定义数据类型,它允许程序员定义一个变量,并将其限制为一组预定义的常量。这些常量被称为“枚举值”,并且可以通过名称进行引用。 在C语言中,枚举值是整数类型,它们的值默认从0…...

保姆级使用PyTorch训练与评估自己的EfficientNetV2网络教程

文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址:https://github.com/Fafa-DL/Awesome-Backbones 操作教程:https://www.bilibili.co…...

【9】基础语法篇 - VL9 使用子模块实现三输入数的大小比较

VL9 使用子模块实现三输入数的大小比较 【报错】官方平台得背锅 官方平台是真的会搞事情,总是出一些平台上的莫名其妙的错误。 当然如果官方平台是故意考察我们的细心程度,那就当我没有说!! 在这个程序里,仿真时一直在报错 错误:无法在“test”中绑定wire/reg/memory“t…...

成功的项目管理策略:减少成本,提高质量

项目管理是一项具有挑战性的任务,项目团队需要合理的规划和策略,以确保项目的成功和达成预期。为了实现项目的成功,项目经理必须采用正确的策略,才能以最大限度地减少成本并提高项目质量。本文将探讨成功的项目管理策略&#xff0…...

centos 7下JDK8安装

下载安装包https://www.oracle.com/java/technologies/downloads/#java8-linux上传路径 /usr/local(替换为自己需要安装的路径)解压tar -zxvf jdk-8u131-linux-x64.tar.gz配置环境变量[rootlocalhost java]# vi /etc/profile添加如下配置在配置文件最后&…...

datatables.js中文项目使用案例

官方下载地址https://datatables.net/download/中文官网&#xff1a;http://datatables.club/资源引用<link href"~/datatables/datatables.min.css" rel"stylesheet" /> <script src"~/jquery.min.js" type"text/javascript"…...

Hadoop小结

Hadoop是什么Hadoop是一 个由Apache基金 会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说&#xff0c;Hadoop通 常是指一个更广泛的概念一Hadoop 生态圈。Hadoop优势Hadoop组成HDFS架构Hadoop Distributed File System&#xff0c…...

经典卷积模型回顾14—vgg16实现图像分类(tensorflow)

VGG16是由牛津大学计算机视觉小组&#xff08;Visual Geometry Group&#xff09;开发的深度卷积神经网络模型。其结构由16层组成&#xff0c;其中13层是卷积层&#xff0c;3层是全连接层。 VGG16被广泛应用于各种计算机视觉任务&#xff0c;如图像分类、目标检测和人脸识别等。…...

#Vue2篇:keep-alive的属性和方法

定义 keep-alive 组件是 Vue.js 内置的一个高阶组件&#xff0c;用于缓存其子组件&#xff0c;以提高组件的性能和响应速度。 除了基本用法之外&#xff0c;它还提供了一些属性和方法&#xff0c;以便更好地控制缓存的组件。 属性 include属性用于指定哪些组件应该被缓存&a…...

webpack指南(项目篇)——webpack在项目中的运用

系列文章目录 webpack指南&#xff08;基础篇&#xff09;——手把手教你配置webpack webpack指南&#xff08;优化篇&#xff09;——webpack项目优化 文章目录系列文章目录前言一、配置拆分二、修改启动命令三、定义环境变量四、配置路径别名总结前言 前面我们对webpack的基…...

unicode字符集与utf-8编码的区别,unicode转中文工具、中文转unicode工具(汉字)

在cw上报的报警信息中&#xff0c;有一个name字段的值是\u4eba\u4f53 不知道是啥&#xff0c;查了一下&#xff0c;是unicode编码&#xff0c;用下面工具转换成汉字就是“人体” 参考文章&#xff1a;https://tool.chinaz.com/tools/unicode.aspx 那么我很好奇&#xff0c;uni…...

3D数学系列之——再谈特卡洛积分和重要性采样

目录一、前篇文章回顾二、积分的黎曼和形式三、积分的概率形式&#xff08;蒙特卡洛积分&#xff09;四、误差五、蒙特卡洛积分计算与收敛速度六、重要性采样七、重要性采样方法和过程八、重要性采样的优缺点一、前篇文章回顾 在前一篇文章3D数学系列之——从“蒙的挺准”到“蒙…...

Python错误 TypeError: ‘NoneType‘ object is not subscriptable解决方案汇总

目录前言一、引发错误来源二、解决方案2-1、解决方案一&#xff08;检查变量&#xff09;2-2、解决方案二&#xff08;使用 [] 而不是 None&#xff09;2-3、解决方案三&#xff08;设置默认值&#xff09;2-4、解决方案四&#xff08;使用异常处理&#xff09;2-5、解决方案五…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...