关于Cts中一个Thread问题

路人戊戌乙亥 2015-03-03 03:54:32
4.1.4. Cts测试有一项为testCheckForDuplicateOutput
源码在这里:http://xdecay.com/docs/android-sdk/cts/tests/tests/security/d0/db5/_cloned_secure_random_test_8java_source.php

测试的原理是:不停的创建和关闭进程,直到出现两个Pid相同的进程。

因为Linux的PId数是有限的,系统测试的前提是出现两个Pid相同的进程。
循环过程如下:
a). 创建进程A, 记录下A的Pid为pid-1; 然后立即Kill pid-1;
b). 创建进程B, 记录下B的Pid为pid-2; 然后立即Kill pid-2;
……
直到再次出现pid-1的进程号。

根据鸽巢原理(n个盒子装n+1个球,必然出现一个盒子有两个球的现象),当循环下去必然会再次出现pid-1。

CTS 测试为了加快测试速率,调用了如下的函数(wastePids):
比如 第一次是pid-1, 多次循环之后,出现pid-5000,那么就调用wastePids(1,5000)

源码如下:
    /**
* This is an attempt to get the PIDs to roll over faster. Threads use up
* PIDs on Android and spawning a new thread is much faster than having
* another service spawned as we are doing in this test.
*/
private static void wastePids(int firstPid, int previousPid) {
int distance = (firstPid - previousPid + MAX_PID) % MAX_PID;

// Don't waste PIDs if we're close to wrap-around to improve odds of
// collision.
if ((distance < PID_WASTING_SKIP_LOWER) || (MAX_PID - distance < PID_WASTING_SKIP_UPPER)) {
return;
}

for (int i = 0; i < distance; i++) {
Thread t = new Thread();
t.start();
}
}


按注释翻译而言,应该是通过创建Thread ,将这些Pid占用掉,让Pid尽快复用。

现在不明白的是:这个

        
for (int i = 0; i < distance; i++) {
Thread t = new Thread();
t.start();
}


它会消耗PID吗? Thread怎么可能消耗Pid, 还是我理解错了?
...全文
171 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
路人戊戌乙亥 2015-03-04
  • 打赏
  • 举报
回复
引用 3 楼 dalor 的回复:
[quote=引用 2 楼 u012878842 的回复:] [quote=引用 1 楼 dalor 的回复:] 线程的创建和进程的创建是不同的。线程的创建不代表进程的创建,况且,java线程的getID获得到的id和操作系统中线程的id也没关系,更何况进程的pid。
谢谢你的回复 我现在困惑的是,这个代码注释表明这个函数是希望消耗Pids,但是按理解来说,这些线程应该共享一个PID; 而矛盾的地方是,就算这些线程占用PID,那么如何保证Thread占用的Pid是没有出现过的Pid。 [/quote] 我也疑惑它的注释。 linux的pid数是有限的,那到达最大数后,再创建新的进程,它的pid就应该使用以前被kill掉的吧。 你截的代码,看到的方法中判断条件,有个MAX_PID,应该就是最大数吧,其它代码你再看看。。。。 [/quote] 几经曲折,终于找到: 第一篇: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的测试原理了,谢谢你的回复!
开发者_android 2015-03-03
  • 打赏
  • 举报
回复
引用 2 楼 u012878842 的回复:
[quote=引用 1 楼 dalor 的回复:] 线程的创建和进程的创建是不同的。线程的创建不代表进程的创建,况且,java线程的getID获得到的id和操作系统中线程的id也没关系,更何况进程的pid。
谢谢你的回复 我现在困惑的是,这个代码注释表明这个函数是希望消耗Pids,但是按理解来说,这些线程应该共享一个PID; 而矛盾的地方是,就算这些线程占用PID,那么如何保证Thread占用的Pid是没有出现过的Pid。 [/quote] 我也疑惑它的注释。 linux的pid数是有限的,那到达最大数后,再创建新的进程,它的pid就应该使用以前被kill掉的吧。 你截的代码,看到的方法中判断条件,有个MAX_PID,应该就是最大数吧,其它代码你再看看。。。。
路人戊戌乙亥 2015-03-03
  • 打赏
  • 举报
回复
引用 1 楼 dalor 的回复:
线程的创建和进程的创建是不同的。线程的创建不代表进程的创建,况且,java线程的getID获得到的id和操作系统中线程的id也没关系,更何况进程的pid。
谢谢你的回复 我现在困惑的是,这个代码注释表明这个函数是希望消耗Pids,但是按理解来说,这些线程应该共享一个PID; 而矛盾的地方是,就算这些线程占用PID,那么如何保证Thread占用的Pid是没有出现过的Pid。
开发者_android 2015-03-03
  • 打赏
  • 举报
回复
线程的创建和进程的创建是不同的。线程的创建不代表进程的创建,况且,java线程的getID获得到的id和操作系统中线程的id也没关系,更何况进程的pid。

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