线程简介
线程是轻量级的进程(LWP:light weight process),在Linux环境下线程的本质仍是进程。同一个进程中可以存在多个线程,多个线程共享内存资源。
- 进程:拥有独立的地址空间,拥有PCB,相当于独居。
- 线程:有PCB,但没有独立的地址空间,多个线程共享进程空间,相当于合租。
在Linux操作系统下:
- 线程:最小的执行单位
- 进程:最小分配资源单位,可看成是只有一个线程的进程。
线程的特点
类Unix系统中,早期是没有“线程”概念的,80年代才引入,借助进程机制实现出了线程的概念。因此在这类系统中,进程和线程关系密切。
- 线程是轻量级进程(light-weight process),也有PCB,创建线程使用的底层函数和进程一样,都是clone
- 从内核里看进程和线程是一样的,都有各自不同的PCB。
- 进程可以蜕变成线程
- 在linux下,线程最是小的执行单位;进程是最小的分配资源单位
使用终端查看指定线程的LWP号:ps –Lf pid
使用终端查看线程列表:ps -elLf
实际上,无论是创建进程的fork
,还是创建线程的pthread_create
,底层实现都是调用同一个内核函数 clone
。
- 如果复制对方的地址空间,那么就产出一个“进程”;
- 如果共享对方的地址空间,就产生一个“线程”。
so:Linux内核是不区分进程和线程的,只在用户层面上进行区分。
所以,线程所有操作函数 pthread_*
是库函数,而非系统调用。
线程共享的资源
- 文件描述符表
- 每种信号的处理方式
- 当前工作目录
- 用户ID和组ID
- 内存地址空间 (.text/.data/.bss/heap/共享库)
线程非共享的资源
- 线程id
- 处理器现场和栈指针(内核栈)
- 独立的栈空间(用户空间栈)
- 信号屏蔽字
- 调度优先级
线程优、缺点
优点
- 提高程序并发性
- 开销小
- 数据通信、共享数据方便
缺点
- 库函数,不稳定
- gdb调试、编写困难
- 对信号支持不好
优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。