【Linux】线程概念

📝前言:

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

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

🎬个人简介:努力学习ing

📋个人专栏:Linux

🎀CSDN主页 愚润求学

🌄其他专栏:C++学习笔记C语言入门基础python入门基础C++刷题专栏


这里写目录标题

  • 📝前言:
  • 一,线程的基本概念
    • [1. 基本概念](#1. 基本概念)
    • [2. 资源划分](#2. 资源划分)
    • [3. 线程资源划分与共享](#3. 线程资源划分与共享)
  • 二,线程的优缺点
    • [1. 优点](#1. 优点)
    • [2. 缺点](#2. 缺点)
    • [3. 线程的异常](#3. 线程的异常)
    • [4. 线程的用途](#4. 线程的用途)
  • 三,线程与进程
    • [1. 进程和线程](#1. 进程和线程)
    • [2. 进程的多个线程共享](#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

线程和进程的关系:


🌈我的分享也就到此结束啦🌈

要是我的分享也能对你的学习起到帮助,那简直是太酷啦!

若有不足,还请大家多多指正,我们一起学习交流!

📢公主,王子:点赞👍→收藏⭐→关注🔍

感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关推荐
七灵微32 分钟前
【后端】负载均衡
运维·负载均衡
令狐掌门44 分钟前
linux VFS简介
linux
wangqianqjl44 分钟前
vscode连接不上服务器问题修复
服务器·ide·vscode
SuperW1 小时前
从零学Linux(1)——软件包管理与shell编程
linux·运维·服务器
shylyly_1 小时前
Linux->进程概念(精讲)
linux·服务器·进程·孤儿进程·环境变量·进程地址空间·虚拟地址
ZCQ_dashuaibi2 小时前
DHCP服务管理
linux·服务器·网络
xcs194052 小时前
java 导入数据和数据验证处理方案
java·linux·python
塔能物联运维2 小时前
案例:Cat.1+LED双轮驱动,塔能科技重塑某县城智能照明生态
linux·运维·服务器
清晨曦月2 小时前
OJ搭建:Judge0服务器、DeepSeek服务接入简介
运维·服务器
愚润求学2 小时前
【递归,搜索与回溯算法】记忆化搜索(二)
linux·c++·算法·leetcode