【Linux】多线程概念

news2025/1/17 18:09:40

目录

  • 🌈前言
  • 🌸1、Linux线程概念
    • 🍡1.1、概念
    • 🍢1.2、线程的优点
    • 🍧1.3、线程的缺点
    • 🍨1.4、线程的异常和用途
  • 🌺2、Linux下进程 vs 线程

🌈前言

这篇文章给大家带来线程的学习!!!


🌸1、Linux线程概念

🍡1.1、概念

前言:

  • 我们都知道:fork之后,父子代码是共享的,可以通过if else进行分流执行不同的代码块

  • 不同的执行流,可以做到进行对特定的资源进行划分

  • 父子进程都有自己的地址空间和页表,因为它们之间具有独立性,互不干扰

图解:

在这里插入图片描述


线程概念:
  • 在一个程序里的一个执行路线就叫做:线程(thread),更准确的定义是:线程是“一个进程内部控制序列
  • 进程至少都有一个执行线程,进程与线程的比例是 1 比 N
  • 线程在进程内部运行,本质是在进程地址空间内运行
  • 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化
  • 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流

在这里插入图片描述


Linux下的线程
  • 在Linux中进程和线程没有概念上的区分,它们都叫做:执行流。Linux线程(TCB)是用PCB模拟实现的,它复用了PCB的代码
  • Linux下的TCB就是PCB,因为他们的逻辑结构是一样的

Other OS下的线程
  • 在Other OS中,它们认为进程和线程在执行流层面是不一样了,为此又实现了一个TCB结构体,真线程的维护成本更高
  • Other OS中的TCBPCB的关系也百变得错综复杂,难以理清,维护成本高

重新理解进程
  • 前面学习的进程 = 内核数据结构 + 进程对应的代码和数据
  • 现在学习的进程 = 内核视角:承担分配系统资源的基本实体 (进程的基座属性),即:向系统申请资源的基本单位
  • 我们之前所学的进程是单执行流进程(内部只有一个task_struct),而线程是多执行流进程(内部包含多个task_struct)
  • 线程(执行流)是CPU调取的基本单位

下图中:用蓝色框起来的PCB中的多个task_struct、地址空间、页表、物理内存的数据,这一集合叫做:进程

在这里插入图片描述

线程也叫轻量级进程,为什么呢?

  • 因为在CPU的视角中:进程与线程的比例是 1 比 N

  • task_struct(单执行流进程) <= 传统的PCB(包含1个或多个执行流的进程)

  • 进程地址空间的资源会被创建的多个线程所瓜分并且映射到物理内存中,当CPU调度时,只需要执行进程的一部分代码即可


🍢1.2、线程的优点

线程优点
  • 创建一个新线程的代价,要比创建一个进程小得多,因为创建线程只需要将进程地址空间一部分资源分配给它即可

上下文切换:内核在CPU上对进程或者线程进行切换,上下文切换过程中的信息被保存在PCB当中

  • 进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多。因为进程切换时,需要进行上下文页表的切换,而线程不用进行页表的切换
  • 线程占用的资源要比进程少很多,因为进程的地址空间一部分资源会分配给线程
  • 能充分利用多处理器的可并行数量(能够同时执行多个线程的代码

I/O操作:比如向显示器读写数据、向硬盘读写数据,向网卡读写数据等等…

  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务。因为在申请I/O资源时,可能被其他进程占用,进程需要到对应的资源等待队列中等待

计算密集应用:比如有一个软件,你在软件中看电视,并且下载东西,它们同步运行

  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现

I/O密集型应用:比如OS中的文件编码解码操作,会一直占用CPU的资源

  • I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作
  • 进程是串行的,如果发生阻塞就会一直等待资源就绪,多线程是并行的,发生阻塞会进行重叠等待资源就绪

🍧1.3、线程的缺点

性能损失
  • 一个很少被外部事件阻塞计算密集型线程往往无法与其它线程共享同一个处理器
  • 如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变
健壮性降低
  • 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的
  • 换句话说,就是:线程之间是缺乏保护的,它们的隔离性差
缺乏访问控制
  • 进程是访问控制基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响
  • 比如:创建多个线程,线程都往显示器打印数据,可以看出数据都是乱的,跟fork一样
编程难度提高
  • 编写与调试一个多线程程序比单线程程序困难得多

🍨1.4、线程的异常和用途

异常问题
  • 单个线程如果出现除零错误野指针问题导致线程崩溃进程也会随着崩溃
  • 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,导致进程终止,该进程内的所有线程也就随即退出
线程的用途
  • 合理的使用多线程,能提高CPU密集型程序执行效率
  • 合理的使用多线程,能提高IO密集型程序的用户体验(如:生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)

🌺2、Linux下进程 vs 线程

进程与线程的区别
  • 进程是OS资源分配的基本单位
  • 线程是CPU调度的基本单位
  • 线程共享进程数据,但也拥有自己的一部分(私有)数据:线程ID、一组寄存器、栈、errno(错误码)、信号屏蔽字、CPU调度优先级
  • 进程的多个线程共享同一地址空间,因此Text SegmentData Segment都是共享的
  • 如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到

紫色框里面和箭头指的区域,其他线程都是可见的!!!

在这里插入图片描述

除此之外,各线程还共享以下进程资源和环境:

  • 文件描述符表(fd_array)

  • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)

  • 进程当前所处的工作目录(CWD)

  • 用户id(UID) 和 组id(PID)-- 在OS中启动一个进程/线程,要知道是谁启动的

