第2章进程与线程2.2本章内容进程管理概述Windows进程和线程概述进程与线程的优先权和线程调度进程管理概述2.4ProcessManagementProcessConcept:Process–aprograminexecution一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。ProcessState:运行状态(Running)就绪状态(Ready)等待状态(waiting,Blocked阻塞)创建状态(New)结束状态(terminated)WindowsNT/2000线程有7种状态,Windows2003server线程有9种状态;Linux进程有5种状态2.5DiagramofProcessState2.6ProcessControlBlock(PCB)进程控制块每个进程在OS中的登记表项(可能有总数目限制),OS据此对进程进行控制和管理(PCB中的内容会动态改变),不同OS则不同处于核心段,通常不能由应用程序自身的代码来直接访问,而要通过系统调用。进程控制块是由OS维护的用来记录进程相关信息的一块内存数据结构。2.7thread线程:作为CPU调度单位,而进程只作为资源分配单位。只拥有必不可少的资源,如:线程状态、寄存器上下文和栈同样具有就绪、阻塞和执行三种基本状态线程的优点:减小并发执行的时间和空间开销(线程的创建、退出和调度),因此容许在系统中建立更多的线程来提高并发程度。线程的创建时间比进程短;线程的终止时间比进程短;同进程内的线程切换时间比进程短;由于同进程内线程间共享内存和文件资源,可直接进行不通过内核的通信;2.8进程调度ProcessScheduling2.9CPUSchedulerCPU调度CPUschedulingdecisionsmaytakeplacewhenaprocess:发生CPU调度,当一个进程:1.Switchesfromrunningtowaitingstate.从运行转到等待2.Switchesfromrunningtoreadystate.从运行转到就绪3.Switchesfromwaitingtoready.从等待转到就绪4.Terminates.终止运行调度方式:非抢占式(Nonpreemptive)调度:调度程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。如上1、4抢占式(preemptive)调度:当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程。剥夺原则有:优先权原则、短进程优先原则、时间片原则。如上2、32.10SchedulingCriteriaOptimizationCriteria最优准则MaxCPUutilization最大的CPU利用率Maxthroughput最大的吞吐量Minturnaroundtime最短的周转时间Minwaitingtime最短的等待时间Minresponsetime最短的响应时间2.11SchedulingAlgorithms调度算法First-Come,First-Served(FCFS)Scheduling先来先服务调度Shortest-Job-First(SJR)Scheduling短作业优先调度PriorityScheduling优先权调度RoundRobin(RR)时间片轮转调度MultilevelQueueScheduling多级队列调度MultilevelFeedbackQueueScheduling多级反馈队列调度Windows进程和线程概述2.13Windows进程和线程Win32操作系统平台提供了强大的多任务功能,其中“进程”(Process)和“线程”(Thread)是其控制多任务的两个重要概念。早期的Windows3.x只能依靠应用程序之间的协同来实现协同式多任务,而Windows95/NT实行的是抢占式多任务在Win32(Windows95/NT)中,每一个进程可以同时执行多个线程,这意味着一个程序可以同时完成多个任务。当进程使用多个线程时,需要采取适当的措施来保持线程间的同步进程有独自的内存空间、程序代码、信息以及一堆大大小小的系统资源。2.14Windows进程Windows2000/XP进程是作为对象来管理的,进程对象的属性包括:进程标识(PID)资源访问令牌(AccessToken)进程的基本优先级(BasePriority)默认亲合处理机集合(ProcessorAffinity)等2.15Windows进程Windows核心的进程之间没有任何关系(包括父子关系),各运行环境子系统分别建立、维护和表达各自的进程关系WindowsNT和Windows2000/XP把Win32环境子系统设计成整个系统的主子系统,一些基本的进程管理功能被放置在Win32子系统中在Windows2000/XP中,与一个运行环境子系统中的应用进程相关的进程控制块信息会分布在本运行环境子系统、Win32子系统和系统内核中2.16Windows中的Win32进程结构2.17Windows中的Win32进程结构2.18Windows的进程Windows2000/XP中的每个Win32进程都由一个执行体进程块(executiveprocessblock)表示,执行体进程块描述进程的基本信息,并指向其他与进程控制相关的数据结构执行体进程块中的主要内容包括:线程块列表:描述属于该进程的所有线程的相关信息,以便线程调度器进行处理机资源的分配和回收虚拟地址空间描述表:描述进程地址空间各部分属性,用于虚拟存储管理对象句柄列表:当进程创建或打开一个对象时,就会得到一个代表该对象的句柄,用于对象访问2.19Windows的进程执行体进程块EPROCESS,即执行体进程对象进程对象的属性:PID,PCB,AccessToken,BasePriority,句柄表,指向进程环境块PEB的指针,默认亲和处理器集合等在Windows中,PCB也称为内核进程块KPROCESS,KPROCESS即内核进程对象EPOCESS和KPROCESS位于内核空间,PEB位于用户空间2.20executiveprocessblock2.21kernelprocess(KPROCESS)block2.22processenvironmentblock(PEB)2.23Win32子系统的进程控制系统调用Win32子系统的进程控制系统调用主要有:CreateProcess、ExitProcess、TerminateProcessCreateProcess用于进程创建ExitProcess和TerminateProcess用于进程退出2.24创建进程CreateProcess()函数用于创建新进程及其主线程,以执行指定的程序新进程可以继承:打开文件的句柄、各种对象(如进程、线程、信号量、管道等)的句柄、环境变量、当前目录、原进程的控制终端、原进程的进程组(用于发送Ctrl+C或Ctrl+Break信号给多个进程)--每个句柄在创建或打开时能指定是否可继承新进程不能继承:优先权类、内存句柄、DLL模块句柄2.25创建子进程API函数创建进程函数,CreateProcess函数,其原型为:BOOLCreateProcess(LPCTSTRlpApplicationName,LPTSTRlpCommandLine,LPSECURITY_ATTRIBUTESlpProcessAttributes,LPSECURITY_ATTRIBUTESlpThreadAttributes,BOOLbInheritHandles,DWORDdwCreationFlags,LPVOIDlpEnvironment,LPCTSTRlpCurrentDirectory,LPSTARTURINFOlpStartupInfo,LPPROCESS_INFORMATIONlpProcessInformation);实例:createprocess.cpp2.26进程创建的主要阶段2.27其它函数GetCurentProcess(),返回目前正在执行的process(也就是调用者)的句柄(handle),GetCurrentProcessId(),返回调用者的id。Handle和id有什么不同呢?id只是一个数字,Win32保证不会有第二个在系统中执行的process拥有相同的id,因此,这个数字通常用来鉴别process的身份;processhandle可就重要了,因为其他与process有关的函数都需要它来当参数。HANDLEGetCurrentProcess(VOID);DWORDGetCurrentProcessId(VOID);DWORDGetPriorityClass(HANDLEhProcess);BOOLSetPriorityClass(HANDLEhProcess,DWORDdwPriorityClass);2.28结束process如果某个process想停止执行,可调用ExitProcess(),不过我们通常不直接调用它,而是调用C程序库中的exit(),exit()在自动执行一些清除垃圾的工作之后,再调用ExitProcess()。VOIDExitProcess(UNTuExitCode);如果processA想要迫使processB停止执行,可以在取得processB的handle之后,调用TerminateProcess():BOOLTerminateProcess(HANDLEhProcess,UNITuExitCode);2.29与进程相关的API函数FunctionDescriptionCreateProcessCreatesanewprocessandthreadusingthecaller'ssecurityidentificationCreateProcessAsUserCreatesanewprocessandthreadwiththespecifiedalternatesecuritytokenCreateProcessWithLogonWCreatesanewprocessandthreadtorununderthecredentialsofthespecifiedusernameandpasswordCreateProcessWithTokenWCreatesanewprocessandthreadwiththespecifiedalternatesecuritytoken,withadditionaloptionssuchasallowingtheuserprofiletobeloadedOpenProcessReturnsahandletothespecifiedprocessobjectExitProcessEndsaprocess,andnotifiesallattachedDLLsTerminateProcessEndsaprocesswithoutnotifyingtheDLLsFlushInstructionCacheEmptiesthespecifiedprocess'sinstructioncacheGetProcessTimesObtainsaprocess'stiminginformation,describinghowmuchtimetheprocesshasspentinuserandkernelmode2.30GetExitCodeProcessReturnstheexitcodeforaprocess,indicatinghowandwhytheprocessshutdownGetCommandLineReturnsapointertot