第59天 线程概念

一.Linux线程本质

1.线程的本质是"共享资源的轻量级进程(Lightweight Process,简称LWP)";

2.内核视角:每个线程对应一个"任务控制块(task_struct)",内核通过task_struct管理调度单元;

3.资源共享:

多个LWP(线程)通过共享同一"进程地址空间(mm_struct)、文件描述符(files_struct)、信号处理表(signal_struct)"等核心资源,实现"线程共享进程资源"的特性;

4.与传统进程的区别:

普通进程的task_struct对应独立的mm_struct(独立地址空间),

而线程的task_struct 共享同一mm_struct,本质上是"同一进程地址空间下的多个调度单元";

二.线程的状态

在Linux系统中,线程作为内核调度的基本单元(轻量级进程),会因资源占用、执行阶段不同,呈现多种状态

1.运行状态(R):也称之为可运行状态,就是处于运行状态的线程,正在CPU执行或等待CPU调度;

2.可中断睡眠状态(S):线程在等待某个事件(如等待I/O操作、等待特定信号等)完成,可被信号唤醒;

3.不可以中断睡眠状态(D):线程正在等待关键硬件操作完成,不能被信号中断,确保数据完整性;

4.停止状态(T):线程被暂停执行,通常是收到了特定的信号(如SIGSTOP(暂停线程))或者在调试程序时被 调试器暂停,可被信号恢复执行(如SIGCONT);

5.僵尸状态(Z):线程已终止,相关资源未被回收,等待所属进程(或其他负责线程资源回收的机制)进行回收;

6.死亡态(X):线程彻底终止,资源全部释放,是一个瞬间状态,几乎无法观测到;

三.Linux线程与POSIX标准的兼容

1.标准遵循:

Linux 原生 POSIX 线程库(libpthread)完全遵循 POSIX 线程标准,

提供与其他 UNIX-like 系统一致的线程接口,确保多平台代码可移植性;

2.核心接口与库依赖:

线程创建(pthread_create)、线程等待(pthread_join)等核心操作,均由 libpthread.so 库提供;

3.编码时需包含头文件:#include <pthread.h> (声明库中函数接口);

4.编译时需显式链接线程库:

gcc 源码.c -o 可执行文件 -lpthread(否则会报 "未定义引用" 错误);

5.内核交互方式:

Linux 下操作线程需通过 libpthread 库的 POSIX 接口,而非直接调用内核系统调用;用 户态代码通过库封装与内核交互;

四.进程与线程的核心区别

|---------|-------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|
| | 进程(Process) | 线程(Thread) |
| 资源独立性 | 拥有独立的内存空间、文件描述符等系统资源 | 共享所属进程的内存空间和资源, 仅拥有独立的栈、程序计数器等; |
| 创建/切换开销 | 开销大(涉及资源分配与回收) | 开销小(仅需保存少量上下文信息) |
| 通信方式 | 需通过进程间通信(IPC)机制 (如信号、消息队列等等) | 可直接通过共享内存通信(需同步机制避免冲突) |
| 健壮性 | 一个进程崩溃通常不影响其他进程 | 一个线程崩溃可能导致整个进程崩溃 |
| 适用场景 | 任务间需要严格隔离(如浏览器标签页); 充分利用多核CPU处理CPU密集型任务(如大规模计算); 长时间运行的独立任务(如后台备份、视频转码); 运行不稳定或第三方代码(避免崩溃影响整体); | 任务间需要频繁共享数据(如Web服务器处理多请求); 轻量级并发,追求低开销(如GUI程序后台加载数据); IO密集型任务(如网络请求、文件读写,可利用等待时间切换); 短期、协作紧密的子任务(如数据分片处理后汇总); |

相关推荐
蘑菇小白2 天前
Linux多线程开发
linux·开发语言·线程
沫璃染墨5 天前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3
MicrosoftCloud10 天前
操作系统 02|进程到底被谁推着走?
操作系统·线程·进程·pcb·408·进程状态·调度
沫璃染墨12 天前
《Qt从零入门系列(十四):QThread多线程详解——从线程创建到客户端阻塞处理》
开发语言·c++·笔记·qt·ui·交互·线程
Liuqy-0515 天前
线程的互斥与同步机制——互斥锁、条件变量、无名信号量
linux·开发语言·线程·进程·条件变量·同步·互斥
Pniubi17 天前
区分Java创建线程池、多线程
java·线程·线程池·多线程·并发
青柠之夏cc18 天前
Python Java PHP底层对比:内存并发性能全解析
开发语言·python·线程
流浪00120 天前
Linux系统篇47——线程(十二) POSIX 信号量与环形队列,把判空判满提前到访问之前
linux·操作系统·线程·信号量·环形队列
峥无20 天前
Linux NPTL线程:创建/终止/等待/分离/栈布局内核原理|线程下篇
linux·运维·线程