Scheduling

Scheduling Priorities
线程基本优先级由哪两个因素决定?
进程的优先级class(有6种)
进程优先级类下的线程优先级level(每个class下有7种)

Context Switches
1、上下文切换分为哪几个步骤?
调度器为每个优先级维护一个可执行线程队列。
保存刚刚完成的线程上下文
将刚刚完成执行的线程放到相应优先级队列尾部
找到包含就绪线程的最高优先级队列
删除队列首部的线程,加载它的上下文并执行
2、哪些原因会导致上下文切换?
线程用完时间片
更高优先级的线程已经准备好执行
运行中的线程发生等待

Priority Boosts
1、什么是线程动态优先级?
动态优先级是调度器确定调度哪个线程的优先级
2、动态优先级和基本优先级有什么关系?
初始时,线程的动态优先级和基础优先级相同。操作系统可以提高或降低动态优先级,目的是确保相应和防止线程饥渴。
提升线程优先级后,调度器会在每过一个时间片时将该优先级降低一级,直到降到基础优先级。线程的动态优先级不会低于其基础优先级
3、哪些线程可以获得动态优先级提升?
基本优先级在0到15的线程才会获得优先级提升,基本优先级在16到31之间的线程不会获得优先级提升
4、哪些情况下会导致线程的动态优先级被提升?
a.前台窗口相关的进程优先级会被提升,使其大于或等于任何后台进程的优先级。当进程不再处于前台时,优先级会回到原始
b.当窗口接收定时器消息、鼠标消息、键盘消息等输入时,调度器会提高拥有该窗口的线程的优先级
c.当阻塞的线程满足等待条件时,调度器会提高线程的优先级

Priority Invertion
1、什么情况下会发生优先级反转?如果一个高优先级的线程在等待低优先级线程手里的锁,调度器如何处理?
调度器会通过随机提高线程优先级处理这个问题。提高低优先级线程的动态优先级,分配时间片使其足以释放锁。如果本次分配的时间片不足以让低优先级线程释放锁,那么低优先级线程在下一轮调度中会再次获得释放锁的机会

Multiple Processors
1、多CPU架构分为哪两种?对线程的调度有什么影响?
多CPU架构分为非统一内存访问(NUMA)和对称式(SMT)
非对称式的CPU架构,每个CPU都会比其他的CPU更接近内存中的某些部分,使得内存的某些部分会比其他部分访问的更快。系统会在接近所使用内存的CPU上调度线程
对称式CPU架构SMT,多个CPU连接到单个共享主存。任何线程可以分配给任何的CPU,可以用CPU池让调度的线程并发运行,调度可以按照优先级决定。可以通过设置线程的CPU关联性和设置线程理想CPU来影响调度
2、如何设置线程的CPU关联性?
设置线程的CPU关联性主要是用来测试CPU,会降低并发性能。通过设置关联掩码SetProcessAffinityMask来改变线程的CPU关联性
3、如何设置线程理想CPU?
可以通过SetThreadIdealProcessorEx 设置线程首选(建议)CPU

原文地址:https://www.cnblogs.com/SwiftChocolate/p/14141256.html