- 线程(Thread)-轻量级进程(Lightweight Process,LWP),程序执行流的最小单元。包括:
- 线程ID
- 当前指令指针
- 寄存器集合
- 堆栈
- 补充——堆栈
- 堆(heap),由程序员分配(申请并指明大小)释放(或程序结束时由虚拟机垃圾回收算法决定),使用二级缓存
- 栈(stack),由编译器自动分配释放,使用一级缓存。
- 线程的私有存储空间:
- 栈
- 线程局部存储(ThreadLocal Storage,TLS)
- 寄存器(执行流的基本数据)。
- 线程的状态:
- 运行(Running)。运行中线程的可执行时间-时间片(TimeSlice)。
- 就绪(Ready)。
- 等待(Waiting)。
- 线程调度
- 优先级调度(PrioritySchedule)。
- 用户指定线程优先级(ThreadPriority)
- IO密集型线程(IO Bound Thread)总是会比CPU密集型线程(CPU Bound Thread)更容易得到优先级的提升。
- 存在饿死(Starvation)现象,所以长时间得不到执行的线程也会被提升优先级。
- 轮转法(RoundRobin)。
- 单指令操作称为原子的(Atomic)。Windows中专门进行原子操作的API(Interlocked API).
- 同步(Synchronization)的方法锁(Lock)。访问前获取(Acquire),使用后释放(Release)。
- 二元信号量(BinarySemaphore):占用/非占用。
- (多元)信号量(Semaphore):信号量>1,唤醒等待中的线程。
- 互斥量(Mutex):同一线程获取、释放。
- 临界区(CriticalSection):比互斥量更为严格,作用范围仅限于本线程,其他线程无法获取该锁。
- 读写锁(Read-WriteLock)
- 共享的(Share)
- 独占的(Exclusive)
- 条件变量(ConditionVariable):多线程一起等待一个条件变量,当满足时,条件变量被唤醒,所有线程可以一起恢复执行。
- 可重入(Reentrant)是并发安全的强力保障。
- 过度优化:
- 编译器为了提高速度将一个变量缓存到寄存器内而不写回。
- 编译器为提高效率调整指令顺序。
- “volatile”关键字阻止过度优化,但不能解决CPU动态调度换序。“barrier”指令阻止CPU将该指令之前的指令交换到barrier之后。
- 线程模型:
- 一对一模型:用户线程与内核线程一致,但内核线程调度时开销较大。
- 多对一模型:高效的上下文切换及几乎无限制的线程数,但一个线程阻塞,所有线程都无法执行。
- 多对多模型。