转载地址: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的数据结构
typedef struct _EPROCESS { KPROCESS Pcb; //KPROCESS被内核用来进行线程调度使用 EX_PUSH_LOCK ProcessLock;//ProcessLock域是一个推锁(push lock)对象,用于保护EPROCESS中的数据成员。用来对可能产生的并行事件强制串行化。 LARGE_INTEGER CreateTime; //这两个域分别代表了进程的创建时间和退出时间 LARGE_INTEGER ExitTime; EX_RUNDOWN_REF RundownProtect; //RundownProtect域是进程的停止保护锁,当一个进程到最后被销毁时,它要等到所有其他进程和线程已经释放了此锁,才可以继续进行,否则就会产生孤儿线程 HANDLE UniqueProcessId; //UniqueProcessId域是进程的唯一编号,在进程创建时就设定好了,我们在"任务管理器"中看到的PID就是从这个域中获取的值 LIST_ENTRY ActiveProcessLinks; //ActiveProcessLinks域是一个双链表节点(注意是双链表中的一个节点),在windows系统中,所有的活动进程都连接在一起,构成了一个链表。 SIZE_T QuotaUsage[PsQuotaTypes];//QuotaUsage和QuotaPeak域是指一个进程的内存使用量和尖峰使用量 SIZE_T QuotaPeak[PsQuotaTypes]; SIZE_T CommitCharge; //CommitCharge域中存储了一个进程的虚拟内存已提交的"页面数量" SIZE_T PeakVirtualSize;//PeakVirtualSize域是指虚拟内存大小的尖峰值。 SIZE_T VirtualSize;//VirtualSize域是指一个进程的虚拟内存大小。 LIST_ENTRY SessionProcessLinks;//SessionProcessLinks域是一个双链表节点,当进程加入到一个系统会话中时,这个进程的SessionProcessLinks域将作为一个节点(LIST_ENTRY在内核中很常见)加入到该会话的进程链表中。 PVOID DebugPort; //DebugPort和ExceptionPort域是两个句柄(指针),分别指向当前进程对应的调试端口和异常端口。 PVOID ExceptionPort; PHANDLE_TABLE ObjectTable; //ObjectTable域是当前进程的句柄表。 EX_FAST_REF Token; //Token域是一个快速引用,指向该进程的访问令牌,用于该进程的安全访问检查。 PFN_NUMBER WorkingSetPage; //WorkingSetPage域是指包含进程工作集的页面 KGUARDED_MUTEX AddressCreationLock;//AddressCreationLock域是一个守护互斥体锁(guard mutex),用于保护对地址空间的操作。 KSPIN_LOCK HyperSpaceLock;//HyperSpaceLock是一个自旋锁,用于保护进程的超空间 struct _ETHREAD *ForkInProgress;//ForkInProgress指向正在复制地址空间的那个线程,仅当在地址空间复制过程中,此域才会被赋值,在其他情况下为NULL。 ULONG_PTR HardwareTrigger;//HardwareTrigger用于记录硬件错误性能分析次数 PMM_AVL_TABLE PhysicalVadRoot;//PhysicalVadRoot域指向进程的物理VAD的根。它并不总是存在,只有当确实需要映射物理内存时才会被创建。 PVOID CloneRoot;//CloneRoot指向一个平衡树的根,当进程地址空间复制时,此树被创建,创建出来后,一直到进程退出的时候才被销毁。CloneRoot域完全是为了支持fork语义而引入。 PFN_NUMBER NumberOfPrivatePages;//指进程私有页面的数量 PFN_NUMBER NumberOfLockedPages;//指进程被锁住的页面的数量 PVOID Win32Process;//Win32Process域是一个指针,指向由windows子系统管理的进程区域,如果此值不为NULL,说明这是一个windows子系统进程(GUI进程) struct _EJOB *Job;//对于job域,只有当一个进程属于一个job(作业)的时候,它才会指向一个_EJOB对象。 PVOID SectionObject;//SectionObject域也是一个指针,代表进程的内存去对象(进程的可执行映像文件的内存区对象) PVOID SectionBaseAddress;// SectionBaseAddress域为该内存区对象的基地址 PEPROCESS_QUOTA_BLOCK QuotaBlock;//QuotaBlock域指向进程的配额块,进程的配额块类型为: EPROCESS_QUOTA_BLOCK PPAGEFAULT_HISTORY WorkingSetWatch;//WorkingSetWatch域用于监视一个进程的页面错误,一旦启用了页面错误监视功能(由全局变量PsWatchEnabled开关来控制),则每次发生页面错误都会将该页面错误记录到WorkingSetWatch域的WatchInfo成员数组中,知道数组满为止。 HANDLE Win32WindowStation;//Win32WindowStation域是一个进程所属的窗口站的句柄。由于句柄的值是由每个进程的句柄表来决定的,所以,两个进程即使同属于一个窗口站,它们的Win32WindowStation也可能不同,但指向的窗口站对象是相同的。窗口站是由windows子系统来管理和控制的。 HANDLE InheritedFromUniqueProcessId;//InheritedFromUniqueProcessId域说明了一个进程是从哪里继承来的,即父进程的标识符。 PVOID LdtInformation;//LdtInformation用来维护一个进程的LDT(局部描述符表)信息。 PVOID VadFreeHint;//VadFreeHint域指向一个提示VAD(虚拟地址描述符)节点,用于加速在VAD树中执行查找操作。 PVOID VdmObjects;//VdmObjects域指向当前进程的VDM数据区,其类型为VMD_PROCESS_OBJECTS,进程可通过NtVdmControl系统服务来初始化VDM。 PVOID DeviceMap;//DeviceMap域指向进程使用的设备表,通常情况下同一个会话中的进程共享同样的设备表。 PVOID Spare0[3];//Spare0域是一个备用域 union //页表项 { HARDWARE_PTE PageDirectoryPte; ULONGLONG Filler; }; PVOID Session;//Session指向进程所在的系统会话,实际上它是一个指向MM_SESSION_SPACE的指针。\base\ntos\mm\mi.h 中相关的结构体定义 UCHAR ImageFileName[ 16 ];//ImageFileName域包含了进程的映像文件名,仅包含最后一个路径分隔符之后的字符串,不超过16字节。 LIST_ENTRY JobLinks;//JobLinks域是一个双链表节点,通过此节点,一个job中的所有进程构成了一个链表。在windows中,所有的job构成了一个双链表,其链表头为全局变量PspJobList。每个job中的进程又构成了一个双链表。 PVOID LockedPagesList;//LockedPagesList域是一个指向LOCK_HEADER结构的指针,该结构包含了一个链表头,windows通过此链表来记录哪些页面已被锁住(这里所谓的锁住和Mdll中的映射机制有关,本质上就是把用户空间下的内存地址锁定到内核空间中以便访问) LIST_ENTRY ThreadListHead; //ThreadListHead域是一个双链表的"头结点",该链表中包含了一个进程中的所有"线程"。 PVOID SecurityPort; //SecurityPort域是一个安全端口,指向该进程域lsass.exe进程之间的跨进程通信端口。 PVOID PaeTop; //PaeTop域用于支持PAE内存访问机制。 ULONG ActiveThreads;//ActiveThreads域记录了当前进程有多少活动线程。当该值减为0时,所有的线程将退出,于是进程也退出。 ACCESS_MASK GrantedAccess;//GrantedAccess域包含了进程的访问权限,访问权限是一个"位组合"。 public\sdk\inc\ntpsapi.h 中的宏 PROCESS_XXX ULONG DefaultHardErrorProcessing;//DefaultHardErrorProcessing域指定了默认的硬件错误处理,默认为1 NTSTATUS LastThreadExitStatus; //LastThreadExitStatus域记录了刚才最后一个线程的退出状态。 PPEB Peb; //Peb域是一个进程的"进程环境块 EX_FAST_REF PrefetchTrace;//PrefetchTrace域是一个快速引用,指向与该进程关联的一个"预取痕迹结构",以支持该进程的预取。 LARGE_INTEGER ReadOperationCount;//ReadOperationCount,WriteOperationCount记录了当前进程NtReadFile和NtWriteFile系统服务被调用的次数,OtherOperationCount记录了除读写操作以外的其他IO服务的次数(文件信息设置.) LARGE_INTEGER WriteOperationCount; LARGE_INTEGER OtherOperationCount; LARGE_INTEGER ReadTransferCount;//ReadTransferCount,WriteTransferCount记录了IO读写操作"完成"的次数,OtherTransferCount记录了除读写操作以外操作完成的次数。 LARGE_INTEGER WriteTransferCount; LARGE_INTEGER OtherTransferCount; SIZE_T CommitChargeLimit; SIZE_T CommitChargePeak; PVOID AweInfo; //AweInfo域是一个指向AWEINFO结构的指针,其目的是支持AWE(Adress Windowing Extension 地址窗口扩展) SE_AUDIT_PROCESS_CREATION_INFO SeAuditProcessCreationInfo;//SeAuditProcessCreationInfo域包含了创建进程时指定的进程映像全路径名 MMSUPPORT Vm;//Vm域是windows为每个进程管理虚拟内存的重要数据结构成员,其类型为MMSUPPORT, \base\ntos\inc\ps.h 中有相关定义 LIST_ENTRY MmProcessLinks; //MmProcessLinks域代表一个双链表节点,所有拥有自己地址空间的进程都将加入到一个双链表中,链表头是全局变量MmProcessList ULONG ModifiedPageCount; //ModifiedPageCount域记录了该进程中已修改的页面的数量,即"脏页面数量",这和缓存的读写有关。 ULONG JobStatus; //49. ULONG JobStatus JobStatus域记录了进程所属job的状态。 union //Flags域包含了进程的标志位,这些标志位反映了进程的当前状态和配置。 \base\ntos\inc\ps.h 中的宏定义 PS_PROCESS_FLAGS_XXX { ULONG Flags; struct { ULONG CreateReported : 1; ULONG NoDebugInherit : 1; ULONG ProcessExiting : 1; ULONG ProcessDelete : 1; ULONG Wow64SplitPages : 1; ULONG VmDeleted : 1; ULONG OutswapEnabled : 1; ULONG Outswapped : 1; ULONG ForkFailed : 1; ULONG Wow64VaSpace4Gb : 1; ULONG AddressSpaceInitialized : 2; ULONG SetTimerResolution : 1; ULONG BreakOnTermination : 1; ULONG SessionCreationUnderway : 1; ULONG WriteWatch : 1; ULONG ProcessInSession : 1; ULONG OverrideAddressSpace : 1; ULONG HasAddressSpace : 1; ULONG LaunchPrefetched : 1; ULONG InjectInpageErrors : 1; ULONG VmTopDown : 1; ULONG ImageNotifyDone : 1; ULONG PdeUpdateNeeded : 1; // NT32 only ULONG VdmAllowed : 1; ULONG SmapAllowed : 1; ULONG CreateFailed : 1; ULONG DefaultIoPriority : 3; ULONG Spare1 : 1; ULONG Spare2 : 1; }; }; NTSTATUS ExitStatus;//ExitStatus域包含了进程的退出状态,从进程的退出状态通常可以获知进程非正常退出的大致原因。反映退出状态的一些宏定义位于 public\sdk\inc\ntstatus.h USHORT NextPageColor;//NextPageColor域用于物理页面分配算法。 union { struct { UCHAR SubSystemMinorVersion; UCHAR SubSystemMajorVersion; }; USHORT SubSystemVersion; }; UCHAR PriorityClass;//PriorityClass域是一个单字节值,它说明了一个进程的优先级程度 MM_AVL_TABLE VadRoot;//VadRoot域指向一个平衡二叉树的根,用于管理该进程的虚拟地址空间。 ULONG Cookie;//Cookie域存放的是一个代表该进程的随机值,当第一次通过NtQueryInformationProcess函数获取此Cookie值的时候,系统会生成一个随机值,以后就用此值代表此进程 } 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.ProcessList
。JobLinks
字段用于将该EPROCESS结构链入到所属的job链表中,链表头在EJOB.ProcessListHead
。内存管理器全局变量MmProcessList
通过MmProcessLinks
字段链入了一个进程链表。该链表可以通过MiReplicatePteChange()
横贯以更新内核模式中关于进程虚拟地址空间的那部分。
属于进程的所有线程链表保存在ThreadListHead
中,线程通过ETHREAD.ThreadListEntry
排队。
内核变量ExpTimerResolutionListHead
持有一个进程链表,使用NtSetTimerResolution()
来改变定时器间隔。该链表被ExpUpdateTimerResolution()
函数使用来更新时间分辨率到所有进程需求值中最小的那个。
!process
命令从EPROCESS
结构展示信息。.process
命令切换调试器的虚拟地址空间上下文到特定的进程,当在一个完全的内核转储中或现场使用内核调试器时进行用户模式虚拟地址的实验时,这是一个非常危险的操作。
今天的文章进程控制块是pcb吗_每个进程只有一个pcb分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/50839.html