导航

Windows Internals 6th chap5 Thread

Posted on 2013-12-13 16:15  littledot  阅读(298)  评论(0编辑  收藏  举报

Page 392 数据结构

ETHREAD & KTHREAD

TEB

CSR_THREAD & W32THREAD省略

Page 409 Windows上实现的是基于优先级的,抢占式的调度器,优先级最高的线程总能得到CPU。当一个线程得到运行机会的时候,它运行一个quantum的时间(在此时间内不会被同优先级的其他线程打断)。但该线程不见得能用完该quantum,有可能被其他更高优先级的线程抢占。

Page 410 Windows调度的单位是线程,调度时完全不考虑进程信息,所以一个进程多创建线程,就可能抢占更多的CPU。进程A有100个线程,B有2个,假设所有线程的优先级相同。则进程A能获得100/102的CPU时间。

Page 411 每个进程在创建时被赋予一个priority class。进程内的每个线程都有一个相对于该priority class的相对优先级。线程的基本优先级由进程的priority class和该线程的相对优先级决定。

每个线程还有当前优先级,调度的依据是当前优先级。

Page 412  普通进程优先级是normal (8),一些windows系统进程会有较高的优先级。可以用task manager/procexp去挑战进程的优先级。如果想调整到real-time必须要有increase scheduling priority privilege。

Page 413 线程的用户态代码只能运行于passive level,线程的内核态代码可以运行于dispatch level及以上,这时候该线程无法被调度(dispatcher此时被禁止)。一个在内核态运行于APC level的线程可以被一个更高优先级的线程抢占。

Page 416 线程状态转换图:

Page 421 Dispatcher database

为了伸缩性,每个处理器都有自己的ready queues和ready summary (存于per processor的KPRCB),这样不需要lock全局的dispatcher database就可以决定下一个需要执行的线程。通过ready summary可以实现O(1)调度。

Page 422 Quantum (ms) = several clock intervals. Clock interval通常由HAL决定。

Quantum (processor cycles) = several Quantum Units (processor cycles)

Quantum Units (processor cycles) = 1/3 clock interval

Page 423 Thread run-time accounting用的是Quantum (processor cycles)。每个线程的KTHEAD都记录一个Quantum target,单位是Quantum unit. Client系统上,Quantum通常是2个clock interval,所以Quantum target是6。CPU会在各种时间点charge processor cycles,如果达到或者超过quantum target,就会让出CPU,让另外同优先级的线程执行。Quantum没用完被抢占,下次执行是reset quantum target吗?或者Quantum没用完,自动放弃,会reset吗?再者,运行中陷入等待,等待满足后,会reset吗?

Page 430 windows利用priority boost机制去动态调整线程的当前优先级。priority boost的目的:1)降低latency 2)增加responsiveness 3)避免starvation 4)避免prioirity inversion

Page 449 调度场景 1)线程陷入等待 2)被抢占 3)quantum用完

Page 453 每个处理器有自己的idle thread,可以通过该处理器的PRCB找到, 所有的idle thread都属于idle进程。idle进程和idle线程很特殊,虽然也是通过EPROCESS/ETHREAD表示,但并不是对象管理器进程/线程。初始idle线程就是系统初始化线程,完成初始化后退化为idle线程,其他idle线程是在处理器online时直接出nonpage pool分的,跳过了object manager。

Page 456 Idle线程的优先级没有任何意义,不会用来和任何线程的优先级比较,idle线程在没有任何其他ready线程可执行的时候执行,idle线程运行于dispatch level。Idle线程在每个loop都会检查PRCB的NextThread,如果非空,则调度该线程。

Page 464 可以通过调整作业/进程/线程的亲和性使其制作特定的cpu上运行。 1)通过API调整线程的亲和性 2)通过API调整进程的亲和性 3)通过API调整作业的亲和性 4) Link时可以在image header里面设定亲和性。

Page 470 Windows传统的调度算法是基于线程(thread-based)的,调度器考虑的是在相同优先级的几个线程之间,该把CPU分给谁,不考虑其他因素。在多用户环境下,这种调度算法有可能造成某个用户的高优先级线程始终占有CPU,从而对其他用户造成饥饿。所以windows上引入了另外两种基于处理器份额(processor share-based)的调度算法:session based dynamic fair share scheduler (DFSS)和SID-based CPU rate limit。

Page 471 DFSS默认情况下给所有session相同的CPU分额。

http://en.wikipedia.org/wiki/Fair-share_scheduling

Page 472 每当创建会话时,都会创建一个Per-session CPU quota block,所有该会话的进程都指向该CPU quota block。

Page 480 作业对象允许多个进程被当作一个整体来管理和控制。可以对整体施加CPU,memory,UI的限制。