一.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密集型任务(如网络请求、文件读写,可利用等待时间切换); 短期、协作紧密的子任务(如数据分片处理后汇总); |