进程和线程 (线程)
1.基本概念:
- 线程是一个轻量级的进程
- 线程本质就是一个进程
- 线程和进程不完全一致,轻量指空间,进程空间和线程空间管理方法不同
2.进程和线程区别:
1. 线程本质
是进程,线程是任务创建、调度、回收的过程
2. 进程空间:
文本段 + 数据段 + 系统数据段
3. 线程空间:
- 线程必须位于进程空间内部,没有进程,线程无法独立存在
- 一个进程中的所有线程共享文本段+数据段+堆区,独享栈区
- 线程独享的栈区默认为8M
- 一个进程中的多个线程切换调度任务时,资源开销比较小
4. 进程和线程区别:
- 线程是CPU任务调度的最小单元
- 进程是操作系统资源分配的最小单元
3.多进程和多线程的优缺点
1. 多线程和多进程对比:
多线程 vs 多进程对比(C语言)
特性 | 多线程(Thread) | 多进程(Process) |
---|---|---|
创建方式 | 使用 pthread_create (POSIX线程) | 使用 fork 或 exec 系列函数 |
资源开销 | 轻量级,共享同一进程的内存空间 | 重量级,独立内存空间,复制父进程资源(写时复制) |
通信机制 | 共享全局变量、互斥锁(pthread_mutex_t )、条件变量 | 管道(pipe )、共享内存、信号、套接字、消息队列 |
同步机制 | 互斥锁、信号量、读写锁 | 文件锁、信号量、信号 |
数据隔离性 | 线程共享数据,需同步避免竞争 | 进程数据默认隔离,共享需显式操作 |
崩溃影响 | 线程崩溃可能导致整个进程终止 | 单个进程崩溃不影响其他进程 |
上下文切换成本 | 低(共享地址空间) | 高(需切换内存映射表) |
适用场景 | CPU密集型任务(需并行计算)、高响应需求 | 需要高稳定性、隔离性的任务(如服务隔离) |
示例代码 | ```c | ```c |
#include <pthread.h> | #include <unistd.h> | |
void* task(void* arg) { /.../ } | int main() { | |
int main() { | if (fork() == 0) { /子进程/ } | |
pthread_t tid; | else { /父进程/ } | |
pthread_create(&tid, NULL, task, NULL); | } | |
} | ``` | |
``` |
关键差异说明
性能差异
多线程的创建和切换速度更快,适合频繁创建的任务。多进程由于独立的地址空间,更适合需要高安全性和稳定性的场景。
资源共享
线程默认共享堆、全局变量和文件描述符,进程需要显式共享(如通过 shmget
或 mmap
)。
调试难度
多线程因共享数据可能导致竞态条件(Race Condition),调试复杂度较高;多进程的隔离性使得问题更容易定位。
跨平台兼容性
多进程(如 fork
)在 Unix/Linux 系统支持良好,Windows 需使用 CreateProcess
;多线程的 pthread
需注意平台实现差异。
4.线程的调度:
- 调度保持一致
- 宏观并行,微观串行
5.线程的消亡:
线程结束需要回收线程空间,否则产生僵尸线程
6.线程的函数接口
1. 函数接口:
2. pthread_create
3. pthread_self
4. pthread_exit
5. pthread_join
注意:
tid对应的线程只要不退出,pthread_join阻塞等待结束回收线程空间 pthread_join具备同步功能