【Linux 19】线程概念
文章目录
- 🌈 一、线程的概念
- ⭐ 1. 线程是什么
- ⭐ 2. 线程的优点
- ⭐ 3. 线程的缺点
- ⭐ 4. 线程的异常
- ⭐ 5. 线程的用途
- 🌈 二、进程和线程
- ⭐ 1. 进程和线程的区别
- ⭐ 2. 进程的多线程共享
- ⭐ 3. 进程和线程的关系
- ⭐ 3. 进程和线程的关系
🌈 一、线程的概念
⭐ 1. 线程是什么
-
线程是 CPU 调度的基本单位。
-
一个程序中的一条执行路线被称作线程 thread,确切的说,线程是一个进程内部的控制序列。
-
只要是进程,则至少会有一个执行线程。
-
线程是在进程的内部运行的执行流,本质是在进程地址空间内运行。
-
在 Linux 中,没有线程的概念,只有轻量级进程,其复用了进程 PCB 的结构和调度算法,但看到的 PCB 要比传统进程更轻量化。
- 由于线程的大部分内容和进程类似,如果要重新设计线程相关的结构体和调度算法就很不划算。
-
透过进程虚拟地址空间,能够看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
1. 进程的创建与映射
- 创建进程需要创建:进程控制块 task_struct、进程地址空间 mm_struct、页表。
- 虚拟地址 (进程地址空间) 和物理地址之间还要通过页表建立映射。
- 每个进程都拥有独立的地址空间和页表,即进程在运行时本身就具有独立性。
2. 线程的创建与映射
- 如果创建多个 task_struct,并让这多个 task_struct 共享进程地址空间和页表,这多个 task_struct 就是进程内部的多个执行流,即为 “线程”。
- 相比于进程,线程的创建成本明显低了很多,只需要创建出 task_struct 然后复用进程的地址空间和页表即可。
- 线程在进程内部运行,本质就是线程在进程地址空间内运行,即进程曾经申请的所有资源,几乎都是被所有线程共享的。
3. CPU 无需识别调度的是进程还是线程
- CPU 只关心执行流,一个进程内至少要有一个执行流,且不管进程内有多少个执行流,CPU 都是以 task_struct 为单位进行调度。
- 单执行流被 CPU 调度:
- 多执行流被 CPU 调度:
4. Linux 中线程的实现方案
- Linux 中并不存在真正的线程,只有轻量级进程的概念,其复用了进程的数据结构和相关算法。
- OS 中会存在着大量的进程,而一个进程中又存在 1 ~ n 个线程,线程的数量肯定是比进程多的。
- 如果 OS 要实现真正的线程,就要专门实现线程的结构体、创建线程、终止线程、调度线程等一切与线程有关的算法,越复杂越不好。
- 在 Linux 看来,进程控制块和线程控制块的相似点有很多,没必要专门去为线程设计一套数据结构,直接复用进程结构相关算法即可。
⭐ 2. 线程的优点
- 创建一个线程的代价比创建一个进程的代价小很多。
- 和进程间的切换相比,线程之间的切换需要 OS 做的工作会少很多。
- 线程占用的资源比进程少很多。
- 线程可以充分利用多处理器的可并行数量,一般 CPU 是几核的就创建几个线程。
- 在等待慢速 IO 操作的过程中,程序还可以执行其他的计算任务。
- 计算密集型应用,为了能在多处理器系统上运行,会将计算分解到多个线程中实现。
- IO 密集型应用,为了提高性能,将 IO 操作重叠,线程能同时等待不同的 IO 操作。
⭐ 3. 线程的缺点
- 性能损失:一个很少被外部事件阻塞的计算密集型线程往往无法与其他线程共享一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
- 健壮性降低:编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说,线程之间是缺乏保护的。
- 缺乏访问控制: 进程是访问控制的基本粒度,在一个线程中调用某些 OS 函数会对整个进程造成影响。
- 编程难度提高:编写与调试一个多线程程序比单线程程序困难得多。
⭐ 4. 线程的异常
- 线程崩溃会导致进程崩溃:单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃。
- 线程异常会导致进程终止:线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出。
⭐ 5. 线程的用途
- 合理的使用多线程,能提高 CPU 密集型程序的执行效率。
- 合理的使用多线程,能提高 IO 密集型程序的用户体验。
🌈 二、进程和线程
⭐ 1. 进程和线程的区别
- 进程是资源分配的基本单位;线程是CPU调度的基本单位。
- 线程共享进程的数据,但也拥有自己的一部分数据:线程 ID、一组寄存器、独立栈结构、errno、信号屏蔽字、调度优先级。
⭐ 2. 进程的多线程共享
- 由于使用的是同一个地址空间,因此所谓的代码段、数据段都是共享的:
- 如果定义一个函数,在各线程中都可以调用。
- 如果定义一个全局变量,在各线程中都可以访问到。
线程共享的进程资源和环境
- 文件描述符表,进程打开一个文件后,其他线程也能够看到。
- 每种信号的处理方式,SIG_IGN、SIG_DFL或者自定义的信号处理函数。
- 当前工作目录。
- 用户 ID 和组 ID。
⭐ 3. 进程和线程的关系
- 在接触多线程之前,之前所接触的都属于单线程进程。
FL或者自定义的信号处理函数。
- 当前工作目录。
- 用户 ID 和组 ID。
⭐ 3. 进程和线程的关系
- 在接触多线程之前,之前所接触的都属于单线程进程。
相关文章:

