当前位置: 首页 > news >正文

【Linux】线程概念

📝前言:

这篇文章我们来讲讲Linux——线程概念

  1. 线程的基本概念
  2. 线程的优缺点
  3. 线程与进程

🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏


这里写目录标题

  • 📝前言:
  • 一,线程的基本概念
    • 1. 基本概念
    • 2. 资源划分
    • 3. 线程资源划分与共享
  • 二,线程的优缺点
    • 1. 优点
    • 2. 缺点
    • 3. 线程的异常
    • 4. 线程的用途
  • 三,线程与进程
    • 1. 进程和线程
    • 2. 进程的多个线程共享

一,线程的基本概念

1. 基本概念

  • 进程:进程 == 内核数据结构 + 代码和数据
    • 进程是承担分配系统资源的基本实体
  • 线程:进程内部的一个执行分支
    • 在Linux下,线程就是轻量级的进程(但Windows不是,Windows有自己的实现方案)
    • 线程是CPU调度的基本单位(因为Linux下,线程是用进程模拟的,所以CPU的调度策略都可以用进程那一套!)
    • 线程这个说法是操作系统提供的(属于用户视角,但是对于Linux底层,线程就是轻量级进程)

2. 资源划分

  • 创建一个进程:我们要创建task_struct进程地址空间页表
  • 但是对于一个线程,我们只需要创建task_struct + 资源划分
    • 对资源的划分,本质是对进程地址空间的划分(虚拟地址,就是资源的代表)
    • 一个执行流有多少资源,本质上就是:在合法的的情况下,拥有的虚拟地址
    • 而函数天然就是代码和数据的集合,所以我们通常让线程执行进程中不同的函数(把函数分给线程,就完成了资源的划分)
  • 多个线程的task_struct指向同一个进程的进程地址空间

在这里插入图片描述

  • 进程强调独占,部分资源共享(比如通信的时候)
  • 线程强调共享(因为线程都在同一个进程内),部分资源独占
  • 资源的划分和共享本质是对虚拟地址的划分和共享

3. 线程资源划分与共享

  • 线程进行资源划分:本质是划分地址空间,获得一定范围的合法虚拟地址。再本质:就是在划分页表
  • 线程进行资源共享:本质是对地址空间的共享,再本质:就是对页表条目的共享

二,线程的优缺点

以下优缺点是相较于进程的。

1. 优点

  • 创建⼀个新线程的代价要比创建⼀个新进程小得多
  • 切换方面,线程切换的代价也要更小
    • 切进程:要切硬件上下文,要切CR3的页目录…
    • 切线程:地址空间还是一样的,只用切task_struct,CR3也不用切…
    • 还有:进程缓存机制CacheTLB
    • 当硬件上下文切换的时候会扰乱进程的缓存机制,对于进程,因为直接换了,所以CacheTLB的内容都无效了。但是对于线程,还在同一个进程内,CacheTLB的失效面积小。
  • 线程占用的资源要比进程少很
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运⾏,将计算分解到多个线程中实现
  • I/O密集型应⽤,为了提⾼性能,将I/O操作重叠。线程可以同时等待不同的I/O操作

2. 缺点

但是代码写的好,处理的好,都没有下面的问题

  • 性能损失
    • 当线程用于计算密集型,则线程数量不要大于CPU的数量。因为,计算密集型的线程往往没办法和其他线程共用CPU。如果太多线程,增加了额外的同步和调度开销(比如切线程上)
  • 健壮性降低
    • 不小心给一个线程共享了不属于它的东西,然后还被修改了,就会有问题
    • 线程如果有错(异常),会直接影响整个进程
  • 缺乏访问控制
    • 进程是访问控制的基本粒度,在⼀个线程中调⽤某些OS函数会对整个进程造成影响
  • 代码编写更难

3. 线程的异常

  • 单个线程崩溃,导致整个进程崩溃,其他线程也退出

4. 线程的用途

  • 提高CPU密集型程序的执行效率
  • 提高IO密集型程序的用户体验

三,线程与进程

1. 进程和线程

  • 进程是资源分配的基本单位
  • 线程是调度的基本单位
  • 线程共享进程数据,但也拥有⾃⼰的⼀部分数据:
  • 线程ID
  • ⼀组寄存器,存放线程上下文数据
  • 独立的栈结构
  • errno
  • 信号屏蔽字
  • 调度优先级

2. 进程的多个线程共享

同⼀地址空间,因此Text Segment、Data Segment都是共享的,如果定义⼀个函数,在各线程中都可以调用,如果定义⼀个全局变量,在各线程中都可以访问到。

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

  • 文件描述符表
  • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id

线程和进程的关系:
在这里插入图片描述


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关文章:

  • 代购系统数据中台搭建指南:3 步实现订单、物流、用户行为的全链路数字化
  • 大模型在老年性白内障预测及诊疗方案中的应用技术方案
  • python模块和包
  • 搭建frp内网穿透
  • 可视化图解算法47:包含min函数的栈
  • 重温经典算法——冒泡排序
  • 【HarmonyOS 5】鸿蒙中的UIAbility详解(二)
  • Python中的sorted()函数:智能排序器详解
  • 中国国运新引擎:下一代液晶技术突破如何重塑全球显示格局
  • iOS 获取Wifi信息
  • python打卡day39@浙大疏锦行
  • 苹果签名应用掉签频繁原因排查以及如何避免
  • 敏捷开发中如何避免迭代失控
  • Redis 主从复制中的全量拷贝机制详解
  • ubuntu20.04编译 pjproject-2.7.1
  • 2025音频传输模块全球选购指南:高品质音频体验的品牌之选
  • 可靠数据传输原理
  • Sqlalchemy 连mssql坑
  • 【前端】Vue3 中实现两个组件的动态切换保活
  • 快速上手shell条件测试
  • wordpress博客群发/沈阳关键词seo
  • 天津做网站的公司怎么样/深圳网络公司推广平台
  • 简易做网站/南京seo全网营销
  • tp框架做网站的优点/软文推广案例
  • 网站logo更换/网站收录提交工具
  • 广州艾迪网站建设/seo研究所