WindowsServer2003进程管理概述进程是系统分配资源的基本单位进程对象–WS03把进程视为对象(Object),以句柄(handle)来引用–进程对象属性;PID,AccessToken,BasePriority,默认处理器集合等一个WS03进程必须包含一个线程,该线程可能创建别的线程。一个进程内的多个线程可以在不同的处理器上并行运行WS03进程结构AccessTokenProcessThreadAFileBSectionCHandle1Handle1Handle1……ObjectTableVirtualAddressSpaceDescription执行体进程块(ENPROCESS)描述进程的基本信息包括:–线程块列表–虚拟地址空间描述表–对象句柄列表相关系统调用–createProcess–ExitProcess–TerminateProcessWS03的线程是内核线程线程是处理机的调度对象线程上下文包括寄存器、线程环境块、核心栈和用户栈WS03的线程有九种状态WS03的线程管理32个优先级:0-31每个优先级的就绪线程在每个处理机上排成一个先进先出队列;当一个线程状态变成就绪时,它可能立即运行或排到相应优先级队列的尾部;总运行优先级最高的就绪线程;采用严格的抢先式动态优先级调度,依据优先级和分配时间片来调度。WS03的线程管理完全的事件驱动机制:–时间片用完事件;–等待结束事件;–主动挂起事件;在同一优先级的各线程按时间片轮转算法进行调度;在多处理机系统中多个线程并行运行;WS03的线程状态初始化就绪终止运行备用待调度就绪等待转换KiUnwaitThreadKiReadyThreadKiQuantumEndKiIdleScheduleKiSwapThreadKiExitDispatcherNtYieldExecution处理机空闲或可抢先KiInsertDeferredReadyList被抢先KiRetireDpcList/KiSwapThread/KiProcessDeferredReadyListKiExitDispatcherKiDeferredReadyThread处理机不能抢先KiSelectNextThread当前处理机为亲合处理机被抢先当前处理机不是亲合处理机被抢先KiSetAffinityThreadKiSetpriorityThread就绪挂起KiReadyThreadKeInitThreadPspCreateThreadKiReadyThreadKiInsertDeferredReadyListKeTerminateThread待调度就绪状态(DeferredReady):线程已获得除处理机外的所需资源,正等待选择一个空闲处理机或抢先一个处理机正在执行的线程,进行调度执行。就绪状态(Ready):线程已获得除处理机外的所需资源,并已确定了执行该线程的处理机,正等待成为该处理机上的最高优先级线程,以调度执行。备用状态(Standby):线程已变成当前处理机上的最高优先级线程,正进行描述表切换,以进入运行状态。系统中每个处理器上只能有一个处于备用状态的线程。运行状态(Running):已完成描述表切换,线程进入运行状态。线程会一直处于运行状态,直到被抢先、时间片用完、线程终止或进入等待状态。等待状态(Waiting):线程正等待某对象,以同步线程的执行。当等待事件出现时,等待结束,并根据优先级进入运行或就绪状态。就绪挂起状态(Readyprocessswapped):线程已结束等待状态,但线程所在进程的所有线程的内核堆栈都在外存(内存管理模块可能把线程占用的内存置换到外存)。转换状态(Transitionkernelstackswapped):线程已结束等待状态,但线程的内核堆栈位于外存。这时线程进入转换状态,当线程的内核堆栈被调回内存时,线程进入待调度就绪状态。终止状态(Terminated):线程执行完就进入终止状态;初始化状态(Initialized):线程创建过程中的线程状态;需要注意的转换从等待状态到待调度就绪状态–如果该线程的内核堆栈在内存,则变成待调度就绪状态–如果该线程的内核堆栈在外存,但不是其所在进程的所有线程的内核堆栈都在外存,则变成转换状态–其所在进程的所有线程的内核堆栈都在外存,则变成就绪挂起状态从待调度就绪状态到运行状态–有空闲处理机–没有,判断是否可抢占某处理器上处于运行或备用状态的线程,如可抢先–不可抢先被抢占的运行或备用状态的线程会回到–就绪态(下次还会在该处理机运行)–待调度就绪状态(下次不会在该处理机运行)备用状态就绪状态WS03支持多处理机每个处理机都有自己的一套线程调度数据结构:–一个待调度就绪线程队列–一个32级的就绪线程队列–一个备用线程变量–一个运行线程变量CreateThread()函数在调用进程的地址空间上创建一个线程,以执行指定的函数;返回值为所创建线程的句柄ExitThread()函数用于结束本线程SuspendThread()函数用于挂起指定的线程ResumeThread()函数递减指定线程的挂起计数,挂起计数为0时,线程恢复执行WS03线程的APIWS03线程的挂起和激活WS03中处理机的分配对象为线程,一个线程可被多次挂起和多次激活。在线程内有一个挂起计数(suspendcount),挂起操作使该计数加1,激活操作使该计数减1;当挂起计数为0时,线程恢复执行(1)挂起:WindowsNT中的SuspendThread可挂起指定的线程;DWORDSuspendThread(HANDLEhThread//handletothethread);(2)激活:WindowsNT中的ResumeThread可恢复指定线程的执行;DWORDResumeThread(HANDLEhThread//identifiesthreadtorestart);实时(real-time):从16到31,如设备监控线程,不可变。可变优先级(variable-priority):从1到15(级别0保留为系统使用)。–线程的基本优先级=[进程的基本优先级-2,进程的基本优先级+2],由应用程序控制–线程的动态优先级=[进程的基本优先级-2,16],由WS03核心控制一个系统线程优先级(0),用于对系统中空闲的物理页面进行清零的零页线程。从0到31,数值越大,优先级越高。分为两类:WS03线程的优先级WS03的线程优先级(BasePriority)由进程优先级类(PriorityClass)和线程优先级偏移(PriorityLevel)构成,分别由相关函数控制。PriorityPriorityClassProcessPriorityLevelThreadKernelController进程优先级类函数:–GetPriorityClass(读取)–SetPriorityClass(设置)线程优先级偏移:–GetThreadPriority(读取)–SetThreadPriority(设置)与线程优先级控制有关的API时间配额是一个线程从进入运行状态到WS03检查是否有其他优先级相同的线程需要开始运行之间的时间总和。时间配额不是一个时间长度值,而一个称为配额单位(quantumunit)的整数。每个线程都有一个代表本次运行最大时间长度的时间配额。一个线程用完了自己的时间配额时,如果没有其它相同优先级线程,WS03将重新给该线程分配一个新的时间配额,并继续运行。线程时间配额(Quantum)假设用户首先启动了一个运行时间很长的电子表格计算程序,然后切换到一个计算密集型的应用(如一个需要复杂图形显示的游戏)。如果前台的游戏进程提高它的优先级,后台的电子表格将会几乎得不到CPU时间。但增加游戏进程的时间配额,则不会停止电子表格计算的执行,只是给游戏进程的CPU时间多一些。提高前台线程优先级的潜在问题ProcessProcessThreadThreadThreadThread310ReadySummary310IdleSummary310DefaultbasepriorityDefaultprocessoraffinityDefaultquantumBasePriorityCurrentpriorityProcessoraffinityQuantumDispatcherDispatcherdatabasedatabase线程调度数据结构就绪位图(KiReadySummary)–为了提高调度速度,WS03的每个处理机都维护了一个称为就绪位图(KiReadySummary)的32位量。就绪位图中的每一位指示一个调度优先级的就绪队列中是否有线程等待运行。B0与调度优先级0相对应,B1与调度优先级1相对应,等等。空闲位图(KiIdleSummary)–WS03还维护一个称为空闲位图(KiIdleSummary)的32位全局变量。空闲位图中的每一位指示一个处理机是否处于空闲状态。在64位版本中,这个位图是64位的。WS03线程调度严格基于优先级调度单处理机调度多处理机调度WS03线程调度-主动放弃许多Win32等待函数调用(如WaitForSingleObject或WaitForMultipleObjects等)都使线程等待某个对象,等待的对象可能有事件、互斥信号量、资源信号量、I/O操作、进程、线程、窗口消息等。通常进入等待状态线程的时间配额不会被重置,而是在等待事件出现时,线程的时间配额被减1,相当于1/3个时钟间隔;如果线程的优先级大于等于14,在等待事件出现时,线程的时间配额被重置。当一个高优先级线程进入就绪状态时,正在处于运行状态的低优先级线程被抢先。WS03线程调度-抢先可能在以下两种情况下出现抢先:–高优先级线程的等待完成,即一个线程等待的事件出现。–一个线程的优先级被增加或减少。用户态下运行的线程可以抢先内核态下运行的线程。当线程被抢先时,它被放回相应优先级的就绪队列的队首;而等待结束后,线程被放在相应就绪队列的队尾。被抢先的实时线程时间配额被重置为一个完整的时间片;而可变优先级线程时间配额不变,重新获得处理机后将剩余的时间配额执行完。时间片用完如果刚用完时间配额的线程优先级降低了,WS03将寻找一个优先级高于刚用完时间配额线程的就绪线程。如果刚用完时间配额的线程的优先级没有降低,并且有其他优先级相同的就绪线程,WS03将选择相同优先级的就绪队列中的下一个线程进入运行状态,刚用完时间配额的线程被排到就绪队列的队尾(即分配一个新的时间配额并把线程状态从运行状态改为就绪状态)。如果没有优先级相同的就绪线程可运行,刚用完时间配额的线程将得到一个新的时间配额并继续运行。当线程完成运行时,它的状态从运行状态转到终止状态。线程完成运行的原因可能是通过调用ExitThread而从主函数中返回或通过被其他线程通过调用TerminateThread来终止。如果处于终止状态的线程对象上没有未关闭的句柄,则该线程将被从进程的线程列表中删除,相关数据结构将被释放。结束(Termination)优先级调整在下列5种情况下,WS03会提升线程的当前优先级:–I/O操作完成–信号量或事件等待结束–前台进程中的线程完成一个等待操作–由于窗口活动而唤醒图形用户接口线程–线程处于就绪状态超过一定时间,但没能进入运行状态(处理机饥饿)线程优先级提升的目的是改进系统吞吐量、响应时间等整体特征,解决线程调度策略中潜在的不公正性。但它也不是完美的,它并不会使所有应用都受益。WS03不会提升实时优先级范围内(16至31)的线程优先级。线程优先级提升是以线程的基本优先级为基点的当用完它的一个时间配额后,线程会降低一个优先级,并运行另一个时间配额,直到降为原来的基本优先级为止优先级提升策略仅适用于可变优先级范围(0到15)内的线程设备优先级提升值磁盘、光驱、并口、视频1网络、