转载地址:https://blog.csdn.net/qq_38499859/article/details/80057427
一.目录

文章目录

    操作系统3 ————进程控制块(PCB)详解
            一.目录
            二. 进程控制块
                1.概述
                2.进程控制块中的信息
                3.进程控制块的作用
                4.进程控制块的组织方式
            三.Linux的进程控制块
                1.概述
                2.task_struct数据结构简述
            四.Unix的进程控制块
                1.概述
                2.进程表项(Proc表)
                3.U区
                4.系统区表
                5.进程区表
            五.windows的进程控制块
                1.概述
                2.EPROCESS的数据结构
            六.参考资料

二. 进程控制块

1.概述

学生档案是对每个学生的描述,其中含有学生的姓名学号年龄年级班级等信息,那么操作系统对进程的描述是什么,其中又包含哪些信息?

进程信息被放在一个叫做进程控制块的数据结构中。 进程控制块(PCB:Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态,其作用是使一个程序成为一个能够独立运行的基本单位,并且可以并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理。PCB通常是占用系统内存中一块连续的内存空间,存放着操作系统用于描述进程情况及控制进程运行的全部信息。

是操作系统中最重要的记录型数据结构,Linux 系统中用 task_struct 数据结构表示PCB,Windows:执行体进程块(EPROCESS)表示PCB。

在进程创建状态的时候创建pcb、在进程终止的时候销毁pcb

2.进程控制块中的信息

a.进程标识符(PID:Process Identifier)。

内部标识符SID:操作系统为每一个进程赋予的唯一数字标识符,系统使用
    外部标识符:由创建者提供,通常有字母与数字组成,往往是由用户(进程)在访问该进程时使用。描述进程的家族关系,设置父进程标识及子进程标识,还可设置用户标识,以指示拥有该进程的用户。

b.上下文数据

主要是由处理机的各种寄存器中的内容组成的,处理机被中断时,所有这些信息都必须保存在PCB中,以便在该进程重新执行时,能从断点继续执行。
    这些寄存器包括: 通用寄存器、指令计数器、程序状态字PSW、用户栈指针

c.进程调度信息

进程状态:创建、就绪、阻塞、执行、终止
    进程优先级:进程有6个优先级类
    进程调度所需要的其他信息,比如已等待CPU的时间综合,进程一直想的时间总和。
    事件,指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因

d.进程控制信息

程序和数据的地址
    进程同步和通信机制
    资源清单
    链接指针

I/O状态信息

包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

3.进程控制块的作用

PCB 可以被操作系统中的多个模块读或修改,如被调度程序、资源分配 程序、中断处理程序以及监督和分析程序等读或修改。 OS是根据 PCB来对 并发执行的进程进行控制和管理,所以说PCB是操作系统中最重要的记录型数据结构
其作主要作用如下:

    1、作为独立运行基本单位的标志
    2、能实现间断性运行方式
    3、提供进程管理所需要的信息
    4、提供进程调度所需要的信息
    5、实现与其他进程的同步与通信

4.进程控制块的组织方式

a.线性方式: 即将系统中所有的PCB都组长在一张线性表中,将该表的首地址存放在内存的一个专用区域中。适合于系统中进程数目不多的情况

**b.链接方式:**该方式是线性表方式的改进,系统按照进程的状态分别建立就绪索引表、阻塞索引表等。

**c.索引方式:**系统按照进程的状态将进程的PCB组成队列,从而形成就绪队列、阻塞队列、运行队列等。

三.windows的进程控制块

概述

在windows中执进程控制块是由 EPROCESS 块来表示的。 EPROCESS 块位于内核层之上,它侧重于提供各种管理策略,同时为上层应用程序提供基本的功能接口。所以,在执行体层的进程和线程数据结构中,有些成员直接对应于上层应用程序中所看到的功能实体。

EPROCESS结构属于内核的执行体层,包含了进程的资源相关信息诸如句柄表、虚拟内存、安全、调试、异常、创建信息、I/O转移统计以及进程计时等。

EPROCESS的数据结构

  1. typedef struct _EPROCESS
  2. {
  3. KPROCESS Pcb; //KPROCESS被内核用来进行线程调度使用
  4.  
  5. EX_PUSH_LOCK ProcessLock;//ProcessLock域是一个推锁(push lock)对象,用于保护EPROCESS中的数据成员。用来对可能产生的并行事件强制串行化。
  6.  
  7. LARGE_INTEGER CreateTime; //这两个域分别代表了进程的创建时间和退出时间
  8. LARGE_INTEGER ExitTime;
  9.  
  10. EX_RUNDOWN_REF RundownProtect; //RundownProtect域是进程的停止保护锁,当一个进程到最后被销毁时,它要等到所有其他进程和线程已经释放了此锁,才可以继续进行,否则就会产生孤儿线程
  11.  
  12. HANDLE UniqueProcessId; //UniqueProcessId域是进程的唯一编号,在进程创建时就设定好了,我们在"任务管理器"中看到的PID就是从这个域中获取的值
  13.  
  14. LIST_ENTRY ActiveProcessLinks; //ActiveProcessLinks域是一个双链表节点(注意是双链表中的一个节点),在windows系统中,所有的活动进程都连接在一起,构成了一个链表。
  15.  
  16. SIZE_T QuotaUsage[PsQuotaTypes];//QuotaUsage和QuotaPeak域是指一个进程的内存使用量和尖峰使用量
  17. SIZE_T QuotaPeak[PsQuotaTypes];
  18.  
  19. SIZE_T CommitCharge; //CommitCharge域中存储了一个进程的虚拟内存已提交的"页面数量"
  20. SIZE_T PeakVirtualSize;//PeakVirtualSize域是指虚拟内存大小的尖峰值。
  21. SIZE_T VirtualSize;//VirtualSize域是指一个进程的虚拟内存大小。
  22.  
  23. LIST_ENTRY SessionProcessLinks;//SessionProcessLinks域是一个双链表节点,当进程加入到一个系统会话中时,这个进程的SessionProcessLinks域将作为一个节点(LIST_ENTRY在内核中很常见)加入到该会话的进程链表中。
  24.  
  25. PVOID DebugPort; //DebugPort和ExceptionPort域是两个句柄(指针),分别指向当前进程对应的调试端口和异常端口。
  26. PVOID ExceptionPort;
  27.  
  28. PHANDLE_TABLE ObjectTable; //ObjectTable域是当前进程的句柄表。
  29.  
  30. EX_FAST_REF Token; //Token域是一个快速引用,指向该进程的访问令牌,用于该进程的安全访问检查。
  31.  
  32. PFN_NUMBER WorkingSetPage; //WorkingSetPage域是指包含进程工作集的页面
  33. KGUARDED_MUTEX AddressCreationLock;//AddressCreationLock域是一个守护互斥体锁(guard mutex),用于保护对地址空间的操作。
  34. KSPIN_LOCK HyperSpaceLock;//HyperSpaceLock是一个自旋锁,用于保护进程的超空间
  35.  
  36. struct _ETHREAD *ForkInProgress;//ForkInProgress指向正在复制地址空间的那个线程,仅当在地址空间复制过程中,此域才会被赋值,在其他情况下为NULL。
  37. ULONG_PTR HardwareTrigger;//HardwareTrigger用于记录硬件错误性能分析次数
  38.  
  39. PMM_AVL_TABLE PhysicalVadRoot;//PhysicalVadRoot域指向进程的物理VAD的根。它并不总是存在,只有当确实需要映射物理内存时才会被创建。
  40. PVOID CloneRoot;//CloneRoot指向一个平衡树的根,当进程地址空间复制时,此树被创建,创建出来后,一直到进程退出的时候才被销毁。CloneRoot域完全是为了支持fork语义而引入。
  41. PFN_NUMBER NumberOfPrivatePages;//指进程私有页面的数量
  42. PFN_NUMBER NumberOfLockedPages;//指进程被锁住的页面的数量
  43. PVOID Win32Process;//Win32Process域是一个指针,指向由windows子系统管理的进程区域,如果此值不为NULL,说明这是一个windows子系统进程(GUI进程)
  44. struct _EJOB *Job;//对于job域,只有当一个进程属于一个job(作业)的时候,它才会指向一个_EJOB对象。
  45. PVOID SectionObject;//SectionObject域也是一个指针,代表进程的内存去对象(进程的可执行映像文件的内存区对象)
  46.  
  47. PVOID SectionBaseAddress;// SectionBaseAddress域为该内存区对象的基地址
  48.  
  49. PEPROCESS_QUOTA_BLOCK QuotaBlock;//QuotaBlock域指向进程的配额块,进程的配额块类型为: EPROCESS_QUOTA_BLOCK
  50.  
  51. PPAGEFAULT_HISTORY WorkingSetWatch;//WorkingSetWatch域用于监视一个进程的页面错误,一旦启用了页面错误监视功能(由全局变量PsWatchEnabled开关来控制),则每次发生页面错误都会将该页面错误记录到WorkingSetWatch域的WatchInfo成员数组中,知道数组满为止。
  52. HANDLE Win32WindowStation;//Win32WindowStation域是一个进程所属的窗口站的句柄。由于句柄的值是由每个进程的句柄表来决定的,所以,两个进程即使同属于一个窗口站,它们的Win32WindowStation也可能不同,但指向的窗口站对象是相同的。窗口站是由windows子系统来管理和控制的。
  53. HANDLE InheritedFromUniqueProcessId;//InheritedFromUniqueProcessId域说明了一个进程是从哪里继承来的,即父进程的标识符。
  54.  
  55. PVOID LdtInformation;//LdtInformation用来维护一个进程的LDT(局部描述符表)信息。
  56. PVOID VadFreeHint;//VadFreeHint域指向一个提示VAD(虚拟地址描述符)节点,用于加速在VAD树中执行查找操作。
  57. PVOID VdmObjects;//VdmObjects域指向当前进程的VDM数据区,其类型为VMD_PROCESS_OBJECTS,进程可通过NtVdmControl系统服务来初始化VDM。
  58. PVOID DeviceMap;//DeviceMap域指向进程使用的设备表,通常情况下同一个会话中的进程共享同样的设备表。
  59.  
  60. PVOID Spare0[3];//Spare0域是一个备用域
  61. union //页表项
  62. {
  63. HARDWARE_PTE PageDirectoryPte;
  64. ULONGLONG Filler;
  65. };
  66. PVOID Session;//Session指向进程所在的系统会话,实际上它是一个指向MM_SESSION_SPACE的指针。\base\ntos\mm\mi.h 中相关的结构体定义
  67. UCHAR ImageFileName[ 16 ];//ImageFileName域包含了进程的映像文件名,仅包含最后一个路径分隔符之后的字符串,不超过16字节。
  68.  
  69. LIST_ENTRY JobLinks;//JobLinks域是一个双链表节点,通过此节点,一个job中的所有进程构成了一个链表。在windows中,所有的job构成了一个双链表,其链表头为全局变量PspJobList。每个job中的进程又构成了一个双链表。
  70. PVOID LockedPagesList;//LockedPagesList域是一个指向LOCK_HEADER结构的指针,该结构包含了一个链表头,windows通过此链表来记录哪些页面已被锁住(这里所谓的锁住和Mdll中的映射机制有关,本质上就是把用户空间下的内存地址锁定到内核空间中以便访问)
  71.  
  72. LIST_ENTRY ThreadListHead; //ThreadListHead域是一个双链表的"头结点",该链表中包含了一个进程中的所有"线程"。
  73.  
  74. PVOID SecurityPort; //SecurityPort域是一个安全端口,指向该进程域lsass.exe进程之间的跨进程通信端口。
  75. PVOID PaeTop; //PaeTop域用于支持PAE内存访问机制。
  76.  
  77. ULONG ActiveThreads;//ActiveThreads域记录了当前进程有多少活动线程。当该值减为0时,所有的线程将退出,于是进程也退出。
  78.  
  79. ACCESS_MASK GrantedAccess;//GrantedAccess域包含了进程的访问权限,访问权限是一个"位组合"。 public\sdk\inc\ntpsapi.h 中的宏 PROCESS_XXX
  80.  
  81. ULONG DefaultHardErrorProcessing;//DefaultHardErrorProcessing域指定了默认的硬件错误处理,默认为1
  82.  
  83. NTSTATUS LastThreadExitStatus; //LastThreadExitStatus域记录了刚才最后一个线程的退出状态。
  84.  
  85. PPEB Peb; //Peb域是一个进程的"进程环境块
  86.  
  87. EX_FAST_REF PrefetchTrace;//PrefetchTrace域是一个快速引用,指向与该进程关联的一个"预取痕迹结构",以支持该进程的预取。
  88. LARGE_INTEGER ReadOperationCount;//ReadOperationCount,WriteOperationCount记录了当前进程NtReadFile和NtWriteFile系统服务被调用的次数,OtherOperationCount记录了除读写操作以外的其他IO服务的次数(文件信息设置.)
  89. LARGE_INTEGER WriteOperationCount;
  90. LARGE_INTEGER OtherOperationCount;
  91. LARGE_INTEGER ReadTransferCount;//ReadTransferCount,WriteTransferCount记录了IO读写操作"完成"的次数,OtherTransferCount记录了除读写操作以外操作完成的次数。
  92. LARGE_INTEGER WriteTransferCount;
  93. LARGE_INTEGER OtherTransferCount;
  94.  
  95. SIZE_T CommitChargeLimit;
  96. SIZE_T CommitChargePeak;
  97.  
  98. PVOID AweInfo; //AweInfo域是一个指向AWEINFO结构的指针,其目的是支持AWE(Adress Windowing Extension 地址窗口扩展)
  99.  
  100. SE_AUDIT_PROCESS_CREATION_INFO SeAuditProcessCreationInfo;//SeAuditProcessCreationInfo域包含了创建进程时指定的进程映像全路径名
  101.  
  102. MMSUPPORT Vm;//Vm域是windows为每个进程管理虚拟内存的重要数据结构成员,其类型为MMSUPPORT, \base\ntos\inc\ps.h 中有相关定义
  103.  
  104. LIST_ENTRY MmProcessLinks; //MmProcessLinks域代表一个双链表节点,所有拥有自己地址空间的进程都将加入到一个双链表中,链表头是全局变量MmProcessList
  105.  
  106. ULONG ModifiedPageCount; //ModifiedPageCount域记录了该进程中已修改的页面的数量,即"脏页面数量",这和缓存的读写有关。
  107.  
  108. ULONG JobStatus; //49. ULONG JobStatus
  109.  
  110. JobStatus域记录了进程所属job的状态。
  111.  
  112. union //Flags域包含了进程的标志位,这些标志位反映了进程的当前状态和配置。 \base\ntos\inc\ps.h 中的宏定义 PS_PROCESS_FLAGS_XXX
  113. {
  114. ULONG Flags;
  115.  
  116. struct {
  117. ULONG CreateReported : 1;
  118. ULONG NoDebugInherit : 1;
  119. ULONG ProcessExiting : 1;
  120. ULONG ProcessDelete : 1;
  121. ULONG Wow64SplitPages : 1;
  122. ULONG VmDeleted : 1;
  123. ULONG OutswapEnabled : 1;
  124. ULONG Outswapped : 1;
  125. ULONG ForkFailed : 1;
  126. ULONG Wow64VaSpace4Gb : 1;
  127. ULONG AddressSpaceInitialized : 2;
  128. ULONG SetTimerResolution : 1;
  129. ULONG BreakOnTermination : 1;
  130. ULONG SessionCreationUnderway : 1;
  131. ULONG WriteWatch : 1;
  132. ULONG ProcessInSession : 1;
  133. ULONG OverrideAddressSpace : 1;
  134. ULONG HasAddressSpace : 1;
  135. ULONG LaunchPrefetched : 1;
  136. ULONG InjectInpageErrors : 1;
  137. ULONG VmTopDown : 1;
  138. ULONG ImageNotifyDone : 1;
  139. ULONG PdeUpdateNeeded : 1; // NT32 only
  140. ULONG VdmAllowed : 1;
  141. ULONG SmapAllowed : 1;
  142. ULONG CreateFailed : 1;
  143. ULONG DefaultIoPriority : 3;
  144. ULONG Spare1 : 1;
  145. ULONG Spare2 : 1;
  146. };
  147. };
  148.  
  149. NTSTATUS ExitStatus;//ExitStatus域包含了进程的退出状态,从进程的退出状态通常可以获知进程非正常退出的大致原因。反映退出状态的一些宏定义位于 public\sdk\inc\ntstatus.h
  150.  
  151. USHORT NextPageColor;//NextPageColor域用于物理页面分配算法。
  152. union
  153. {
  154. struct
  155. {
  156. UCHAR SubSystemMinorVersion;
  157. UCHAR SubSystemMajorVersion;
  158. };
  159. USHORT SubSystemVersion;
  160. };
  161. UCHAR PriorityClass;//PriorityClass域是一个单字节值,它说明了一个进程的优先级程度
  162.  
  163. MM_AVL_TABLE VadRoot;//VadRoot域指向一个平衡二叉树的根,用于管理该进程的虚拟地址空间。
  164.  
  165. ULONG Cookie;//Cookie域存放的是一个代表该进程的随机值,当第一次通过NtQueryInformationProcess函数获取此Cookie值的时候,系统会生成一个随机值,以后就用此值代表此进程
  166.  
  167. } EPROCESS, *PEPROCESS;

EPROCESS的数据解析

nt!_EPROCESS

Windows内核使用ERPROCESS结构体来表示一个进程,其包含了所有内核需要去保存关乎该进程的信息。对每一个运行在系统中的进程包括System Process和System Idle Process来说,都有一个对应的EPROCESS结构,System Process和System Idle Process运行在内核中。

EPROCESS结构属于内核的执行体层,包含了进程的资源相关信息诸如句柄表、虚拟内存、安全、调试、异常、创建信息、I/O转移统计以及进程计时等。

指向System Process的EPROCESS结构的指针保存在nt!PsInitialSystemProcess,而System Idle Process的EPROCESS指针保存在nt!PsIdleProcess

任何进程都可以同时隶属于多个集合或组。例如,一个进程总是在系统中active进程列表中,一个进程可以属于内部运行着一个会话的进程集合,一个进程也可以是某个job的一部分。为了实现这些集合或组,EPROCESS结构通过不同的字段持有数个列表项。

ActiveProcessLink字段用于将该EPROCESS结构链入系统中active进程链表,该链表的头保存在内核变量中nt!PsActiveProcessHead。类似的,SessionProcessLinks字段用于将该EPROCESS结构链入到一个会话链表,链表头在MM_SESSION_SPACE.ProcessListJobLinks字段用于将该EPROCESS结构链入到所属的job链表中,链表头在EJOB.ProcessListHead。内存管理器全局变量MmProcessList通过MmProcessLinks字段链入了一个进程链表。该链表可以通过MiReplicatePteChange()横贯以更新内核模式中关于进程虚拟地址空间的那部分。

属于进程的所有线程链表保存在ThreadListHead中,线程通过ETHREAD.ThreadListEntry排队。

内核变量ExpTimerResolutionListHead持有一个进程链表,使用NtSetTimerResolution()来改变定时器间隔。该链表被ExpUpdateTimerResolution()函数使用来更新时间分辨率到所有进程需求值中最小的那个。

!process命令从EPROCESS结构展示信息。.process命令切换调试器的虚拟地址空间上下文到特定的进程,当在一个完全的内核转储中或现场使用内核调试器时进行用户模式虚拟地址的实验时,这是一个非常危险的操作。

【windows 操作系统】进程控制块(PCB)的更多相关文章

  1. 进程控制块(PCB)

    用来描述和控制进程的运行的一个数据结构--进程控制块PCB(Process Control Block),是进程实体的一部分,是操作系统中最重要的记录型数据结构. PCB是进程存在的唯一标志 系统能且 ...

  2. Linux下的进程控制块(PCB)

    本文转载自Linux下的进程控制块(PCB) 导语 进程在操作系统中都有一个户口,用于表示这个进程.这个户口操作系统被称为PCB(进程控制块),在linux中具体实现是 task_struct数据结构 ...

  3. 进程控制块(PCB)结构

    一.进程控制块(PCB)结构 进程控制块(PCB)是系统为了管理进程设置的一个专门的数据结构.系统用它来记录进程的外部特征,描述进程的运动变化过程.同时,系统可以利用PCB来控制和管理进程,所以说,P ...

  4. 进程控制块PCB学习

    参考这篇文章:http://blog.csdn.net/shuizhilan/article/details/6642040 PCB(process control block),进程控制块,是我们学 ...

  5. 进程控制块PCB结构体 task_struct 描述

    进程控制块,英文名(Processing Control Block),简称 PCB . 进程控制块是系统为了管理进程设置的一个专门的数据结构,主要表示进程状态. 每一个进程都对应一个PCB来维护进程 ...

  6. Linux进程空间分布 & 进程控制块 PCB

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Verdana; color: #555555 } span.s1 { } Linux使用两级 ...

  7. 进程控制块PCB结构 task_struct 描述

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  8. 【windows 操作系统】进程

    前言 Windows的内部实现也近似于"一切皆文件"的思想,当然,这一切都只在内核里才有,下载一个WinObj这软件就可以看到,Windows上各种设备.分区.虚拟对象都是挂载到根 ...

  9. 进程控制块(PCB)

    进程控制块PCB 我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体. /usr/src/linux-headers- ...

随机推荐

  1. C#服务器端使用office组件

    http://www.myexception.cn/asp-dotnet/386522.html 不装office那就把Interop.Excel.dll Interop.Office.dll Int ...

  2. 计算机视觉3-> yolov5目标检测1 |从入门到出土

    本来就想着是对自己第一次跑yolov5的coco128的一个记录,没想到现在准备总结一下的时候,一方面是继续学习了一些,另一方面是学长的一些任务的要求,挖出了更多的东西,所以把名字改为了"从 ...

  3. Redis作缓存

    缓存策略三要素:缓存命中率   缓存更新策略  最大缓存容量.衡量一个缓存方案的好坏标准是:缓存命中率.缓存命中率越高,缓存方法设计的越好. 三者之间的关系为:当缓存到达最大的缓存容量时,会触发缓存更 ...

  4. golang中闭包讲解

    1. 非闭包时的结果 package main import "fmt" func main() { var funcSlice []func() for i := 0; i &l ...

  5. golang中数组指针和指针数组当做函数参数如何修改数组中的值

    先理解:数组指针它的类型时指针,指针数组它的类型时数组 1. 数组指针当做函数的参数 package main import "fmt" func changeData(dataA ...

  6. Typecho博客支持emoji表情设置

    介绍 大家在typecho博客写文章时,很多人都喜欢使用emoji表情(比如这些图标)但是typecho的数据库类型默认不支持emoji编码,因为Emoji是一种在Unicode位于u1F601-u1 ...

  7. linux下查看开放的端口

    Nmap是一款针对大型网络的端口扫描工具,它也适用于单机扫描,它支持很多扫描,也同时支持性能和可靠性统计. [root@localhost ~]# yum install namp [root@loc ...

  8. 2022年写的香橙派 OrangePi Zero 用python获取dht11温度和湿度

    感谢网上资料和个人的不放弃,终于方便的解决了香橙派 OrangePi Zero用python获取dht11温湿度的问题. 网上关于香橙派的资料比起树莓派真是少之又少,现在香橙派zero能干的活暂时也只 ...

  9. th 表达式的简单使用。

    一.使用场景,页面中,循环遍历,获得控制器穿过来的值. 1.1 控制器 /** * 获得所有的图书信息 * @return */ @RequestMapping("/turnIndexPag ...

  10. AT2689 [ARC080D] Prime Flip

    简要题解如下: 区间修改问题,使用差分转化为单点问题. 问题变成,一开始有 \(2n\) 个点为 \(1\),每次操作可以选择 \(r - l\) 为奇质数的两个点 \(l, r\) 使其 ^ \(1 ...