zoukankan      html  css  js  c++  java
  • 在进程槽中为进程分配一个空闲位置并分配一个进程号

    刚开始看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之类,先不管,从容易的开始看,理解思想最重要

  • 相关阅读:
    SVN tags使用
    switch case执行顺序
    excel 15位身份证转18位
    .net core options 依赖注入的方式
    DICOM 相关概念了解
    Dicom文件基本操作
    asp.net core 3 使用nlog日志组件,使用$ {basedir}保存位置不对,记录下怎么解决
    asp.net core 动态更新 appsetting.json方法
    asp.net core appsetting.json 绑定读取
    centos 安装 nginx 及配置 的坑
  • 原文地址:https://www.cnblogs.com/yangce/p/2246277.html
Copyright © 2011-2022 走看看