进程控制块(PCB):用来标识一个进程的,它包含了该进程的各个信息。它是task_struct这个结构体。
那这个task_struct结构体是怎样在内核中存在的呢?接下来我来说一下。
内核在为每一个进程分配PCB的时候,实际上是分配了两个连续的物理页面(共8K),这两个页面的底部1K空间用作进程的PCB结构,剩余7K就是这个进程的系统空间堆栈了,如图:
内核把进程的列表存放在任务队列的双向循环链表中,链表中的每一项都是类型为task_struct,称之进程控制块的结构,该结构包含着一个具体进程的全部信息。
task_struct在32位操作系统上大小约为1.7KB,看着挺大,但是要考虑到该结构体内包含着一个进程的所有信息,那么也就挺小的了。task_struct包含的信息包括:打开的文件,进程的地址空间,挂起的信号,进程的状态,等等。
不过上面所说的进程控制块是系统会在内核中开辟连续的两个物理页面(共8K),其中底部放task_struct结构,其余为这个进程的系统空间堆栈。
这只是Linux2.6版本之前的方式了,便只通过栈指针就可以计算出其task_struct的地址。