在Linux/Unix系统中。每一个进程都有一个非负整型表示的唯一进程ID。尽管是唯一的。可是进程的ID能够重用。当一个进程终止后,其进程ID就能够再次使用了。

大多数Linux/Unix系统採用延迟重用的算法,使得赋予新建进程ID不同于近期终止进程所使用的ID,这主要是为了防止将新进程误觉得是使用同一ID的某个已终止的先前进程。本文讨论了Linux/Unix分配进程ID的方法以及源代码实现。

分配进程ID的方法

在大多数Linux/Unix系统中,生成一个进程ID方法是:从0開始依次连续分配,一直到能够分配的最大的进程ID(不同的系统。这个最大值是不一样的,比方有些Linux系统是65536)。一旦到达最大值,又一次从某个值(不同的系统,这个值也是不一样的,比方在Mac OS X和HP-UX系统中,这个值是100)開始依次连续查找那些还没有被使用的ID。这里分配进程ID的方法,存在潜在的安全问题。由于能够从系统获取信息或者提取进程间通信的内容。

考虑到安全问题。部分系统可能用其它方法来分配进程ID,比方随机分配一个进程ID。

不管用什么方法分配进程ID。系统都须要保证每一个进程ID是独一无二的。

Linux系统上分配进程ID的源代码实现

在Linux系统中,内核分配PID的范围是(RESERVED_PIDS, PID_MAX_DEFAULT)。在每一个namespace中。PID是依次连续分配的(在不同的namespace的task能够有同样的ID)。

一旦ID达到分配到达上限(在pseudo-file /proc/sys/kernel/pid_max中能够查看能够分配的最大进程ID),从头開始查找分配PID。下面是相关的源码:

struct pid *alloc_pid(struct pid_namespace *ns)
{
/*省略了一些代码*/
for (i = ns->level; i >= 0; i--) {
nr = alloc_pidmap(tmp);
if (nr < 0)
goto out_free;
pid->numbers[i].nr = nr;
pid->numbers[i].ns = tmp;
tmp = tmp->parent;
}
/*省略了一些代码*/
}
static int alloc_pidmap(struct pid_namespace *pid_ns)
{
int i, offset, max_scan, pid, last = pid_ns->last_pid;
struct pidmap *map; pid = last + 1;
if (pid >= pid_max)
pid = RESERVED_PIDS;
/* and later on... */
pid_ns->last_pid = pid;
return pid;
}

注意在Linux内核中,进程PID实现并不不过一个int标识符号(当然返回给应用程序,PID不过int类型的数值)。相关实现的结构体在/include/linux/pid.h中能够找到。除了ID外。它还包含跟这个ID相关的task列表、引用计数器和一个能够方便查找的hashed list。

进程ID分配须要注意的事项

       1、僵尸进程的PID是临时不能用的。须要其父进程收集器全部的终止状态才干使用,也就是说须要调用类似wait()函数后,才干使用。

       2、详细实现时,系统能够随机分配进程PID(当然是保证没有被其它进程使用),因此在应用程序中,不要依赖于进程PID的分配方式。

       3、在用户空间(user space)可能看到分配的进程ID并不连续,这是由于在应用程序两个fork之间,内核调度程序(scheduling)可能创建了一个进程。

其实。这样的情况是常常发生的。

參考资料

《UNIX环境高级编程》(第二版)

http://superuser.com/questions/135007/how-are-pids-generated

http://stackoverflow.com/questions/3446727/how-does-linux-determine-the-next-pid

http://en.wikipedia.org/wiki/Process_identifier



Linux/Unix分配进程ID的方法以及源代码实现的更多相关文章

  1. Linux下查找进程id并强制停止进程的脚本

    Linux下的tomcat的停止脚本shutdown.sh经常失败,造成tomcat进程没关闭.所以只能手动查找进程id,然后用kill命令来强制停止.每次都要这样查一下,然后再杀进程.感觉有点麻烦, ...

  2. Linux监控重要进程的实现方法

    Linux监控重要进程的实现方法 不管后台服务程序写的多么健壮,还是可能会出现core dump等程序异常退出的情况,但是一般情况下需要在无 人为干预情况下,能够自动重新启动,保证服务进程能够服务用户 ...

  3. 编写Linux/Unix守护进程

    原文: http://www.cnblogs.com/haimingwey/archive/2012/04/25/2470190.html 守护进程在Linux/Unix系统中有着广泛的应用.有时,开 ...

  4. 【Linux】- 守护进程的启动方法

    转自:Linux 守护进程的启动方法 Linux中"守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问 ...

  5. linux下查看进程id时用到的命令

    一.查看端口占用的进程 . lsof -i:端口号, 查看某一端口的占用情况 [root@localhost bin]# lsof -i: COMMAND PID USER FD TYPE DEVIC ...

  6. Linux的僵尸进程及其解决方法

    1. 产生原因: 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.通过ps命令查看其带有defunct的标志.僵尸进程是一个 ...

  7. Linux/UNIX之进程环境

    进程环境 进程终止 有8种方式使进程终止,当中5中为正常终止,它们是 1)      从main返回 2)      调用exit 3)      调用_exit或_Exit 4)      最后一个 ...

  8. Linux&UNIX上卸载GoldenGate的方法

    1. Log on to the database server (as oracle) where the GoldenGate software is installed. [root@oracl ...

  9. 使用Java代码获取Java进程ID的方法

    需要jre/lib下的tools.jar包 public class Test { public static void main(String[] args) throws Exception {  ...

随机推荐

  1. 【POJ】1486:Sorting Slides【二分图关键边判定】

    Sorting Slides Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5390   Accepted: 2095 De ...

  2. 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...

  3. JavaEE-学习目录

    JavaEE ============================================ Web工作机制 JSP Struts基础 Struts核心文件 Struts数据校验与国际化 S ...

  4. UIwebview 文件的下载与保存,以及mp3文件的播放

    这里只是说说异步 单线程下载与文件的保存 以下载一个mp3文件并保存为例: -(void)loading { //设置文件下载地址 NSString *urlString = [NSString st ...

  5. 背景建模或前景检測之PBAS

    申明,本文非笔者原创,原文转载自:http://blog.csdn.net/kcust/article/details/9931575 Pixel-Based Adaptive Segmenter(P ...

  6. PIC JDM Prototype Programmer 1001

    In need of a programmer for PIC micro controllers I decided to build my own one. This programmer has ...

  7. superobject

    GITHUB: https://github.com/hgourvest/superobject # SuperObject ## What is JSON ? - JSON (JavaScript ...

  8. [Erlang 0004] Centos 源代码编译 安装 Erlang

    原文地址: http://www.cnblogs.com/me-sa/archive/2011/07/09/erlang0004.html 由于最终部署的生产环境是Centos,所以我需要在Cento ...

  9. 发布设置setting.xml

    <?xml version="1.0" encoding="UTF-8"?> <!-- User-specific configuration ...

  10. C#中的String与string

    在C#中,string 是 System.String 的别名,所以基本上在使用时是没有差别的. 习惯上,我们把字符串当作对象时(有值的对象实体),我们用string. 而我们把它当类时(需要字符串类 ...