进程控制块
General
PCB中存储的信息, 是为了正确并且高效的进行进程管理工作.
当进程被创建时候, 操作系统会为这个进程创建一个适合的PCB, 用来追踪这个进程的状态
在上下文切换时候, PCB中的信息是非常重要的
一般而言, PCB中包含的信息:
- 进程识别信息: 用于与其他进程区分开来
- 父进程
- 用户信息
- 用户组信息
- ...
- 进程状态信息: 在进程挂起的时候, 保存进程状态
- 通用寄存器内容
- CPU进程状态字
- 堆栈
- 帧指针
- ...
- 进程控制信息: OS通过这些信息来管理进程
- 进程调度状态
- 进程结构化信息: 进程的子进程标识符或与当前进程以某种功能方式相关的其他进程的标识符
- 进程间通信信息: 与独立进程之间的通信相关的标志, 信号和消息
- 进程特权信息: 进程是否有权限使用系统资源
- 进程状态
- 进程号(PID)
- 程序计数器(PC)
- CPU寄存器: 用于存储进程时候, 保存进程的寄存器信息
- CPU调度信息: 与CPU时间调度相关的信息
- 内存管理信息: 页表, 内存限制, 段表
- 资源使用信息: amout of CPU used for process execution, time limits, execution ID etc.
- I/O状态信息: 分配给进程的I/O设备列表
Linux
直接进入/proc/<pid>
目录, 查看该目录下有什么文件(Linux中, 一切皆文件)
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一致