跳转至

进程控制块

General

PCB中存储的信息, 是为了正确并且高效的进行进程管理工作.

当进程被创建时候, 操作系统会为这个进程创建一个适合的PCB, 用来追踪这个进程的状态

在上下文切换时候, PCB中的信息是非常重要的

一般而言, PCB中包含的信息:

  1. 进程识别信息: 用于与其他进程区分开来
  2. 父进程
  3. 用户信息
  4. 用户组信息
  5. ...
  6. 进程状态信息: 在进程挂起的时候, 保存进程状态
  7. 通用寄存器内容
  8. CPU进程状态字
  9. 堆栈
  10. 帧指针
  11. ...
  12. 进程控制信息: OS通过这些信息来管理进程
  13. 进程调度状态
  14. 进程结构化信息: 进程的子进程标识符或与当前进程以某种功能方式相关的其他进程的标识符
  15. 进程间通信信息: 与独立进程之间的通信相关的标志, 信号和消息
  16. 进程特权信息: 进程是否有权限使用系统资源
  17. 进程状态
  18. 进程号(PID)
  19. 程序计数器(PC)
  20. CPU寄存器: 用于存储进程时候, 保存进程的寄存器信息
  21. CPU调度信息: 与CPU时间调度相关的信息
  22. 内存管理信息: 页表, 内存限制, 段表
  23. 资源使用信息: amout of CPU used for process execution, time limits, execution ID etc.
  24. I/O状态信息: 分配给进程的I/O设备列表

Linux

直接进入/proc/<pid>目录, 查看该目录下有什么文件(Linux中, 一切皆文件)

image-20230924221944874

// /include/linux/sched.h
struct task_struct{
    ...
}

Windows

windows的进程基础信息:

typedef struct _PROCESS_BASIC_INFORMATION {
    NTSTATUS ExitStatus;                        // 退出状态
    PPEB PebBaseAddress;                        // 指向PEB结构
    ULONG_PTR AffinityMask;                     // 关联掩码的变量的指针
    KPRIORITY BasePriority;                     // 进程优先级
    ULONG_PTR UniqueProcessId;                  // 进程的唯一标识符
    ULONG_PTR InheritedFromUniqueProcessId;       // 父进程的唯一标识符
} PROCESS_BASIC_INFORMATION;

typedef struct _PEB {
  BYTE                          Reserved1[2];           // 操作系统内部使用
  BYTE                          BeingDebugged;          // 只是当前是否正在调试指定进程
  BYTE                          Reserved2[1];           // 
  PVOID                         Reserved3[2];           //
  PPEB_LDR_DATA                 Ldr;                   // 指向PEB_LDR_DATA结构的指针
  PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;      // 指向RTL_USER_PROCESS_PARAMETERS结构的指针
  PVOID                         Reserved4[3];           //
  PVOID                         AtlThunkSListPtr;
  PVOID                         Reserved5;              //
  ULONG                         Reserved6;              //
  PVOID                         Reserved7;              //
  ULONG                         Reserved8;              //
  ULONG                         AtlThunkSListPtr32;
  PVOID                         Reserved9[45];          //
  BYTE                          Reserved10[96];          //
  PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
  BYTE                          Reserved11[128];        //
  PVOID                         Reserved12[1];          //
  ULONG                         SessionId;              // 与当前进程关联的终端服务会话标识符
} PEB, *PPEB;

typedef struct _PEB_LDR_DATA {
  BYTE       Reserved1[8];
  PVOID      Reserved2[3];
  LIST_ENTRY InMemoryOrderModuleList;               // 进程的已加载模块的双链接列表的头
} PEB_LDR_DATA, *PPEB_LDR_DATA;

typedef struct _RTL_USER_PROCESS_PARAMETERS {
  BYTE           Reserved1[16];
  PVOID          Reserved2[10];
  UNICODE_STRING ImagePathName;                     // 进程的图像文件路径
  UNICODE_STRING CommandLine;                       // 传递给进程的命令行字符串
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

OpenEuler

与linux一致

Reference

  1. Process control block - Wikipedia

  2. process - Where is PCB on Linux - Unix & Linux Stack Exchange

  3. NtQueryInformationProcess 函数 (winternl.h) - Win32 apps | Microsoft Learn