【Linux 19】线程概念
文章目录 🌈 一、线程的概念⭐ 1. 线程是什么⭐ 2. 线程的优点⭐ 3. 线程的缺点⭐ 4. 线程的异常⭐ 5. 线程的用途 🌈 二、进程和线程⭐ 1. 进程和线程的区别⭐ 2. 进程的多线程共享⭐ 3. 进程和线程的关系⭐ 3. 进程和线程的关系 🌈 一、线程…...

[区间dp]添加括号
题目描述 有一个 n n n 个元素的数组 a a a。不改变序列中每个元素在序列中的位置,把它们相加,并用括号记每次加法所得的和,称为中间和。现在要添上 n − 1 n - 1 n−1 对括号,加法运算依括号顺序进行,得到 n − …...

jenkins流水线+k8s部署springcloud微服务架构项目
文章目录 1.k8s安装2.jenkins安装3.k8s重要知识1.简介2.核心概念3.重要命令1.查看集群消息2.命名空间3.资源创建/更新4.资源查看5.描述某个资源的详细信息6.资源编辑7.资源删除8.资源重启9.查看资源日志10.资源标签 4.k8s控制台1.登录2.界面基本操作1.选择命名空间2.查看命名空…...

安卓开发板_联发科MTK开发评估套件串口调试
串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器…...

vue+el-table 可输入表格使用上下键进行input框切换
使用上下键进行完工数量这一列的切换 <el-table :data"form.detailList" selection-change"handleChildSelection" ref"bChangeOrderChild" max-height"500"><!-- <el-table-column type"selection" width&quo…...

中国书法——孙溟㠭浅析碑帖《三希堂法帖》
孙溟㠭浅析碑帖《三希堂法帖》 全称是《三希堂石渠宝笈法帖》,是中国清代宫廷刻帖,一共三十二册。 清朝高宗弘历收藏了晋王羲之《快雪时晴帖》,王献之的《中秋帖》,王珣的《伯远帖》三种王氏原墨迹。故而把所藏法书之所…...

深入探讨生成对抗网络(GANs):颠覆传统的AI创作方式
在人工智能的快速发展中,生成对抗网络(Generative Adversarial Networks, GANs)无疑是一个引人注目的技术。自2014年由Ian Goodfellow等人首次提出以来,GANs已经在图像生成、文本生成、视频生成等多个领域展现出了惊人的能力。本文…...

