【Linux】线程概念

news2024/11/18 14:30:26

目录

  • 🌈前言
  • 🌸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的关系也百变得错综复杂,难以理清,维护成本高

重新理解进程
  • 前面学习的进程 = 内核数据结构 + 进程对应的代码和数据
  • 现在学习的进程 = 内核视角:承担分配系统资源的基本实体 (进程的基座属性),即:向系统申请资源的基本单位
  • Linux没有真正的实现线程,而是用PCB模拟实现,所有没有提供线程接口
  • 我们之前所学的进程是单执行流进程(内部只有一个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/157462.html

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

相关文章

渗透测试基础【01】——测试流程(IPC$)

渗透测试基础【01】——测试流程 注意&#xff0c;攻击对方需要对方授权&#xff0c;本文章目的只为教学&#xff0c;不要拿去干违法的事 1 渗透测试流程 授权&#xff08;获取目标用户授权&#xff0c;否则是违法行为&#xff09;信息收集 nslookup whois扫描漏洞 nmapip…

【前端代码高亮】页面代码高亮展示之Highlight高亮组件应用详解,附多个主题效果

【写在前面】作为前端开发的基本上都有接触这个高亮组件&#xff0c;这个也是目前被大家誉为最全面&#xff0c;体验最好的&#xff0c;所以针对数据展示型高亮显示我是力推这个的&#xff0c;但是我个人还是觉得还有不完美的地方&#xff0c;比如说一边输入一边高亮就不行了。…

《UEFI内核导读》如果没有内存,程序代码还能不能执行?

敬请关注&#xff1a;“固件C字营 首先思考一个问题&#xff0c;冯洛伊曼架构的计算机如果没有内存&#xff0c;代码能被否正常执行&#xff1f;过程&#xff08;函数&#xff09;能不能被相互调用&#xff1f;答案是肯定的&#xff0c;其中的一个实现方法如下。这里只介绍汇编…

如何在Instagram上开店?Instagram开店教程请收好

Instagram 是国外非常重要的图像分享平台&#xff0c;具有很强的视觉吸引力。更重要的是&#xff0c;它是最受网红欢迎的社交媒体网站之一&#xff0c;每天有超过5亿用户访问它。巨大的流量和高活跃度&#xff0c;为卖家提供了大量的营销机会。而且最重要的是&#xff0c;现在在…

唤醒手腕 Go 语言开发学习笔记(基本简介、环境安装、基础知识)

1. Go语言简介 Go&#xff08;又称 Golang&#xff09;是 Google 的 Robert Griesemer&#xff0c;Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近&#xff0c;但功能上有&#xff1a;内存安全&#xff0c;GC&#xff08;垃圾回收&#xf…

day12|层序遍历合集、226.翻转二叉树、101.对称二叉树

目录 层序遍历合集 102.二叉树的层序遍历 107.二叉树的层次遍历II 199.二叉树的右视图 637.二叉树的层平均值 429.N叉树的层序遍历 515.在每个树行中找最大值 116.填充每个节点的下一个右侧节点指针 117.填充每个节点的下一个右侧节点指针II 104.二叉树的最大深度 11…

Hi3861鸿蒙物联网项目实战:智慧农业

华清远见FS-Hi3861开发套件&#xff0c;支持HarmonyOS 3.0系统。开发板主控Hi3861芯片内置WiFi功能&#xff0c;开发板板载资源丰富&#xff0c;包括传感器、执行器、NFC、显示屏等&#xff0c;同时还配套丰富的拓展模块。开发板配套丰富的学习资料&#xff0c;包括全套开发教程…

联合体(共用体) :(笔记补充)

目录 一.联合体的基本概念 二.相关面试题 三.联合体大小计算 关于结构体的内存对齐&#xff1a;http://t.csdn.cn/fbQuo 一.联合体的基本概念 联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff08;所以…

jar转成dex文件 dex文件转化为smali文件

jar转成dex文件 dx 可以利用android studio中的dx工具。 可以看到android的tool安装位置: 在此路径下的如下目录有dx.bat,这个正是我们需要使用的工具。 D:\sdk\build-tools\30.0.3将dx.bat添加到环境变量 基本指令 > dx --dex --output 输出路径 待转化的jar包C

MySQL通过 XtraBackup 备份恢复单个库

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;王权富贵文章来源&#xff1a;GreatSQL社区原创 1.概述 本文通过 XtraBackup 备份单个数据库&#xff0c;然后…

Elasticsearchdump 数据导入/导出

一.安装过程 当前工具主要是用来对ES中的数据进行数据导入/导出&#xff0c;以及对数据迁移相关&#xff0c;使用elasticdump工具需要使用到npm&#xff0c;所以需要安装相关的依赖 目前使用到的ES版本是7.x 安装NODE 通过npm安装elasticdump # 本地安装和全局安装的区别在于…

3.25 haas506 2.0开发教程-充电电压检测

haas506 2.0开发教程-充电检测1.案例说明2.硬件准备连线3.代码4.测试1.案例说明 可以通过USB端口对连接在开发板上的锂电池进行充电&#xff0c;USB最大供电电压5V。案例使用锂电池供电。通过原理图看到使用ADC2读取锂电池电压&#xff0c;并且采集电压做了分压处理&#xff0…

第六篇 VGGNet——模型精讲

文章目录 1、模型介绍网络结构3 模型特性1、模型介绍 VGGNet是通过简单堆叠卷积构建网络的巅峰之作,在后面的模型就是ResNet这种残差网络的时代。 VGGNet是由牛津大学视觉几何小组(Visual Geometry Group, VGG)提出的一种深层卷积网络结构,他们以7.32%的错误率赢得了201…

为什么我们的微服务中需要网关?

玩过微服务的小伙伴对 Spring Cloud 中的的 Spring Cloud Gateway 多多少少都有一些了解&#xff0c;松哥之前既写过相关的文章&#xff0c;也录过相关的视频跟小伙伴们介绍 Spring Cloud Gateway&#xff0c;不过在之前的介绍中&#xff0c;我可能更加侧重于跟小伙伴们介绍 Sp…

接到新需求时,从何开始设计?

即便我们能够极尽所能把代码写整洁&#xff0c;规避各种坏味道&#xff0c;但我们小心翼翼维护的代码&#xff0c;还是可能因为新的需求被破坏。 新的需求总会在路上&#xff0c;所以&#xff0c;写代码时需要时时刻刻保持嗅觉。 实现驳回 有个功能&#xff0c;内容作品提交…

lxmlxpath一站式教学

文章目录XPath定义XPath 概览安装lxml初步使用xpath 常用表达式获取所有节点获取子节点获取父亲节点属性匹配获取文本获取属性属性多值匹配多属性匹配按序选择节点轴选择总结XPath定义 XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历…

OMNet++安装pydev

菜单栏->Help->Install New SoftWare->Add 输入 Pydev http://pydev.sourceforge.net/pydev_update_site/5.2.0链接为下载5.2.0版本&#xff0c;若jdk<1.8安装5.2.0之前的版本。\color{blue}{链接为下载5.2.0版本&#xff0c;若jdk<1.8安装5.2.0之前的版本。}链…

无代理Bean对象Spring循环依赖处理

Bean A和B互相依赖 A对象或者B对象,创建对象时会形成死循环,解决: Spring中创建对象:实例化、初始化 闭环:此时,图中是一个闭环,如果想解决这个问题,那么就必须要保证不会出现第二次创建A(B)对象这个步骤,也就是说从容器中获取A的时候必须要能够获取到 思考,在spring…

RabbitMQ(三)工作原理及核心概念

目录工作原理图1.Connection 连接2.Channel 信道3.Virtual host 虚拟主机4.Queue 队列5.Exchange 交换机5.1 direct5.2 fanout5.3 topic5.4 headers官网地址&#xff1a;https://www.rabbitmq.com/ 下载地址&#xff1a;https://www.rabbitmq.com/download.html RabbitMQ 的5大…

chk文件恢复和文件恢复的区别有哪些?

文件恢复也就是我们常说的数据恢复&#xff0c;一般用于恢复误删除、损坏的文件数据&#xff0c;那么chk文件恢复又是什么意思呢&#xff1f;两者有什么区别呢&#xff1f;文件恢复市面上常见的文件恢复软件&#xff0c;一般都是用于恢复那些被删除、损坏的文件数据恢复&#x…