【Linux 19】线程概念

news2024/9/20 8:05:13

文章目录

  • 🌈 一、线程的概念
    • ⭐ 1. 线程是什么
    • ⭐ 2. 线程的优点
    • ⭐ 3. 线程的缺点
    • ⭐ 4. 线程的异常
    • ⭐ 5. 线程的用途
  • 🌈 二、进程和线程
    • ⭐ 1. 进程和线程的区别
    • ⭐ 2. 进程的多线程共享
    • ⭐ 3. 进程和线程的关系
    • ⭐ 4. 线程私有的资源 (重要:面试)

🌈 一、线程的概念

⭐ 1. 线程是什么

  • 线程是 CPU 调度的基本单位

  • 一个程序中的一条执行路线被称作线程 thread,确切的说,线程是一个进程内部的控制序列

  • 只要是进程,则至少会有一个执行线程。

  • 线程是在进程的内部运行的执行流,本质是在进程地址空间内运行。

  • 在 Linux 中,没有线程的概念,只有轻量级进程,其复用了进程 PCB 的结构和调度算法,但看到的 PCB 要比传统进程更轻量化。

    • 由于线程的大部分内容和进程类似,如果要重新设计线程相关的结构体和调度算法就很不划算。
  • 透过进程虚拟地址空间,能够看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

1. 进程的创建与映射

  • 创建进程需要创建:进程控制块 task_struct、进程地址空间 mm_struct、页表。
  • 虚拟地址 (进程地址空间) 和物理地址之间还要通过页表建立映射。
  • 每个进程都拥有独立的地址空间和页表,即进程在运行时本身就具有独立性。

image-20240910094533323

2. 线程的创建与映射

  • 如果创建多个 task_struct,并让这多个 task_struct 共享进程地址空间和页表,这多个 task_struct 就是进程内部的多个执行流,即为 “线程”。
  • 相比于进程,线程的创建成本明显低了很多,只需要创建出 task_struct 然后复用进程的地址空间和页表即可。
  • 线程在进程内部运行,本质就是线程在进程地址空间内运行,即进程曾经申请的所有资源,几乎都是被所有线程共享的。

image-20240910100740871

3. CPU 无需识别调度的是进程还是线程

  • CPU 只关心执行流,一个进程内至少要有一个执行流,且不管进程内有多少个执行流,CPU 都是以 task_struct 为单位进行调度。
  1. 单执行流被 CPU 调度:

image-20240910102423850

  1. 多执行流被 CPU 调度:

image-20240910102340263

4. Linux 中线程的实现方案

  • Linux 中并不存在真正的线程,只有轻量级进程的概念,其复用了进程的数据结构和相关算法。
  • OS 中会存在着大量的进程,而一个进程中又存在 1 ~ n 个线程,线程的数量肯定是比进程多的。
  • 如果 OS 要实现真正的线程,就要专门实现线程的结构体、创建线程、终止线程、调度线程等一切与线程有关的算法,越复杂越不好。
  • 在 Linux 看来,进程控制块和线程控制块的相似点有很多,没必要专门去为线程设计一套数据结构,直接复用进程结构相关算法即可。

⭐ 2. 线程的优点

  • 创建一个线程的代价比创建一个进程的代价小很多。
  • 和进程间的切换相比,线程之间的切换需要 OS 做的工作会少很多。
  • 线程占用的资源比进程少很多。
  • 线程可以充分利用多处理器的可并行数量,一般创建的线程的数量 = CPU 核一般 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

image-20240911092718601

⭐ 4. 线程私有的资源 (重要:面试)

  1. 线程的硬件上下文,CPU 寄存器的值 (强调线程的调度)
  2. 线程的独立栈结构 (强调线程的常规运行)

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

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

相关文章

Map--08--CurrentHashMap 与 Hashtable的异同?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Map方法computeIfAbsent1.computeIfAbsent 方法的简介2.案例computeIfAbsent() Map方法computeIfAbsent computeIfAbsent方法是Java 8中引入的一种简化操作Map的方…

探索 AI 代理驱动的汽车保险索赔 RAG 管道。

这篇文章中,我探讨了最近的一项实验,旨在创建一个针对保险行业量身定制的 RAG 管道,专门用于处理汽车保险索赔,目的是尽可能减少处理时间。 我还展示了 Autogen AI Agents 的实施,通过代理交互和对样本汽车保险索赔文件…

李宏毅结构化学习 01

文章目录 一、结构化学校介绍二、线性模型 一、结构化学校介绍 训练时,F(x,y)是评估X与Y有多匹配,越匹配,R的值就越大。 测试时,确定F(x,y)后,给定一个x后,穷举所有y,使得F最大的那个就是 y ~ \…

k8s的配置

k8s的配置 拉取镜像,创建pod:从阿里云拉取 [rootk8s-master ~]# kubectl run nginx --imagenginx:latest [rootk8s-master ~]# kubectl get po -Aowide|grep nginx default nginx 0/1 ImagePullBackO…

【Linux取经之路】用户权限管理

目录 shell命令以及运行原理 Linux权限的概念 1、用户的概念 2、切换用户 Linux权限管理 1、文件访问者的分类 2、文件类型和访问权限 3、文件访问权限的修改 4、文件所有权的修改 5、设置权限掩码 6、用户提权 7、目录的权限 8、粘滞位 shell命令以及运行原理 Linu…

D - 88888888

设N有K位 则&#xff1a; p998244353&#xff0c;是质数&#xff0c;vn%p只需要求一下分母的逆元即可。 分母于p互质&#xff0c;满足飞马小定理&#xff0c;故可以用其求逆元。 再用一下这个结论就OK了 #include<bits/stdc.h> using namespace std; #define int long…