进程和线程的关系图:

在这里插入图片描述

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

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

相关文章

PID算法入门(一)

&#xff11;.简介 PID是Proportional(比例), Integral(积分), Differential(微分)的首字母缩写,他是一种结合比例,积分,微分三个环节于一体的闭环控制算法. &#xff12;.PID各环节 &#xff12;.&#xff11;比例环节 成比例地反应控制系统的偏差信号&#xff0c;即输出&a…

Codeforces Round #843 (Div. 2) A1 —— D

题目地址&#xff1a;Dashboard - Codeforces Round #843 (Div. 2) - Codeforces一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.11 Last edited: 2023.1.11 目录 ​编辑 A1. Gardener…

读论文——day61 目标检测模型的决策依据与可信度分析

目标检测模型的决策依据与可信度分析本文贡献及原文1 相关工作&#xff08;略看&#xff09;1.3 目标检测模型2 背景知识&#xff08;LIME&#xff09;2.2 LIME3 目标检测决策依据及可信度分析3.1 决策依据3.2 对目标检测模型的预测进行可信度评价4 基于 LIME 的目标检测模型解…

(第四章)OpenGL超级宝典学习:必要的数学知识

必要的数学知识 前言 在本章当中&#xff0c;作者着重介绍了几个和3D图形学重要的数学知识&#xff0c;线性代数基础好的同学可以直接绕过本章&#xff0c;说实话这篇博客写到这里&#xff0c;我是非常犹豫的&#xff0c;本章节的内容可以说是很基础&#xff0c;但是相当…

SSM框架01_Spring

有一个效应叫知识诅咒&#xff1a;自己一旦知道了某事&#xff0c;就无法想象这件事在未知者眼中的样子。00-Spring课程介绍01-初识Spring今天所学的Spring其实是Spring家族中的Spring Framework;Spring Fra是Spring家族中其他框架的底层基础&#xff0c;学好Spring可以为其他S…

Morse1题解

原理摩尔斯电码和电报简单说一下电报和摩尔斯电码的原理最简单的电报模型就是一个电源&#xff0c;一个开关和一个电磁铁当需要长距离使用时候&#xff0c;需要用到继电器按下开关&#xff0c;电磁铁会吸引磁铁长按开关&#xff0c;电磁铁就会闭合一段时间&#xff0c;留下一划…

Jenkins集成GitLab Webhooks自动化构建

JenkinsGitLab Webhooks自动构建项目1 构建步骤1.1 Jenkins中设置构建触发器1.2 Build Authorization Token Root插件安装1.3 GitLab配置Webhooks2 测试webhooks2.1 测试推送事件2.2 测试合并请求事件2.3 代码修改提交测试1 构建步骤 1.1 Jenkins中设置构建触发器 这里先随便写…

Markdown与DITA比较

Markdown是一种轻量级标记语言&#xff0c;创始人为John Gruber。它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的HTML文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。由于Markdown的轻量化、易读易写特性&#xff0c;并且对于图片&am…

第一章Mybatis基础操作学习

