1. 线程切换 --> 上下文切换
2. 抢占式调度,很多线程无法调度。因为他们都在等待某种事情发生 p166
3. 挂起和恢复 suspendThread 挂起 ResumeThread 恢复
对挂起进行计数,例如一个线程被挂起三次,则需要回复三次才能被调度。
在实际开发中,使用suspendThread要小心,若挂起一个正在堆中分配内存的线程,会导致其它线程不能访问堆。
确切知道目标线程在做什么,且采取措施避免挂起造成死锁等问题,才可挂起
一个线程可以挂起自身,但无法恢复自身
4. 进程挂起和恢复
系统从来不会给进程调度cpu时间,故不存在进程挂起和恢复概念。在这里特质,挂起一个进程中的所有线程 p168
快照 id 引用计数加1
5. 睡眠, 线程告诉系统, 在一段时间内不需要调度了。 sleep。 睡眠的市场并不准。Sleep(100)。可能睡眠100ms,也可能睡眠几分钟,根据系统运行当前情况而定。sleep(0)表示放弃时间片的剩余时间。
6. 在windows定义的所有数据结构中,context结构是唯一一个特定cpu的。
7. 线程优先级0-31 31最高。 可抢占式(高优先级线程会暂停低优先级线程,而使自己得到运行时间片)
8. 进程优先级 + 线程优先级 = 线程优先级值
动态优先级: 当线程接收消息等时, 系统可能临时提高其优先级,以及可能对饥饿线程动态提升。
9. 调度io请求优先级
如果一个优先级线程获得cpu时间,可以轻易将大量io请求入列。因为io请求都需要时间处理。低优先级线程会挂起高优先级线程(io),使它们无法完成任务。(磁盘扫描,杀毒等时候系统响应很慢就是这个原因)
故而,windows vista 开始,线程可以在进程io请求时设置优先级。系统不允许线程改变另一个线程的优先级。
p196 应尽量减少normal 和后台优先级线程之间使用共享同步对象,以避免normal优先级线程因为后台优先级线程拥有锁而被阻塞,导致线程逆转。
10. 关联性
线程运行在那些cpu上