本帖最后由 u012878842 于 2015-03-03 15:56:19 编辑

解决方案 »

  1.   

    线程的创建和进程的创建是不同的。线程的创建不代表进程的创建,况且,java线程的getID获得到的id和操作系统中线程的id也没关系,更何况进程的pid。
      

  2.   


    谢谢你的回复我现在困惑的是,这个代码注释表明这个函数是希望消耗Pids,但是按理解来说,这些线程应该共享一个PID;而矛盾的地方是,就算这些线程占用PID,那么如何保证Thread占用的Pid是没有出现过的Pid。
      

  3.   


    谢谢你的回复我现在困惑的是,这个代码注释表明这个函数是希望消耗Pids,但是按理解来说,这些线程应该共享一个PID;而矛盾的地方是,就算这些线程占用PID,那么如何保证Thread占用的Pid是没有出现过的Pid。我也疑惑它的注释。
    linux的pid数是有限的,那到达最大数后,再创建新的进程,它的pid就应该使用以前被kill掉的吧。
    你截的代码,看到的方法中判断条件,有个MAX_PID,应该就是最大数吧,其它代码你再看看。
      

  4.   


    谢谢你的回复我现在困惑的是,这个代码注释表明这个函数是希望消耗Pids,但是按理解来说,这些线程应该共享一个PID;而矛盾的地方是,就算这些线程占用PID,那么如何保证Thread占用的Pid是没有出现过的Pid。我也疑惑它的注释。
    linux的pid数是有限的,那到达最大数后,再创建新的进程,它的pid就应该使用以前被kill掉的吧。
    你截的代码,看到的方法中判断条件,有个MAX_PID,应该就是最大数吧,其它代码你再看看。
    几经曲折,终于找到:第一篇:http://www.cnblogs.com/princessd8251/articles/3914434.html
    这篇文章,测试JVM能开辟的最大线程数:  发现线程数量在达到32279以后,不再增长。查了一下,32位Linux系统可创建的最大pid数是32678,这个数值可以通过/proc/sys/kernel/pid_max来做修改(修改方法同threads-max),但是在32系统下这个值只能改小,无法更大。
    虽然实际线程数,可以通过修改内核来创建更多线程,但这表明,线程数跟Pid_max是有关的;第二篇:http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/这篇文章分析Linux 线程实现机制
    虽然,在线程库里面,pthread的创建,使用的是多个线程share 同一个PID,然而,内核确有自己的机制:
    Linux内核并不支持真正意义上的线程,LinuxThreads是用与普通进程具有同样内核调度视图的轻量级进程来实现线程支持的。这些轻量级进程拥有独立的进程id,在进程调度、信号处理、IO等方面享有与普通进程一样的能力。这句话就表明了,内核中,采用的是轻量级的进程来支撑线程的调度的,那么必然会占用Pid:第三篇:http://blog.chinaunix.net/uid-27767798-id-3470592.html讲述了Pid的分配过程:alloc_pidmap:
      static int alloc_pidmap(struct pid_namespace *pid_ns)
     {
             int i, offset, max_scan, pid, last = pid_ns->last_pid;  //取出last_pid
             struct pidmap *map;
     
             pid = last + 1;                                      //这里last+1,取得备选pid
    //如果pid到了pidmax,那么重头开始寻找可用的pid,从RESERVED_PIDS开始,保留RESERVED_PIDS之前的pid号,默认300
             if (pid >= pid_max)
                     pid = RESERVED_PIDS;
             ……
    }
     
    说明Pid是从底按照次序往上分配的。
    基本可以解释这个CTS的测试原理了,谢谢你的回复!