操作系统作为整个计算机系统的资源管理者,担任着有序而高效管理计算机资源的艰巨任务。操作系统资源管理的基本对象是进程,为了方便系统的管理,每一个进程需要一个进程标识符pid,这和国家为每一个居民编一个居民身份证号的目的完全一样。
在Unix/Linux中,进程标识符pid是一个16位的整数,它被顺序编号,最小号为0,最大号为32767,闲置的pid可重新使用。详见Unix源代码中的struct poc{……short p_pid;……}《Unix结构分析:核心代码的结构和算法(修订版)》168页。那么,如何有序而高效地管理这32768个pid呢?
本文就此问题探索一下。
(1)标志位法
此方法为每一个pid设置一个使用标志,具体实现时将pid定义为一个二维数组short[][] pid,数组初始化为pid = new short[32768][2],数组的第一维按序存放0~32767个pid,数组的第二维为空闲标志,空闲置0,使用置1。分配时,从标志是0的pid中分配一个给进程,并将其空闲标志置1,回收时只需要将相应pid的空闲标志置0即可。此方法占用的内存空间是32768*2*2B=131072B。此法内存开销较大,标志位中的16位只使用了一位,资源浪费严重。
(2)符号位法
考虑到定义pid的short类型中pid只使用了除符号位以外的低15位,最高位,即符号位未用,因此可以加以利用。具体实现时将pid定义为一维数组short[] pid,数组初始化为pid = new short[32758],按序存放0~32767个pid,符号位是空闲标志,空闲时pid大于0,就表示pid本身,使用