多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 從Cts測試testCheckForDuplicateOutput到linux kernel中Thread消耗PID

從Cts測試testCheckForDuplicateOutput到linux kernel中Thread消耗PID

來源:程序員人生   發布時間:2015-03-30 08:38:41 閱讀次數:4681次

最近折騰CTS

android.security.cts

testCheckForDuplicateOutput項,單項測試很容易過,但是聯測就掛了。


源碼:http://xdecay.com/docs/android-sdk/cts/tests/tests/security/d0/db5/_cloned_secure_random_test_8java_source.php

測試的原理是:不停的創建和關閉進程,測試Pass的條件是出現兩個Pid相同的進程。
循環進程以下:
a). 創建進程A, 記錄下A的Pid為pid⑴; 然后立即Kill pid⑴;
b). 創建進程B, 記錄下B的Pid為pid⑵; 然后立即Kill pid⑵;
……
直到再次出現記錄過的進程號。

由于Linux的PId數是有限的,
根據鴿巢原理(n個盒子裝n+1個球,必定出現1個盒子有兩個球的現象),假定PID的上線時pid_max, 那末如果創建pid_max+1個進程(其實不同時存在),那末
必定會再次出現之前出現過的進程號。


 CTS 測試為了加快測試速率,調用了以下的函數(wastePids):
比如 第1次是pid⑴, 屢次循環以后還未出現同PID的進程號,比如這時候出現了pid⑸000,那末就調用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盡快循環復用。

問題來了:從傳統的thread學習而言,thread怎樣會占用Pid,Linux書籍都會告知我們,所有同1個進程下的thread同享1個Pid;更何況,JVM的線程跟Pthread的線程還不是1個東西,因此迷惑了。


查了linux內核的書籍,基本不怎樣講述thread, 這主要是pthread是1個庫,而不是Linux內核本身的1部份。


然后開始翻墻google。

找到3篇文章:

第1篇:http://www.cnblogs.com/princessd8251/articles/3914434.html
這篇文章,測試JVM能開辟的最大線程數:  發現線程數量在到達32279以后,不再增長。查了1下,32位Linux系統可創建的最大pid數是32678,這個數值可以通過/proc/sys/kernel/pid_max來做修改(修改方法同threads-max),但是在32系統下這個值只能改小,沒法更大。
雖然實際線程數,可以通過修改內核來創建更多線程,但這表明,線程數跟Pid_max是有關的;

第2篇:http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/

這篇文章分析Linux 線程實現機制
雖然,在線程庫里面,pthread的創建,使用的是多個線程share 同1個PID,但是,內核確有自己的機制:
Linux內核其實不支持真正意義上的線程,LinuxThreads是用與普通進程具有一樣內核調度視圖的輕量級進程來實現線程支持的。這些輕量級進程具有獨立的進程id,在進程調度、信號處理、IO等方面享有與普通進程1樣的能力。

這句話就表明了,內核中,采取的是輕量級的進程來支持線程的調度的,那末必定會占用Pid:

第3篇:http://blog.chinaunix.net/uid⑵7767798-id⑶470592.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是從低往高分配,當超過pid_max,那末重頭開始尋覓可用的pid,從RESERVED_PIDS開始,保存RESERVED_PIDS之前的pid號,默許300


到這里基本就明朗了。


至于Thread如何通過VM進入到內核 參看:http://www.eoeandroid.com/blog⑵1517⑶026.html



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧洲自拍偷拍 | 国产精品一区二区久久精品涩爱 | 色妞影视| 另类最猛性xxxxx | 亚洲 欧美 国产 中文 | 美女毛片免费 | 真人性做爰aa毛片免费视频观看 | 一区二区三区免费观看 | 成人国产一区 | 国产永久在线观看 | 免费xxxxx大片观看 | 国产精品jizz在线观看免费 | 国产一级淫片a免费播放口欧美 | 91中文字幕yellow字幕网 | 亚洲 校园 欧美 动漫 制服 | 国产成人啪午夜精品网站男同 | 精品视频一区二区三区四区五区 | 亚洲乱码视频在线观看 | 羞羞网站在线看 | 一级毛片特级毛片国产 | 亚洲视频在线一区二区 | 欧美xx网 | 国产成人一区二区三区影院免费 | 午夜在线播放视频在线观看视频 | 国产永久一区二区三区 | 亚洲成aⅴ人在线观看 | 天天综合在线观看 | 国产一区二区三区高清视频 | 成人在线视频一区 | 亚洲一区亚洲二区亚洲三区 | 黄色网址www| 最近免费中文字幕mv | 欧美国产亚洲精品高清不卡 | 国内精品免费视频精选在线观看 | 国产成人精品午夜在线播放 | 永久免费看片 | www天堂在线观看 | 国产精品反差婊在线观看 | 一级特黄aa大片免费播放视频 | 久久亚洲一级α片 | 亚洲欧美日韩国产精品网 |