vmware Vnet8虚拟网卡丢失的找回问题
vmware Vnet8虚拟网卡丢失的找回问题 1.打开VMware Workstation 2.然后点击Edit --> Virtual Network Edit --> 打开Virtual Network Edit框 , 3.点击最下面的的Restore Default 按钮, 3.恢复默认设置,这会在网络连接那块可以看到丢失…...

Python 从入门到实战13(字符串简介)
我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了流程控制语句中的循环语句。今天继续讨…...

Redis_RDB持久化
基于RDB的持久化方式会把当前内存中所有的redis键值对数据以快照的方式写入硬盘文件中,如果需要恢复数据,就把快照文件读到内存中。 RDB快照文件是经压缩的二进制格式的文件,它的储存路径不仅可以在redis服务器启动前通过配置参数来设置&…...

SOP流程制定:vioovi ECRS工时分析软件的智慧引领
在现代制造业中,标准化操作流程(SOP)已成为提升生产效率、确保产品质量、降低运营成本的关键要素。SOP不仅为生产活动提供了明确的指导,还促进了企业管理的规范化和精细化。然而,如何科学、高效地制定SOP流程ÿ…...

并发编程-synchronized解决原子性问题
并发编程-synchronized解决原子性问题 文章目录 并发编程-synchronized解决原子性问题零、说在前面一、线程安全问题1.1 什么是线程安全问题1.2 自增运算不是线程安全的1.3 临界区资源与临界区代码段 二、synchronized 关键字的使用2.1 synchronized 关键字作用2.2 synchronize…...

CSS之我不会
非常推荐html-css学习视频:尚硅谷html-css 一、选择器 作用:选择页面上的某一个后者某一类元素 基本选择器 1.标签选择器 格式:标签{} <h1>666</h1><style>h1{css语法} </style>2.类选择器 格式:.类…...

AI绘画:SD打光神器!(Stable Diffusion进阶篇:Imposing Consistent Light)
前言 在上一篇笔记中学习了如何简单地下载以及使用IC-Light,今天的内容会稍微有点不一样。 对于学过stable diffusion的小伙伴来说,forge UI和Comfy UI会更加熟悉一些。在IC-Light发布后,Openpose editor的开发者将其制作成了一个Forge UI上…...

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期]
QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期] 第二期介绍:频道模块之频道管理 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期]第二期介绍:频道模块之频道管理获取用户详情获取用户频道列表获取频道详情获取子频道列表获…...

参赛心得和思路分享:2021第二届云原生编程挑战赛2: 实现一个柔性集群调度机制
关联比赛: 2021第二届云原生编程挑战赛2:实现一个柔性集群调度机制 参赛心得 历时快两个月的第二届云原生编程挑战赛结束了,作为第一次参赛的萌新,拿下了28名的成绩,与第一名差了19万分,因为赛制时间太长,…...

具体函数的卡诺图填入
目录 用卡诺图表示逻辑函数 基本步骤 例子1 例子2 例子3 用卡诺图表示逻辑函数 基本步骤 例子1 由真值表得卡诺图。 在函数值为1的地方在卡诺图上画上1。 例子2 例子3 非标准与或式,要找到公共部分。 将AB所在的那一行填上1。 将A非D的那个部分也填上1。 再…...

STM32 HAL freertos零基础(六)计数型信号量
1、计数型信号量 计数型信号量(Counting Semaphore)是另一种类型的信号量,它可以保持一个大于等于0的整数值,这个值表示可用资源的数量。本质上相当于队列长度大于1得队列。经典问题就是剩余车辆统计,出入车辆,车辆数据可以实时更新。 2、相关API函数 xSemaphoreCreat…...

Dynamics CRM Ribbon Workbench-the solution contains non-entity components
今天在一个低版本的环境里准备用Ribbon Workbench去编辑一个按钮时,遇到了如下错误 一开始没当回事,以为是我的解决方案问题,去检查了下,只有一个组件,并且哪怕我把组件换成了某个实体也不行,尝试了其他任何…...

