PCB进程
PCB(Process Control Block)进程控制块是进程在操作系统中的数据结构,用于存储进程状态、程序计数器、寄存器值等信息。每个进程都有一个与之对应的PCB,操作系统利用PCB来管理和调度进程。PCB由操作系统形成,代码数据由用户来提供。
管理进程的本质就是管理PCB结构体
在PCB中存储的信息包括(进程属性的集合):
-
进程ID:唯一标识一个进程的ID,用于区分不同的进程。
-
进程状态:表示进程当前所处的状态,如运行、等待、阻塞等。
-
程序计数器:存储CPU下一条将要执行的指令的地址,用于实现进程的切换和恢复执行。
-
寄存器值(Registers):存储进程在切换时所用的寄存器值,用于在恢复执行时还原进程的状态。
-
进程优先级:表示进程在调度时的优先级,用于确定进程在CPU上的执行顺序。
-
进程映像(Process Image):包含了进程的代码、数据和栈等信息。
-
PCB本身的信息:包括PC在内存中的地址、PCB的大小等。
-
下一个PCB的指针:操作系统管理进程就是对单链表的增删查改。注意可能是多个指针,PCB在系统中以多叉树的形式链接,内部会形成各种链表,队列,栈等等链式数据结构。
所以要创建进程时要做两件事(简化):创建PCB,把进程的代码和数据加载到内存中
PCB的访问
PCB是一个大型的结构体,
PCB的访问实现原理可以分为以下几个步骤:
-
获取PCB指针:当一个进程需要访问自己的PCB时,可以使用操作系统提供的系统调用来获取当前进程的PCB指针。例如,在Linux中,可以使用
getpid()
系统调用获取当前进程的进程ID(PID),然后使用/proc
文件系统中的特定文件来访问该进程的PCB信息。 -
访问PCB:当获取到PCB指针后,进程可以访问PCB中的信息。例如,可以使用指针操作来读取或修改PCB中的CPU寄存器值、内存映射信息等。
-
同步和互斥:在多进程环境下,需要使用同步和互斥机制来保证进程之间的协作关系。例如,可以使用互斥锁来防止多个进程同时访问共享资源,使用信号量来控制进程的执行顺序等。
-
访问权限控制:直接访问进程的PCB通常是操作系统内核的特权操作,只有内核或具有特权的进程(如超级用户)才能够进行。这是为了确保系统安全和进程隔离性。普通进程只能通过操作系统提供的接口或系统调用来访问和操作自己的PCB信息,而不能直接访问其他进程的PCB。
偏移量
在一些操作系统中,为了访问PCB中的不同字段,可能需要获得PCB指针到头部的偏移量。这是因为PCB结构中的各个字段并不一定是连续存储的,可能存在填充字节或对齐需求等。
通过获得PCB指针到头部的偏移量,可以根据字段的偏移量直接计算字段的地址。这样,就可以访问PCB中的各个字段,而无需知道具体的内存地址。
对于某些操作系统,提供了一些宏和函数来简化获取PCB指针到头部的偏移量的操作。例如,在Linux的内核开发中,可以使用offsetof()
宏来获取某个字段的偏移量。同时,也可以使用container_of()
宏根据字段的指针和偏移量计算PCB的地址。
offsetof()
宏的实现原理:
#define offsetof(type, member) ((size_t) &((type *)0)->