操作系统(6)----线程相关

目录

1.线程与进程的关系

2.线程的属性

3.线程的实现方式

用户级线程

内核级线程

多线程模型

一对一模型:

多对一模型:

多对多模型:

4.线程的状态和转换

5.线程的组织与控制


1.线程与进程的关系

可以把线程理解为“轻量级进程”。线程是一个基本的CPU执行单元也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务 (如QQ视频、文字聊天、传文件)
引入线程后,进程只作为除CPU之外的系统资源的分配单元 (如打印机、内存地址空间等都是分配给进程的)。

现在来总结一下引入线程机制后发生了哪些变化

1.传统进程机制中,进程是资源分配、调度的基本单位。引入线程后,进程是资源分配的基本单位,线程是调度的基本单位

2.传统进程机制中,只能进程间并发。引入线程后,各线程间也能并发,提升了并发度

3.传统的进程间并发,需要切换进程的运行环境,系统开销很大。线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小引入线程后,并发所带来的系统开销减小

2.线程的属性

(1)线程是处理机调度的单位

(2)多CPU计算机中,各个线程可占用不同的CPU

(3)每个线程都有一个线程ID、线程控制块 (TCB)

(4)线程也有就绪、阻塞、运行三种基本状态

(5)线程几乎不拥有系统资源

(6)同一进程的不同线程间共享进程的资源

(7)由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预

(8)同一进程中的线程切换,不会引起进程切换

(9)不同进程中的线程切换,会引起进程切换

(10)切换同进程内的线程,系统开销很小

(11)切换进程,系统开销较大

3.线程的实现方式
用户级线程

早期的操作系统 (如: 早期Unix)只支持进程不支持线程。当时的“线程”是由线程库实现的

从代码角度看,线程其实就是一段代码逻辑。上述三段代码逻辑上可以看作三个"线程",下述while循环就可以看作一个"线程库",线程库完成了对线程的管理调度工作。

很多编程语言提供了强大的线程库,可以实现线程的创建、销毁、调度等功能。那么线程的管理工作由谁完成呢?从上面的例子可以看出,线程的管理是由应用程序完成的,不需要操作系统的介入。线程的切换工作也不需要CPU参与,直接在用户态下就能完成线程的切换工作。

注:操作系统是不知道用户级线程的存在的,他只知道这是一个进程,而进程才被分为多个线程。

所以这样的线程被称为用户级线程,只有用户才知道线程的存在,操作系统是不知道的。

用户级线程的优点和缺点:

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行

我们之前提到过,在引入线程后,线程是CPU调度的基本单位,但是在用户级线程中,CPU调度的基本单位还是进程

 

内核级线程

内核级线程(Kernel-LevelThread,KLT,又称“内核支持的线程”)是操作系统支持的线程,即操作系统视角也可以看得到的线程

那么这种实现方式线程的管理工作由谁来完成呢?由于此线程是在操作系统层面实现的线程,所以管理工作由操作系统完成。并且线程的切换需要从用户态转变为内核态。

内核级线程的优点和缺点

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多线程模型

如何将两种方式结合起来,只要在支持内核级线程的系统中,再引入线程库,就可以实现将若干个用户级线程映射到某一个内核级线程

一对一模型:

一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多对一模型:

多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行,因为只有内核级线程才是处理机的分配单位,如果一个进程只对应一个内核级线程的话,在同一时间内这个进程只能被分配一个CPU的核心,若一个进程对应多个内核级线程,那么在多核CPU的环境下,这些内核级线程肯定是可以并行执行的。

多对多模型:

n用户及线程映射到m个内核级线程(n>= m)。每个用户进程对应m个内核级线程。克服了多对一模型并发度不高的缺点 (一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

总结一下:

用户级线程是"代码逻辑"的载体,而内核级线程是"运行机会"的载体,内核级线程才是处理机分配的单位。例如:多核CPU环境下,上面这个进程最多能被分配两个核。一段“代码逻辑”只有获得了“运行机会”才能被CPU执行。
内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞。

4.线程的状态和转换

线程的状态我们只关注最基本的状态:就绪,运行,阻塞

5.线程的组织与控制

要管理线程,需要给线程建立对应的数据结构,即线程控制块(TCB)。

与进程控制块(PCB)类似,当某个线程要下CPU时,某些必要的寄存器信息要保存到PCB中,当要重新上CPU时,再根据线程控制块,取出相应寄存器的值重新放到寄存器中

多个进程的PCB组织起来,就可以形成线程表

线程的组织方式有很多,可以一个进程的所有线程组成线程表,或者是所有进程的线程组成线程表,或者根据线程状态不同,组成线程表。不同的系统可以采取不同的策略。

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

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

相关文章

大创项目推荐 题目:基于卷积神经网络的手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

【Spring实战】31 Spring Boot3 集成 Gateway 微服务网关

文章目录 1. 定义2. 功能3. 示例代码1) 创建一个业务服务2)创建一个网关服务3)启动服务4)验证 4. 代码参考结语 1. 定义 Spring Cloud Gateway 是一个基于 Spring Framework 的开源网关服务,用于构建微服务架构中的 API 网关。它…

C51 单片机学习(一):基础外设

参考 51单片机入门教程 1. 单片机简介 1.1 定义 单片机(Micro Controller Unit,简称 MCU) 内部集成了 CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处…

休息日的思考与额外题——链表

文章目录 前言链表知识点 一、 92. 反转链表 II二、21. 合并两个有序链表总结 前言 一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油! 二刷决定精刷了,于是参加了卡子哥的刷题班,训练…

