转自:https://blog.csdn.net/shuizhilan/article/details/6642040
https://zhuanlan.zhihu.com/p/32341542
1.组成
进程的PCB是系统感知进程的唯一实体。对进程进行操作,也可以理解为对PCB进行操作。 PCB是要常驻内存的。
所以在创建进程的时候,就是分配一个PCB,里面记录了进程的各种信息,这些信息都包括:
- 描述信息:进程的标识号(pid)、用户标识号(uid)、家族关系(gid)
- 控制信息:进程当前状态(就绪、运行、阻塞)、进程优先级、程序开始地址、计时信息、通信信息
- 资源管理信息:管理内存数据结构的指针、文件系统的指针等包括存储器的信息,IO设备、文件系统的信息。
- CPU现场保护结构:各个寄存器的内容
2.组织方式
2.1 链接
不同的就绪队列有不同的指针指向。
2.2 索引
每个状态对应一个索引表。
3.实例
Linux中的进程块:
struct task_struct{ ... unsigned short uid;#用户标识 int pid;#进程id int processor;#标识用户正在使用的CPU ... volatile long state;#标识进程的状态 long prority;#优先级 unsighed long rt_prority;#实时进程的优先级,对于普通进程无效 long counter;#进程动态优先级计数器,用于进程轮转调度算法 unsigned long flags; unsigned long policy;#进程调度策略 ... Struct task_struct *next_task, *prev_task;#进程PCB双向链表的前后项指针 Struct task_struct *next_run,*prev_run;#就绪队列双向链表的前后项指针 Struct task_struct *p_opptr,*p_pptr,*p_cptr,*pysptr,*p_ptr;
#进程家族间的关系,分别为指向祖父进程、父进程、子进程以及新老进程的指针。 ... };
其中上述进程调度策略policy:
SCHED_OTHER(值为0)对应普通进程优先级轮转法(round robin)
SCHED_FIFO(值为1)对应实时进程先来先服务算法;
SCHED_RR(值为2)对应实时进程优先级轮转法