谷歌对抗司法部:为什么谷歌的“数百个竞争对手”说法站不住脚
随着谷歌反垄断陪审团审判的进行,谷歌声称美国司法部对广告技术市场的看法狭隘,并且广告商和出版商有很多替代选择。然而,证据并不支持这一说法。 谷歌误导性地声称有“数百个竞争对手。” 虽然存在许多广告技术提供商,但谷歌在…...

重生奇迹MU 沉迷升级的快感 法魔升级机器人
重生奇迹MU是一款以升级为主要玩法的游戏。升级是游戏基础,也是最重要的部分。通过升级,玩家可以获得更多的基础属性奖励和自由点数奖励,同时还能够穿戴最好的装备和翅膀。因此,升级在游戏中具有极其重要的地位。 史上升级最快的…...

从地图到智能地图:空间索引技术如何改变我们的世界
图源:WL 为什么空间索引很有用? 在处理地理空间数据时,空间索引是一个至关重要的功能,它决定了我们如何高效地从海量的地理数据中检索出所需的信息。想象一下,如果你正在处理一个包含数千万乃至数亿条记录的数据库,…...

深入理解AI Agent架构,史上最全解析!赶紧码住!
AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望 1. AI Agent(LLM Agent)介绍 1.1. 术语 Agent:“代理” 通常是指有意行动的表现。在哲学领域,Agen…...

苹果iOS/ iPadOS18 RC 版、17.7 RC版更新发布
iPhone 16 / Pro 系列新机发布后,苹果一同推出了 iOS 18 和 iPadOS 18 的 RC 版本,iOS 18 RC 的内部版本号为22A3354,本次更新距离上次发布 Beta/RC 间隔 12 天。 在 iOS 18 中,苹果给我们带来了 Apple Intelligence,这…...

CAN集线器(工业级、隔离式)
型号: MS-HUB-C 概述 MS-HUB 是一款可通过一路 CAN ,一路 RS-232为主口扩展出 7 路 CAN 从口的工业级光电隔离型 CAN 分配器。可以有效的实现 CAN 网络的中继、扩展与隔离。采用先进的自动流控技术自动侦测CAN 信号流向。MS-HUB 具备光电隔离功能&#x…...

代码随想录训练营 Day57打卡 图论part07 53. 寻宝(prim,kruskal算法)
代码随想录训练营 Day57打卡 图论part07 卡码53. 寻宝 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同,…...

Hibernate QueryPlanCache 查询计划缓存引发的内存溢出
目录 1.排查方式2.结论3.解决办法 前言:在生产环境中有一个后端程序多次报oom然后导致程序中断。 1.排查方式 通过下载后端程序产生的oom文件,将oom文件导入MemoryAnalyzer程序分析程序堆内存使用情况。 1、将oom文件导入MemoryAnalyzer后可以看到概览信…...

前端开发的观察者模式
什么是观察者设计模式 观察者模式(Observer Pattern)是前端开发中常用的一种设计模式。它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,其所有依赖对象都能收到通知并自动更新。观察者模式广泛应用于事件驱动的系…...

Pycharm 输入三个引号没有自动生成函数(方法)注释
配置项路径:pycharm–>Settins–>Tools–>Python Integrated Tools–>Docstrings–>Docstrings format选择对应的工程,如果有多个工程的话将 Docstrings format 的值从 Plain 换成 reStructuredText...

lammps后处理:多帧孔洞体积和孔隙率的计算
本文介绍lammps后处理技巧:多帧孔洞体积和孔隙率的计算方法。 在前面的专栏中,已经介绍了单帧孔洞体积的计算方法,有不少粉丝朋友咨询多帧孔洞体积的计算方法。 在上一次案例代码的基础上,稍加修改,添加一个for循环遍历所有的帧即可实现多帧孔洞体积的计算。 计算的结果…...