基本概念
- 线程的定义: 有时被称为轻量级的进程(Lightweight Process,LWP),是程序执行流的最小单元
- 组成:
- 线程ID
- 当前指令指针(PC)
- 寄存器集合
- 堆栈
- 可多个并发执行, 共享进程的全局变量和堆的数据
- 优点:
- 分离计算和交互,有效利用某些等待操作的时间
- 处理并发任务,如多端下载
- 现在主流计算机本身硬件支持
- 高效的数据共享
线程的访问权限
- 可以访问进程内存里的所有数据
- 其它线程的堆栈(已知其它线程的堆栈地址)
- 私有存储空间,包括:
- 栈
- 线程局部存储(Thread Local Storage, TLS), 容量有限
- 寄存器(执行流的基本数据)
线程私有 | 线程共享 |
---|---|
局部变量 | 全局变量 |
函数的参数 | 堆上的数据 |
TLS数据 | 函数里的静态变量 |
程序代码,打开的文件 |
线程调度与优先级
- 线程的调度是由于处理器数量小于线程数量的情况下, 某个处理器需要执行多个线程以模拟并发状态从而需要调度不同线程的执行状态(三种):
- 运行(Running): 线程正在执行
- 就绪(Ready): 线程可以立即运行,但CPU被占用
- 等待(Waiting): 线程正在等待某个时间(通常时I/O),无法执行
- 时间片(Time Slice)的引入
- 主流的调度方式大多都包含:
- 轮转法(Round Robin):线程按照某一顺序轮流执行一小段时间
- 优先级调度(Priority Schedule):执行顺序的前后,有三种指定方式
- 用户指定
- 根据进入等待状态的频繁程度
- 长时间得不到执行而被提升优先级
- IO Bound Thread: IO密集型线程(更易获得优先级提升)
- CPU Bound Thread:CPU密集型线程
- 饿死(Starvation):低优先级的线程总是得不到CPU资源。
- 解决饿死:逐步提升等待时长的线程
可抢占线程和不可抢占线程
- 时间片用完交出CPU,Preemption。
- 线程主动放弃执行与否:
- 可抢占线程
- 不可抢占线程