七、线程调度优先级和关联性

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上

你可能感兴趣的:(七、线程调度优先级和关联性)