赞
踩
目录
进程控制块(Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态。其作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位或与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。 PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息,它使一个在多道程序环境下不能独立运行的程序成为一个能独立运行的基本单位或一个能与其他进程并发执行的进程。
核心内部成员包括:
PCB在linux中具体实现是task_struct数据结构,核心内部成员包括:
进程状态:
内核表示 | 含义 |
TASK_RUNNING | 可运行 |
TASK_INTERRUPTIBLE | 可中断的等待状态 |
TASK_UNINTERRUPTIBLE | 不可中断的等待状态 |
TASK_ZOMBIE | 僵死 |
TASK_STOPPED | 暂停 |
TASK_SWAPPING | 换入/换出 |
进程调度信息
域名 | 含义 |
need_resched | 调度标志 |
Nice | 静态优先级 |
Counter | 动态优先级 |
Policy | 调度策略 |
rt_priority | 实时优先级 |
进程调度的策略
名称 | 解释 | 适用范围 |
SCHED_OTHER | 其他调度 | 普通进程 |
SCHED_FIFO | 先来先服务调度 | 实时进程 |
SCHED_RR | 时间片轮转调度 | 实时进程 |
标识符
域名 | 含义 |
Pid | 进程标识符 |
Uid、gid | 用户标识符、组标识符 |
Euid、egid | 有效用户标识符、有效组标识符 |
Suid、sgid | 备份用户标识符、备份组标识符 |
Fsuid、fsgid | 文件系统用户标识符、文件系统组标识符 |
进程通信有关信息
域名 | 含义 |
Spinlock_t sigmask_lock | 信号掩码的自旋锁 |
Long blocked | 信号掩码 |
Struct signal *sig | 信号处理函数 |
Struct sem_undo *semundo | 为避免死锁而在信号量上设置的取消操作 |
Struct sem_queue *semsleeping | 与信号量操作相关的等待队列 |
进程链接信息
名称 | 英文解释 | 中文解释 [指向哪个进程] |
p_opptr | Original parent | 祖先 |
p_pptr | Parent | 父进程 |
p_cptr | Child | 子进程 |
p_ysptr | Younger sibling | 弟进程 |
p_osptr | Older sibling | 兄进程 |
Pidhash_next、Pidhash_pprev | 进程在哈希表中的链接 | |
Next_task、 prev_task | 进程在双向循环链表中的链接 | |
Run_list | 运行队列的链表 |
时间和定时器信息
与时间有关的域
域名 | 含义 |
Start_time | 进程创建时间 |
Per_cpu_utime | 进程在某个CPU上运行时在用户态下耗费的时间 |
Per_cpu_stime | 进程在某个CPU上运行时在系统态下耗费的时间 |
Counter | 进程剩余的时间片 |
进程的所有定时器
文件系统信息
定义形式 | 解释 |
Sruct fs_struct *fs | 进程的可执行映象所在的文件系统 |
Struct files_struct *files | 进程打开的文件 |
虚拟内存信息
定义形式 | 解释 |
Struct mm_struct *mm | 描述进程的地址空间 |
Struct mm_struct *active_mm | 内核线程所借用的地址空间 |
页面管理信息
定义形式 | 解释 |
Int swappable | 进程占用的内存页面是否可换出 |
Unsigned long min_flat,maj_flt,nswap | 进程累计的次(minor)缺页次数、主(major)次数及累计换出、换入页面数 |
Unsigned long cmin_flat,cmaj_flt,cnswap | 本进程作为祖先进程,其所有层次子进程的累计的次(minor)缺页次数、主(major)次数及累计换出、换入页面数 |
对称多处理机(SMP)信息
定义形式 | 解释 |
Int has_cpu | 进程是否当前拥有CPU |
Int processor | 进程当前正在使用的CPU |
Int lock_depth | 上下文切换时内核锁的深度 |
和处理器相关的环境(上下文)信息
定义形式 | 解释 |
Struct thread_struct *tss | 任务切换状态 |
其它
在windows中执进程控制块是由 EPROCESS 块来表示的。每个进程都有一个 EPROCESS 结构,里面保存着进程的各种信息,和相关结构的指针。EPROCESS 结构位于系统地址空间,所以访问这个结构需要有ring0的权限。
在windows中所有进程使用 LIST_ENTRY ActiveProcessLinks 链表连接在一起,通过全局变量 PsActiveProcessHead 可以找到这个链。EPROCESS 中保存着一个给人看的进程名,Windows 任务管理器中显示的进程名,就是从这里获得的,更准确的叫法是映像名称。ImageFileName[16] 是一个16个字节长的字节数组,保存着进程名。当进程名的长度大于等于16个字节时,在 ImageFileName[16] 只保存进程名的前15个字节,ImageFileName[16] 最后一个字节为0,字符串的结束符。进程名可以相同,但是进程ID都是不相同的。
进程ID (PID) | +09c void *UniqueProcessId |
父进程ID | +1c8 void *InheritedFromUniqueProcessId |
页目录 | +018 uint32 DirectoryTableBase[2] |
每个进程有自己4G地址空间,当进程切换时,就需要切换地址空间。也就是切换页目录页表。所以每个进程都需要保存自己页目录的地址。每个进程的页目录所在物理页的物理地址,就保存在进程 EPROCESS 结构偏移 +018 处 DirectoryTableBase数组的第0项中,即 DirectoryTableBase[0]。对于执行地址转换的 CPU 来说需要知道页目录所在物理页的物理地址就可以进行地址转换。对于维护进程的页目录和页表的系统来说,需要把页目录和页表所在的物理页映射到地址空间中。
在UNIX操作系统中进程的状态信息和控制信息等由 proc 结构体和 user 结构体管理。由 proc 结构体构成的数组proc[]中的每个元素分别对应一个进程。proc 结构体管理着在进程状态、执行优先级等与进程相关的信息中需要经常被内核访问的那部分信息。举例来说,内核在(进程切换过程中)选择下一个将被执行的进程时,会首先检查所有进程的状态。这种需要遍历所有进程的情况在其他处理中也会经常出现。由于proc[]常驻内存,因此内核可以在很短时间内完成对所有进程状态的检查。假如proc[] 能够被移至交换空间,内核必须访问交换空间才能取得相应数据,这会导致花费过多时间并引起性能下降。proc[] 的长度决定了在系统中可以同时存在的进程上限。 proc[] 的长度由常量NPROC 定义,其值为50。
参考资料:
https://blog.csdn.net/kuangyufei/article/details/122222791
(4条消息) EPROCESS 结构_swanabin的博客-CSDN博客_eprocess结构
鸿蒙内核源码分析(进程管理篇) | 进程是内核的资源管理单元 | 百篇博客分析HarmonyOS源码 | v2.07_wx5f6629825db74的技术博客_51CTO博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。