文章目录MyBatis简介MyBatis历史MyBatis特性和其它持久化层技术对比搭建MyBatis开发环境创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件通过junit测试功能加入log4j日志功能不带参数的增删改查Mapper接口的编写对应Mapper接口的xml文件编写核心配…

【Python基础】如何使用pycharm

1、设置Python 解释器 在任何项目&#xff0c;第一步就是设置Python 解释器&#xff0c;就是那个Python.exe 在File->Setting->Projec: xxx 下找到 Project Interpreter。然后修改为你需要的 Python 解释器。注意这个地方一定要注意的是&#xff1a;在选择 Python 解释…

Dubbo 学习笔记

Dubbo 学习笔记 1.基础知识 1.1 分布式基础理论 1.1.1 什么是分布式系统&#xff1f; 《分布式系统原理与范型》定义&#xff1a; 分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统分布式系统&#xff08;distributed system&#xf…

java基于ssm蛋糕店蛋糕商城蛋糕系统网站源码

简介 java使用ssm开发的蛋糕商城系统&#xff0c;用户可以注册浏览商品&#xff0c;加入购物车或者直接下单购买&#xff0c;在个人中心管理收货地址和订单&#xff0c;管理员也就是商家登录后台可以发布商品&#xff0c;上下架商品&#xff0c;处理待发货订单等。 演示视频 …

HTML贪吃蛇游戏源码(穿墙)

演示 完整HTML <!DOCTYPE html> <html> <head><meta charset"utf-8"><title><・)))><<</title><link rel"shortcut icon" href"${ctx}/image/snake_eating.png"><meta name"ref…

中科大2006年复试机试题

中科大2006年复试机试题 文章目录中科大2006年复试机试题第一题问题描述解题思路及代码第二题问题描述解题思路及代码第三题问题描述解题思路及代码第四题问题描述解题思路及代码第五题问题描述解题思路及代码第六题问题描述解题思路及代码第一题 问题描述 求矩阵的转置。 给…

three.js入门篇6之 环境贴图、经纬线映射贴图与高动态范围成像HDR

目录013-1 环境贴图013-2 经纬度映射贴图与HDR013-1 环境贴图 就是把周边的环境&#xff0c;贴在物体的表面之上 注意&#xff1a;px&#xff1a;x轴正向&#xff0c;nx&#xff1a;x轴负向 import * as THREE from "three" // console.log(main.js,THREE);// 导入…

06什么是Fabless?什么是IDM?

Fabless是SIC&#xff08;半导体集成电路&#xff09;行业中无生产线设计公司的简称&#xff0c;只搞设计的无晶圆厂半导体公司&#xff0c;生产交给像台积电这样的代工厂去做。 IDM是整合元件制造商&#xff0c;像英特尔这样既设计又制造的就叫IDM&#xff0c;因为规模大&…

对于字节,16进制,2进制, 0xFF,位移的一些杂记

1.普通字符串95 对应的16进制的展示&#xff0c;使用工具查看如下图 下图为普通字符串 下图为95对应的16进制 95对应的16进制字符串为39 35》39代表一个字节 35代表另一个字节 &#xff08;一个字节是由两位16进制字符串组成&#xff0c;比如39或35&#xff09; 1个字节对应…

select for update加了行锁还是表锁?

最近在开发需求的时候&#xff0c;用到了select......for update。在代码评审的时候&#xff0c;一位同事说 &#xff0c;唯一索引一个非索引字段&#xff0c;是否可能会锁全表呢&#xff1f;本文将通过9个实验操作的例子&#xff0c;给大家验证select......for update到底加了…

迁移环境时,忘记私钥证书密码怎么办?

知行之桥的版本在进行不断更新&#xff0c;相较之前的版本而言&#xff0c;知行之桥每一次更新的版本&#xff0c;无论在操作还是功能亦或是便利性上都有更好的优势&#xff0c;因此不少企业会在新版本更新之后果断选择新的版本&#xff0c;企业选择版本更新之后&#xff0c;需…

He3 新版上新

系统功能更新 支持拖动工具&#xff0c;调整位置 支持置顶 支持自定义分类 新增工具 Paseto 生成器 2. 文本分析 JSON 转 PHP&#xff0c;YAML 转 PHP UTF7 编码、UTF7 解码 6. UTM 生成器 CSS 边框圆角生成器 CSV 类转换工具&#xff0c;目前支持 CSV 与 Markdown、HTML、JS…