在进程槽中为进程分配一个空闲位置并分配一个进程号

刚开始看linux的源代码,个人感觉还是老师推荐的这本好,比赵烔那本更能学到思想,先解决思路,再去看具体代码。

新建进程这里刚开始看有些没看明白,反复想了后,发现了这个代码的巧妙

先贴上代码

//代码路径:/kernel/fork.c

135 int find_empty_process(void)
136 {
137         int i;
138 
139         repeat:
140                 if ((++last_pid)<0) last_pid=1;
141                 for(i=0 ; i<NR_TASKS ; i++)
142                         if (task[i] && task[i]->pid == last_pid) goto repeat;
143         for(i=1 ; i<NR_TASKS ; i++)
144                 if (!task[i])
145                         return i;
146         return -EAGAIN;
147 }

 关键是这里的repeat循环。

last_pid是一个全局变量,记录的是从系统开始运行到现在所创建过的进程数(注意这里是所创建过的,而不是现在系统中存在的,这对理解后面的代码至关重要),然后,第141 142行就是检验这个last_pid是否可用。为什么要做这个检查呢?因为随着系统的运行,有可能有的进程已经终结,但是last_pid记录的是总共运行过的进程数。注意到140行,判断++last_pid是否小于零。因为有可能运行多个进程后,last_pid值已经溢出,这时,就要人为的把它归到1(int变量也是几个亿的数吧,不过由此可见代码的严密性)。好了,到这里想必也能够明白为什么检查这个last_pid是不是可用的。对!就是因为这些pid是循环使用的,当系统运行久了后,前一轮的pid为last_pid的进程可能正在运行,但是突然系统又要创建一个新进程,经过循环,它的last_pid与之前存在的pid相同,这时为了避免冲突,就再返回到140行,把last_pid加1,如此往复,直到找到一个不冲突的PID。

143到145行很好理解,遍历进程糟,返回第一个空槽标号。

 

翻了一下oldlinux.org里linux 1.0版的find_empty_process(),做的改动大概是规定了一个循环的长度,而不是等到last_pid溢出,另外,还要检查当前进程所组ID之类,先不管,从容易的开始看,理解思想最重要

posted @ 2011-11-12 10:30  linyvxiang  阅读(468)  评论(0编辑  收藏  举报