富文本编辑器CKEditor4简单使用-01

富文本编辑器CKEditor4简单使用-01 1. 快速体验入门1.1 通过从 CDN 加载 CKEditor 来快速体验1.2 从官方网站下载软件包1.2.1 官网下载1.2.2 解压、简单使用(自带index页面示例)1.2.3 将 CKEditor 4 添加到自己的页面1.2.3.1 目录结构1.2.3.2 效果1.2.3.…

TensorFlow2实战-系列教程6:迁移学习实战

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、迁移学习 用已经训练好模型的权重参数当做自己任务的模型权重初始化一般全连接层需…

【机器学习】工程实践问题概述

机器学习实际应用时的工程问题与面临的挑战 一、实现细节问题 1.1 训练样本 训练样本与标注对各类机器学习算法和模型的精度影响 训练样本的选择对各类机器学习算法和模型的影响 训练样本的优化 如何进行数据增强? 如何进行数据清洗? 样本的标注对各类机…

数据结构(二)------单链表

制作不易,三连支持一下呗!!! 文章目录 前言一.什么是链表二.链表的分类三.单链表的实现总结 前言 上一节,我们介绍了顺序表的实现与一些经典算法。 但是顺序表这个数据结构依然有不少缺陷: 1.顺序表指定…

导航页配置服务Dashy本地部署并实现公网远程访问

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起,形成自己的导航…

基于springboot宠物领养系统

摘要 随着社会的不断发展和人们生活水平的提高,宠物在家庭中的地位逐渐上升,宠物领养成为一种流行的社会现象。为了更好地管理和促进宠物领养的过程,本文基于Spring Boot框架设计和实现了一套宠物领养系统。该系统以用户友好的界面为特点&…

时序分析中的去趋势化方法

时序分析中的去趋势化方法 时序分析是研究随时间变化的数据模式的一门学科。在时序数据中,趋势是一种随着时间推移而呈现的长期变化趋势,去趋势化是为了消除或减弱这种趋势,使数据更具平稳性。本文将简单介绍时序分析中常用的去趋势化方法&a…

跟着cherno手搓游戏引擎【13】着色器(shader)

创建着色器类&#xff1a; shader.h:初始化、绑定和解绑方法&#xff1a; #pragma once #include <string> namespace YOTO {class Shader {public:Shader(const std::string& vertexSrc, const std::string& fragmentSrc);~Shader();void Bind()const;void Un…

怎样自行搭建幻兽帕鲁游戏联机服务器?

幻兽帕鲁是一款深受玩家喜爱的多人在线游戏&#xff0c;为了获取更好的游戏体验&#xff0c;许多玩家希望能够自行搭建幻兽帕鲁游戏联机服务器&#xff0c;本文将指导大家如何自行搭建幻兽帕鲁游戏联机服务器。 自行搭建幻兽帕鲁游戏联机服务器&#xff0c;阿里云是一个不错的选…

结构体的增删查改

结构体&#xff0c;是为了解决生活中的一些不方便利用c语言自带数据类型来表示的问题。例如表示一个学生&#xff0c;那么学生这个个体假如用c语言自带数据类型怎么表示呢。可以使用名字&#xff0c;也就是字符数组&#xff1b;也可以使用学号&#xff0c;也就是int类型。但是这…

iOS 面试 Swift基础题

一、Swift 存储属性和计算属性比较&#xff1a; 存储型属性:用于存储一个常量或者变量 计算型属性: 计算性属性不直接存储值,而是用 get / set 来取值 和 赋值,可以操作其他属性的变化. 计算属性可以用于类、结构体和枚举&#xff0c;存储属性只能用于类和结构体。存储属性可…

检测头篇 | 原创自研 | YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图

左图:ResNet 的一个模块。右图:复杂度大致相同的 ResNeXt 模块,基数(cardinality)为32。图中的一层表示为(输入通道数,滤波器大小,输出通道数)。 1. 思路 ResNeXt是微软研究院在2017年发表的成果。它的设计灵感来自于经典的ResNet模型,但ResNeXt有个特别之处:它采用…

MySQL-窗口函数 简单易懂

窗口函数 考查知识点&#xff1a; • 如何用窗口函数解决排名问题、Top N问题、前百分之N问题、累计问题、每组内比较问题、连续问题。 什么是窗口函数 窗口函数也叫作OLAP&#xff08;Online Analytical Processing&#xff0c;联机分析处理&#xff09;函数&#xff0c;可…

Android 基础技术——列表卡顿问题如何分析解决

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于列表卡顿问题如何分析解决 onBindViewHolder 优化 是否有耗时操作、重复创建对象、设置监听器、findViewByID、局部的动画对象等操作 是否存在内存泄漏 发生内存泄露&#xff0c;会导致一些不再使用…

游戏开发丨基于Tkinter的扫雷小游戏

文章目录 写在前面扫雷小游戏需求分析程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于tkinter的扫雷小游戏 所需环境 pythonpycharm或anaconda 下载地址 https://download.csdn.net/download/m0_68111267/88790713 扫雷小游戏 扫雷是一款广为人知的单…

RabbitMQ“延时队列“

1.RabbitMQ"延时队列" 延迟队列存储的对象是对应的延迟消息&#xff0c;所谓“延迟消息”是指当消息被发送以后&#xff0c;并不想让消费者立刻拿到消息&#xff0c;而是等待特定时间后&#xff0c;消费者才能拿到这个消息进行消费 注意RabbitMQ并没有延时队列慨念,…