1. 什么是线程?
从技术上讲,线程被定义为一个独立的指令集,可以由操作系统调度运行。
对于开发人员来说,独立于主程序运行的”过程“的概念可能是对线程的最好的描述。
在理解线程之前,首先需要理解UNIX进程。
一个进程是由操作系统创建,并且需要相当数量的”开销“。进程包含有关程序资源和程序执行状态的信息,包括:
- 进程ID
- 环境变量
- 工作目录
- 程序指令
- CPU状态
- 堆栈
- 文件描述符
- 信号动作
- 共享库
- 进程间通信相关信息
线程使用并存在于这些进程资源中,但为了能够由操作系统调度并作为独立实体运行,线程只拥有使它能够作为可执行代码存在的基本资源,例如:
- 堆栈指针
- 寄存器
- 调度属性
- 挂起和阻塞信号集
- 线程特定数据
2. 并行编程
线程非常适合并行编程,设计并行程序有很多的注意事项。例如:
- 并行编程模型
- 通信
- 数据依赖关系
- 同步和竞争条件
- 内存问题
I/O
问题
2.1 共享内存模型
所有线程都可以访问相同的全局共享内存,但线程也有自己的私有数据。需要同步和保护对全局数据的访问。
2.2 线程安全
简而言之,线程安全是指应用程序同时执行多个线程的能力,而不会“破坏”共享数据或创建竞争条件。
3. 空间布局
线程之间共享一份全局内存区域,包括初始化数据段、未初始化数据段(bss)、堆内存段。Linux中通过
pthread_create
创建线程,glibc要为每个线程独立分配线程栈,线程栈位于mmap区(位于栈和堆的中间,从高地址向低地址延伸)。