《JavaEE进阶》----16.<Mybatis简介、操作步骤、相关配置>

本篇博客讲记录&#xff1a; 1.回顾MySQL的JDBC操作 2..Mybatis简介、Mybatis操作数据库的步骤 3.Mybatis 相关日志的配置&#xff08;日志的配置、驼峰自动转换的配置&#xff09; 前言 之前学习应用分层时我们知道Web应用程序一般分为三层&#xff0c;Controller、Service、D…

使用Python从头开始创建PowerPoint演示文稿

目录 一、环境搭建与基础知识 1.1 环境搭建 1.2 基础知识 二、创建演示文稿对象 三、添加幻灯片 3.1 选择幻灯片布局 3.2 设置幻灯片内容 3.2.1 设置标题和副标题 3.2.2 添加文本内容 3.2.3 插入图片 3.2.4 插入图表 四、高级应用&#xff1a;批量生成演示文稿 4.…

太惨了!许家印前妻每个月只能花18万

文&#xff5c;琥珀食酒社 作者 | 积溪 许家印前妻被判了 我跟你说啊她真是太惨了 一个月只能取18万啊 你说这日子怎么过啊 买个包包都不够啊&#xff01; 大家都知道许皮带爆雷&#xff08;BL&#xff09;后 丁玉梅虽然和许皮带战略性离婚&#xff0c;逃到了英国 还把…

【计算机组成原理】浮点数的表示及IEEE 754规格化

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

软件工程测试

1. 软件测试概述 通俗地说&#xff0c;软件测试是为了发现错误而执行程序的过程。 软件测试&#xff1a;根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例&#xff08;即输入数据及其预期的输出结果&#xff09;&#xff0c;并利用这些测试用例去运行程序…

深度学习:基础知识

深度学习是机器学习的一个领域 神经网络构造 一个神经元有n个输入&#xff0c;每一个输入对应一个权值w&#xff0c;神经元内会对输入与权重做乘法后求和。 感知器 由两层神经元组成的神经网络--“感知器”&#xff08;Perceptron&#xff09;,感知器只能线性划分数据。 公式…

Netty笔记03-组件Channel

文章目录 Channel概述Channel 的概念Channel 的主要功能Channel 的生命周期Channel 的状态Channel 的类型channel 的主要方法 ChannelFutureCloseFuture&#x1f4a1; netty异步提升的是什么要点总结 Channel概述 Channel 的概念 在 Netty 中&#xff0c;Channel 是一个非常重…

c++题目_洛谷 / 题目详情 P1012 [NOIP1998 提高组] 拼数

# [NOIP1998 提高组] 拼数 ## 题目描述 设有 $n$ 个正整数 $a_1 \dots a_n$&#xff0c;将它们联接成一排&#xff0c;相邻数字首尾相接&#xff0c;组成一个最大的整数。 ## 输入格式 第一行有一个整数&#xff0c;表示数字个数 $n$。 第二行有 $n$ 个整数&#xff0c;表…

Linux学习笔记(黑马程序员,前四章节)

第一章 快照 虚拟机快照&#xff1a; 通俗来说&#xff0c;在学习阶段我们无法避免的可能损坏Linux操作系统&#xff0c;如果损坏的话&#xff0c;重新安装一个Linux操作系统就会十分麻烦。VMware虚拟机支持为虚拟机制作快照。通过快照将当前虚拟机的状态保存下来&#xff0c;…

Leetcode 移动零

要求将数组中的所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。下面是该题的 C 解决方案&#xff1a; class Solution { public:void moveZeroes(vector<int>& nums) {int nonZeroPos 0; // 记录非零元素应该放置的位置// 遍历数组&#xff0c;…

镭速如何高效使用SQLite数据库高速传输结构化数据文件传输

SQLite数据库因其小巧、跨平台和无需配置的特性&#xff0c;在众多关系型数据库中独树一帜。与传统的服务器/客户端架构数据库&#xff0c;例如MySQL不同&#xff0c;SQLite通常被嵌入到应用程序中作为一个库。它不仅支持创建索引&#xff0c;还严格遵循ACID原则&#xff0c;非…

先攒一波硬件,过几年再给电脑升级,靠谱吗?想啥呢?

前言 最近有小伙伴发来消息&#xff1a;我可以今年先买电脑的部分硬件&#xff0c;明年再买电脑的另一部分硬件&#xff0c;再组装起来不就是一台电脑了吗&#xff1f; 这确实是一个很好的办法。 我还记得大学有个室友&#xff0c;从大一每个月省吃俭用&#xff0c;攒下的钱…

全球AI应用市场洞察:市场快速崛起,“陪伴式AI”、“图像AI”应用爆款频出!

自2023年 GPT4 的问世以来&#xff0c;得益于这股新的技术变量&#xff0c;各类 AI 应用在市场上遍地开花。在这轮热潮之下&#xff0c;不同市场和细分赛道有何机遇和挑战&#xff1f;以下根据 Sensor Tower 最新报告分析&#xff0c;帮助移动开发者、广告主洞察全球AI应用市场…

Linux系统:chgrp命令

1、命令详解&#xff1a; chgrp命令是Linux操作系统中用于修改文件或目录的所属组的命令。chgrp命令还可以修改链接文件的所属组&#xff0c;而不是链接所指向的文件的所属组。默认情况下&#xff0c;只有文件的所有者和超级用户才能修改文件的所属组&#xff0c;但如果用户是一…