Linux : 多线程【线程概念】
Linux : 多线程【线程概念】
- (一)线程概念
- 线程是什么
- 用户层的线程
- linux中PID与LWP的关系
- (二) 进程地址空间页表
- (三) 线程总结
- 线程的优点
- 线程的缺点
- 线程异常
- 线程用途
(一)线程概念
线程是什么
- 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。
- 一切进程至少都有一个执行线程。
- 线程在进程内部运行,本质是在进程地址空间内运行。
- 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。
- 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
进程是资源分配的基本单位,线程是cpu执行调度的基本单位。一个进程创造不仅只有task_struck(PCB)还有页表、进程地址空间等等。而一个线程的创建只有task_struct并且沿用进程的地址空间和页表等,所以线程的创建十分轻量。
- 一个线程都是当前进程里面的一个执行流
- 线程在进程内部运行,本质就是线程在进程地址空间内运行,也就是说曾经这个进程申请的所有资源,几乎都是被所有线程共享的。
cpu是通过task_struct来执行调度,而一个进程中是可以有多个线程即执行流的,所以线程的执行粒度是比进程细(即线程是执行进程的一部分代码)
用户层的线程
进程和线程是如此的相似,那么究竟是如何创建线程的呢??
实际上在Linux中没有真正意义的线程,那么也就绝对没有真正意义上的线程相关的系统调用
想要用好线程就必须要对线程做管理,进程已经有一套进程的管理模式了,而描述线程的控制块和描述进程的控制块是类似的,那么再对线程做一套管理算法等等就十分繁琐,因此Linux并没有重新为线程设计数据结构,而是直接复用了进程控制块,所以我们说Linux中的所有执行流都叫做轻量级进程。
(在windows系统中真正实现了线程,因此Windows操作系统系统的实现逻辑一定比Linux操作系统的实现逻辑要复杂得多。)
在linux操作系统没有线程的概念,但是我们用户却需要一个真正的线程的概念,所以原生线程库pthread由此诞生。原生线程库实际就是对轻量级进程的系统调用进行了封装,在用户层模拟实现了一套线程相关的接口。因此对于我们来讲,在Linux下学习线程实际上就是学习在用户层模拟实现的这一套接口,而并非操作系统的接口。
linux中PID与LWP的关系
进程是由操作系统将程序运行所需地址空间、映射关系、代码和数据打包后的资源包,而 线程/轻量级线程/执行流 则是利用资源完成任务的基本单位
- 进程是承担系统资源分配的实体
- 线程是 CPU 运行的基本单位
实际上 进程 = 线程 + 虚拟地址空间 + 映射关系 + 代码和数据,这才是一个完整的概念
使用 ps -aL
指令查看所有的线程
LWP就是我们的轻量级进程也就是线程,每一个线程都有自己的LWP号,而线程组成线程组,我们用pid来描述这个线程组,也就是我们常说的一个进程的pid。
(二) 进程地址空间页表
在 32 位系统中,存在 2^32 个地址(一个内存单元大小是 1byte),意味着虚拟地址空间 的大小为 4GB。
通常将这32位分为 10、10、12
- 第一个10: 虚拟地址中的前 10 个比特位,用于寻址 二级页表
- 第二个10:虚拟地址中间的 10 个比特位,用于寻找 页框起始地址
- 第三个12:虚拟地址中的后 12 个比特位,用于定位 具体地址(偏移量)
- 选择虚拟地址的前10个比特位在页目录当中进行查找,找到对应的二级页表。
- 再选择虚拟地址的10个比特位在对应的页表当中进行查找,找到物理内存中对应页框的起始地址(一个页框4KB)。
- 最后将虚拟地址中剩下的12个比特位作为偏移量从对应页框的起始地址处向后进行偏移,找到物理内存中某一个对应的字节数据。
说明:
- 物理内存实际是被划分成一个个4KB大小的页框的,而磁盘上的程序也是被划分成一个个4KB大小的页帧的,当内存和磁盘进行数据交换时也就是以4KB大小为单位进行加载和保存的。
- 4KB实际上就是2的12次方个字节,也就是说一个页框中有2的12次方个字节,而访问内存的基本大小是1字节,因此一个页框中就有2的12次方个地址,于是我们就可以将剩下的12个比特位作为偏移量,从页框的起始地址处开始向后进行偏移,从而找到物理内存中某一个对应字节数据。
上面所说的所有映射过程,都是由**MMU(MemoryManagementUnit)**这个硬件完成的,该硬件是集成在CPU内的。页表是一种软件映射,MMU是一种硬件映射,所以计算机进行虚拟地址到物理地址的转化采用的是软硬件结合的方式。
注意:32位计算机下是二级页表,64位平台下用的是多级页表。
当引发异常操作时,操作系统能在 查页表 阶段就进行拦截,而不是等到真正影响到 物理内存 时才报错.
页表是有权限的,所以当我们在进行修改一个常量字符串的时候,虚拟地址必须经过页表映射找到对应的物理内存,但在页表开始对应的时候发现其权限是只读此时你要对其进行修改就会在MMU内部触发硬件错误,操作系统在识别到是哪一个进程导致的之后,就会给该进程发送信号对其进行终止。
(三) 线程总结
线程的优点
- 创建一个新线程的代价要比创建一个新进程小得多
- 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
- 线程占用的资源要比进程少很多
- 能充分利用多处理器的可并行数量
- 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
- 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
- I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。
注释:
计算密集型:执行流的大部分任务,主要以计算为主。比如加密解密、大数据查找等。
IO密集型:执行流的大部分任务,主要以IO为主。比如刷磁盘、访问数据库、访问网络等。
线程的缺点
- 性能损失:一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
- 健壮性降低:编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
- 缺乏访问控制:
进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。 - 编程难度提高:
编写与调试一个多线程程序比单线程程序困难得多。
线程异常
- 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
- 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出
线程用途
- 合理的使用多线程,能提高CPU密集型程序的执行效率
- 合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)
相关文章:
Linux : 多线程【线程概念】
Linux : 多线程【线程概念】 (一)线程概念线程是什么用户层的线程linux中PID与LWP的关系 (二) 进程地址空间页表(三) 线程总结线程的优点线程的缺点线程异常线程用途 (一)线程概念 线程是什么 在一个程序里的一个执行…...
React+Springboot项目部署ESC服务器
记录一下我个人部署Linux服务器的心得 环境介绍 ESC服务器创建时默认安装LNMP,即Linux,Nginx,Mysql,Php 所以这里不讲怎么安装Nignx和Mysql 笔者使用的Linux版本为22.0.4LTS版 前端打包 运行React打包命令进行前端项目的打包…...
python-Pandas库详细教程
python-Pandas库详细教程1 定义使用方法: 一、导入Pandas库代码 二、DataFrame用法Pandas索引 groupby()数值计算 定义 python中特定用于数据分析、处理的模板库。 优点: 处理数据便捷、简单。 使用方法: 处理“.csv”数据:rea…...
力扣刷题Day 46:搜索二维矩阵 II(240)
1.题目描述 2.思路 方法1:分别找到搜索矩阵的右、下边界,然后从[0][0]位置开始遍历这部分矩阵搜索目标值。 方法2:学习Krahets佬的思路,从搜索矩阵的左下角开始遍历,matrix[i][j] > target时消去第i行,…...
C++:类和对象4
一,日期类实现 学习建议: 对于计算机学习来说,调试十分重要,所以在日常学习中一定要加大代码练习,刷代码题和课后自己敲出课上代码例题,注意不要去对比正确代码或者网上找正确代码直接使用,一…...
【软件工程】基于机器学习的多缺陷定位
基于机器学习的多缺陷定位(Multi-Dault Localization, MDL)是软件工程和自动化测试领域的重要研究方向,旨在通过机器学习技术高效识别代码中多个潜在缺陷的位置。以下从方法、挑战、应用场景及未来方向展开分析: 一、核心方法 监督…...
互联网大厂Java求职面试实战:Spring Boot到微服务的技术问答解析
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...
LLMs之MCP:2025年5月2日,Anthropic 宣布 Claude 重大更新:集成功能上线,研究能力大幅提升
LLMs之MCP:2025年5月2日,Anthropic 宣布 Claude 重大更新:集成功能上线,研究能力大幅提升 导读:2025年5月2日,Anthropic 宣布 Claude 推出 Integrations 集成功能和增强型高级研究功能。Integrations 基于 …...
飞蛾扑火算法matlab实现
注意:此代码实现的是求目标函数最大值,求最小值可将适应度函数乘以-1(框架代码已实现)。 注意:此代码实现的是求目标函数最大值,求最小值可将适应度函数乘以-1(框架代码已实现)。 注…...
vector--OJ1
链接: link class Solution { public:int singleNumber(vector<int>& nums) {int ret0;for(auto a : nums){ret^a;}return ret;} };链接: link class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>>…...
多模态大语言模型arxiv论文略读(六十八)
Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文标题:Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文作者:Qiji Zhou, Ruoc…...
【数据库知识】Mysql进阶-高可用MHA(Master High Availability)方案
mysql高可用MHA(Master High Availability)方案 集群部署模式下的高可用方案一、高可用架构原理1. 核心组件2. 故障切换流程 二、详细部署步骤 (3节点集群)1. 环境准备2. 节点配置(以 node1 为例)3. 初始化集群4. 部署MySQL Route…...
类型别名与接口的对比与选择
在 TypeScript 中,类型系统是非常强大且灵活的。两种最常用的类型定义方式就是 类型别名(type) 和 接口(interface)。它们看似相似,实际上在用法和功能上有所不同。在本文中,我们将深入探讨类型…...
《Effective Python》第1章 Pythonic 思维详解——始终用括号包裹单元素元组
《Effective Python》第1章 Pythonic 思维详解——始终用括号包裹单元素元组 在 Python 编程语言中,元组(tuple)是一种不可变的数据结构,常用于表示一组固定的值。尽管元组的语法看似简单,但其中却隐藏着一些微妙的陷…...
【计算机视觉】OpenCV实战项目:ETcTI_smart_parking智能停车系统深度解析
ETcTI_smart_parking智能停车系统深度解析 1. 项目概述2. 技术原理与系统架构2.1 核心算法1) 车牌识别算法2) ETC交易验证 2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 硬件部署规范3.3 系统初始化 4. 常见问题与解决方案4.1 ETC交易失败4.2 车牌识别异常4.3 系统性能瓶颈 5.…...
LintCode第807题-回文数II
描述 判断一个非负整数 n 的二进制表示是否为回文数 我们保证 0 < n < 2^32 - 1 样例1 输入: n 0 输出: True 解释: 0 的二进制表示为:0。 样例2 输入: n 3 输出: True 解释: 3 的二进制表示为:11。 样例3 输入: n 4 输出: False 解释:…...
快速傅里叶变换暴力涨点!基于时频特征融合的高创新时间序列分类模型
往期精彩内容: 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门!锂电池剩余寿命预测(Python)-CSDN博客 超强预测模型:二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解,BiLSTM-Attention预测模型…...
股指期货的保证金交易和资金门槛是多少?
股指期货和股票交易最大的区别,就是它不用“全款买房”,而是“首付买房”——只需交一笔保证金就能撬动大额资金,但这也说明了门槛高、风险大。下面就来拆解,到底要准备多少钱才能“上车”。 一、保证金交易:用12万撬…...
spark:map 和 flatMap 的区别(Scala)
场景设定 假设有一个包含句子的 RDD: scala val rdd sc.parallelize(List("Hello World", "Hi Spark")) 目标是:将每个句子拆分成单词。 1. 用 map 的效果 代码示例 scala val resultMap rdd.map(sentence > sentence…...
判断两台设备是否在同一局域网内的具体方法
以下是判断两台设备是否在同一局域网内的具体方法: 1. 检查IP地址和子网掩码 操作步骤: Windows系统: 按 Win R 键,输入 cmd 并回车。输入 ipconfig,查看 IPv4 地址 和 子网掩码(如 192.168.1.5/255.255.2…...
cmake:test project
本文主要探讨cmake在测试和项目中的应用。 add_test add_test(NAME <name> COMMAND <command> [<arg>...] [CONFIGURATIONS <config>...] [WORKING_DIRECTORY <dir>] [COMMAND_EXPAND_LISTS]) add_test(NAME test_uni COMMAND $<TARGET_F…...
Qwen-2.5 omni
问题1 Qwen2.5-Omni的主要功能是什么? Qwen2.5-Omni的主要功能是处理和生成多种模态的数据,包括文本、图像、音频和视频。它能够同时理解和生成这些模态的信息,支持复杂的多模态任务,例如语音对话、视频理解、图像描述生成等。 …...
Problem D: 异常2
1.题目描述 检查危险品程序:生成货物类、机器类,货物类有属性name,机器类有检测的check方法,若货物名称是炸弹、毒药、刀具,则抛出异常提示。 代码如下: import java.util.Scanner; class goods{ Stri…...
AI智慧公园管理方案:用科技重塑市民的“夜游体验”
AI智慧公园管理方案:多场景智能巡检与安全防控 一、背景与痛点分析 夏季夜间,公园成为市民休闲娱乐的核心场所,但管理难度随之激增: 宠物管理失控:未牵绳宠物进入园区,随地排泄、惊扰游客,甚…...
AJAX原理
AJAX使用XHR 对象和服务器进行数据交互 XHR <p class"my-p"></p><script>const xhr new XMLHttpRequest()xhr.open(GET,http://hmajax.itheima.net/api/province)xhr.addEventListener(loadend,()>{// console.log(xhr.response)const data …...
内存泄露,如何判断是资源泄露还是堆栈泄露?
作为软件测试工程师,判断内存泄露类型对于定位和解决问题至关重要。以下是区分资源泄露和堆栈泄露的方法: 1. 基本概念区分 资源泄露(Resource Leak): 指非内存资源未正确释放,如文件句柄、数据库连接、网络套接字等 虽然不直接表现为Java堆内存增长,但会导致系统资源耗…...
无人甘蔗小车履带式底盘行走系统的研究
1.1 研究背景与意义 1.1.1 研究背景 甘蔗作为全球最重要的糖料作物之一,在农业经济领域占据着举足轻重的地位。我国是甘蔗的主要种植国家,尤其是广西、广东、云南等地,甘蔗种植面积广泛,是当地农业经济的重要支柱产业。甘蔗不仅…...
Redis设计与实现——单机Redis实现
RedisDB RedisDB的核心结构 键空间(dict*dict) 结构:哈希表(字典),键为字符串对象(SDS),值为 Redis 对象(字符串、列表、哈希等)。 功能&#x…...
ES C++客户端安装及使用
介绍 Elasticsearch , 简称 ES ,它是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源&…...
C++学习之STL学习
在经过前面的简单的C入门语法的学习后,我们开始接触C最重要的组成部分之一:STL 目录 STL的介绍 什么是STL STL的历史 UTF-8编码原理(了解) UTF-8编码原理 核心编码规则 规则解析 编码步骤示例 1. 确定码点范围 2. 转换为…...
【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发
文章目录 工具包 CuLab - LabVIEW 的 GPU 工具包特性和功能功能亮点类似 LabVIEW 的 GPU 代码开发支持的功能数值类型和维数开发系统要求授权售价 工具包 CuLab - LabVIEW 的 GPU 工具包 CuLab 是一款非常直观易用的 LabVIEW 工具包,旨在加速 Nvidia GPU 上的计算密…...
LangChain对话链:打造智能多轮对话机器人
LangChain对话链:打造智能多轮对话机器人 目录 LangChain对话链:打造智能多轮对话机器人ConversationChain 是什么核心功能与特点基本用法示例内存机制自定义提示词应用场景与其他链的结合`SequentialChain` 是什么 硬件组成: NodeMC…...
HTML12:文本框和单选框
表单元素格式 属性说明type指定元素的类型。text、password、 checkbox、 radio、submit、reset、file、hidden、image 和button,默认为textname指定表单元素的名称value元素的初始值。type为radio时必须指定一个值size指定表单元素的初始宽度。当type为text 或pas…...
JVM规范之运行时数据区域
JVM运行时数据区 前言为什么要阅读jvm规范?阅读本篇文章可以学习到啥? 正文概述JVM线程私有的运行时数据区pc(program counter) RegisterJVM StackNative Method Stack JVM线程共享的运行时数据区HeapMethod AreaRun-time constant pool 总结参考链接 前…...
LVGL(lv_btnmatrix矩阵按钮)
文章目录 🔧 1. 基本概念📌 lv\_btnmatrix 是什么? 🧱 2. 基本结构和用法✅ 创建按钮矩阵✅ 设置按钮文字 🧰 3. 设置按钮行为🔄 4. 响应按钮点击🎨 5. 自定义样式📌 6. 使用技巧&am…...
AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue
AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR(AUTomotive Open Sy…...
英语时态--中英文对“时间”的不同理解
文章目录 中英文时间上的差异我现在正在休息一般现在时1. 经常发生的动作2. 表客观事实3. 表示现在的状态一般将来时1. will2. be going to含义1:打算在将来某时做某事含义2:某事预计要发生而且不可避免中英文时间上的差异 我现在正在休息 “我现在正在休息。”用英文怎么说…...
Linux基础开发工具一(yum/apt ,vim)
前言 Linux下,如何进行软件安装,查找,卸载 1.源代码安装 2. rpm安装方式,安装包的本质,就是把源代码在Linux下编译好,然后打包(别人把自己编译好的软件打包给你让你去安装) 上面…...
Java 线程池原理
Java 线程池是一种管理和复用线程的机制,其原理如下: 核心概念 线程池的初始化 :在创建线程池时,需要设置一些关键参数,如核心线程数(corePoolSize)、最大线程数(maximumPoolSize&am…...
AJAX 使用 和 HTTP
ajax学习 promise和 awit Node.js 和 webpack 前端工程化 Git工具 AJAX异步的JS和XML: 使用XML对象和服务器通信 在这里插入图片描述 统一资源定位符 URL HTTP 超文本传输协议 域名 资源路径 资源目录和类型 URL 查询参数 使用?表示之后的参数…...
mem0跟Memgraph交互
目录 1. 安装和设置2. 配置连接3. 使用 mem0 进行交互4. 添加和查询数据5. 代码运行结果 1. 安装和设置 首先,确保你已经安装了 Memgraph 和 mem0 库。你可以使用 pip 来安装 mem0: uv pip install "mem0ai[graph]" uv pip install langchai…...
httpclient请求出现403
问题 httpclient请求对方服务器报403,用postman是可以的 解决方案: request.setHeader( “User-Agent” ,“Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0” ); // 设置请求头 原因: 因为没有设置为浏览器形式&#…...
验证码与登录过程逻辑学习总结
目录 前言 一、验证码与登录 二、使用步骤 1.先apipost测试一波 2.先搞验证码 3.跨域问题 4.后端走起 总结 前言 近期要做一个比较完整的demo,需要自己做一个前端登录页面,不过api接口都是现成的,一开始以为过程会很easy,…...
openai接口参数max_tokens改名max-completion-tokens?
文章目录 关于max_tokens参数max_tokens改max-completion-tokens?控制 OpenAI 模型响应的长度 关于max_tokens参数 大模型 API(比如 OpenAI、DeepSeek、Moonshot 等)都是按照“Token 数量”来计费。 控制内容:控制一次请求返回的…...