05进程学习之PCB进程控制块
前言
我们知道,每个进程的内核区中都有一个进程控制块(PCB)来维护进程相关的信息,每个进程的PCB都是被MMU映射到物理内存上某块区域的不同地方。其实质是task_struct类型的结构体。
Linux下的存放路径:
/usr/src/linux-headers-3.16.0-30/include/linux/sched.h
1 PCB的一些重要成员
文件中可以查看struct task_struct 结构体定义。其内部成员有很多,下面我们重点讲解以下部分即可:
1) 进程id。
2) 进程的状态。
3) 当前工作目录(Current Working Directory)。
4) umask掩码。
5) 文件描述符表。
6) 和信号相关的信息。
7) 用户id和组id。
8) 进程切换时需要保存和恢复的一些CPU寄存器。
9) 描述虚拟地址空间的信息。
10) 描述控制终端的信息。
11) 会话(Session)和进程组。
12) 进程可以使用的资源上限(Resource Limit)。
以上重要性依次递减,重要理解前七个即可。
下面对上面的每一点进行分析。
2 分析PCB的重要内部信息
1)用于标识唯一进程,单位为无符号的pid_t。可用ps aux查看第二列即为进程id。
2)进程的状态,可分为就绪态,运行态,挂起态,终止态共四个状态;注意,有些书本会将就绪态划分为初始态和就绪态变成五个状态。
就绪态:就是进程初始化后等待CPU的时间分片就行工作,通俗将就是等待CPU叫你工作。
运行态:进程在运行。
挂起态:将整个进程挂起,等待CPU的其它资源,主动放弃CPU,记住是主动。例如我进程现在在运行着准备消费东西,忽然发现缺少东西消费,那么此时就会放弃CPU,不在争夺,等待别人通知再请求CPU的时间分片。这就是生产者消费者模型。
终止态(停止态):进程结束,释放资源。
3)当前工作目录就是当前进程的工作目录。例如进程bash即我们的输入终端,假设当前目录为家目录,当执行cd …后,进程bash的工作目录就改变了,那么PCB就会记录下来。
4)umask掩码就是一个进程对该进程内部资源分配的默认权限。由于PCB每个进程都有且不同,所以PCB内部的umask掩码在每个进程也不同,并非进程间共享。所以一个进程的umask掩码改变并不会影响另一个进程的umask掩码。例如打开两个bash终端,在一个终端进程改umask掩码为:
umask 551
而另一个终端进程仍为默认022,因为进程间的PCB是不同的。
5)文件描述符就是0,1,2…,但实际上它是一种键值,通过一种映射关系将指向file文件结构体的指针与这些整数关联起来,从而可以操控文件。
6)和信号相关的信息主要是:信号屏蔽集和未决信号集。这里不具体分析信号,等后面有空再总结信号的内容。
7)用户id和组id就是我们用户登录的id和它所属组的id。
8)就是说当我进程在执行的过程中,突然有一个等级比我高的进程被CPU优先执行了,但是需要保存这个被挂起的进程信息在寄存器,方便下一次按照这个挂起前的状态继续执行。
9)就是说MMU在负责将虚拟内存映射到物理内存后,需要保存该映射的记录,但是MMU不会帮你记录,它只负责映射,记录是放在进程控制块PCB当中。
10)即描述该进程是否与终端进程相关。有些进程与终端有关有些无关,例如守护进程就是与终端无关,表现为执行ps ajx 的第五列的"?",表示脱离终端,可看我博客关于守护进程的三篇博客。
11)会话id表示它属于哪个会话,进程组id表示该进程所属的进程组。会话:多个进程组的集合。进程组:多个进程的集合。
12)就是保存进程资源相关的信息。
3 总结
好了,说完PCB后,大家应该对进程有不错的理解了,非常简单,多看几次即可。没有什么可以总结的了,就看上面就差不多了。