锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
榪欎釜綰跨▼縐佹湁鏁版嵁鍦↗ava涓笌ThreadLocal綾葷殑浣滅敤鐩稿悓,浣跨敤涓婁篃綾諱技錛?br />
鍏充簬ThreadLocal綾葷殑浣跨敤鍙傝冩湰鍗氫腑http://www.tkk7.com/fhtdy2004/archive/2009/06/02/279582.html
鐜板湪鎰熻涓涓笢瑗垮閫忓交浜嗭紝鏈変簺涓滆タ瀛﹁搗鏉ヤ細寰堝揩錛屽熀紜寰堥噸瑕?/font>
1.姒傝堪
銆銆璁稿鍒濆鑰呭C/C++璇█涓殑void鍙妚oid鎸囬拡綾誨瀷涓嶇敋鐞嗚В錛屽洜姝ゅ湪浣跨敤涓婂嚭鐜頒簡涓浜涢敊璇傛湰鏂囧皢瀵箆oid鍏抽敭瀛楃殑娣卞埢鍚箟榪涜瑙h錛屽茍
璇﹁堪void鍙妚oid鎸囬拡綾誨瀷鐨勪嬌鐢ㄦ柟娉曚笌鎶宸с?/p>
2.void鐨勫惈涔?/strong>
銆銆void鐨勫瓧闈㈡剰鎬濇槸“鏃犵被鍨?#8221;錛?strong>void *鍒欎負“鏃犵被鍨嬫寚閽?#8221;錛寁oid *鍙互鎸囧悜浠諱綍綾誨瀷鐨勬暟鎹?/strong>
銆銆void鍑犱箮鍙湁“娉ㄩ噴”鍜岄檺鍒剁▼搴忕殑浣滅敤錛屽洜涓轟粠鏉ユ病鏈変漢浼氬畾涔変竴涓獀oid鍙橀噺錛岃鎴戜滑璇曠潃鏉ュ畾涔夛細
void a;
銆銆榪欒璇彞緙栬瘧鏃朵細鍑洪敊錛屾彁紺?#8220;illegal use of type 'void'”銆備笉榪囷紝鍗充嬌void a鐨勭紪璇戜笉浼氬嚭閿欙紝瀹冧篃娌℃湁浠諱綍瀹為檯鎰忎箟銆?/p>
銆銆void鐪熸鍙戞尌鐨勪綔鐢ㄥ湪浜庯細
銆銆錛?錛?瀵瑰嚱鏁拌繑鍥炵殑闄愬畾錛?br />
銆銆錛?錛?瀵瑰嚱鏁板弬鏁扮殑闄愬畾銆?/p>
銆銆鎴戜滑灝嗗湪絎笁鑺傚浠ヤ笂浜岀偣榪涜鍏蜂綋璇存槑銆?/p>
銆銆浼楁墍鍛ㄧ煡錛屽鏋滄寚閽坧1鍜宲2鐨勭被鍨嬬浉鍚岋紝閭d箞鎴戜滑鍙互鐩存帴鍦╬1鍜宲2闂翠簰鐩歌祴鍊鹼紱濡傛灉p1鍜宲2鎸囧悜涓嶅悓鐨勬暟鎹被鍨嬶紝鍒欏繀欏諱嬌鐢ㄥ己鍒剁被鍨?/p>
杞崲榪愮畻絎︽妸璧嬪艱繍綆楃鍙寵竟鐨勬寚閽堢被鍨嬭漿鎹負宸﹁竟鎸囬拡鐨勭被鍨嬨?/p>
銆銆渚嬪錛?br />
float *p1;
int *p2;
p1 = p2;
銆銆鍏朵腑p1 = p2璇彞浼氱紪璇戝嚭閿欙紝鎻愮ず“'=' : cannot convert from 'int *' to 'float *'”錛屽繀欏繪敼涓猴細
p1 = (float *)p2;
鑰寁oid *鍒欎笉鍚岋紝浠諱綍綾誨瀷鐨勬寚閽堥兘鍙互鐩存帴璧嬪肩粰瀹冿紝鏃犻渶榪涜寮哄埗綾誨瀷杞崲錛?br />
void *p1;
int *p2;
p1 = p2;
銆銆浣嗚繖騫朵笉鎰忓懗鐫錛寁oid *涔熷彲浠ユ棤闇寮哄埗綾誨瀷杞崲鍦拌祴緇欏叾瀹冪被鍨嬬殑鎸囬拡銆傚洜涓?#8220;鏃犵被鍨?#8221;鍙互鍖呭“鏈夌被鍨?#8221;錛岃?#8220;鏈夌被鍨?#8221;鍒欎笉鑳藉寘
瀹?#8220;鏃犵被鍨?#8221;銆傞亾鐞嗗緢綆鍗曪紝鎴戜滑鍙互璇?#8220;鐢蜂漢鍜屽コ浜洪兘鏄漢”錛屼絾涓嶈兘璇?#8220;浜烘槸鐢蜂漢”鎴栬?#8220;浜烘槸濂充漢”銆備笅闈㈢殑璇彞緙栬瘧鍑洪敊錛?br />
void *p1;
int *p2;
p2 = p1;
銆銆鎻愮ず“'=' : cannot convert from 'void *' to 'int *'”銆?/p>
3.void鐨勪嬌鐢?/strong>
銆銆涓嬮潰緇欏嚭void鍏抽敭瀛楃殑浣跨敤瑙勫垯錛?br /> 銆銆瑙勫垯涓 濡傛灉鍑芥暟娌℃湁榪斿洖鍊鹼紝閭d箞搴斿0鏄庝負void綾誨瀷
銆銆鍦–璇█涓紝鍑′笉鍔犺繑鍥炲肩被鍨嬮檺瀹氱殑鍑芥暟錛屽氨浼氳緙栬瘧鍣ㄤ綔涓鴻繑鍥炴暣鍨嬪煎鐞嗐備絾鏄澶氱▼搴忓憳鍗磋浠ヤ負鍏朵負void綾誨瀷銆備緥濡傦細
add ( int a, int b )
{
return a + b;
}
int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}
銆銆紼嬪簭榪愯鐨勭粨鏋滀負杈撳嚭錛?br />
銆銆2 + 3 = 5
銆銆榪欒鏄庝笉鍔犺繑鍥炲艱鏄庣殑鍑芥暟鐨勭‘涓篿nt鍑芥暟銆?/p>
銆銆鏋楅攼鍗氬+銆婇珮璐ㄩ噺C/C++緙栫▼銆嬩腑鎻愬埌錛?#8220;C++璇█鏈夊緢涓ユ牸鐨勭被鍨嬪畨鍏ㄦ鏌ワ紝涓嶅厑璁鎬笂榪版儏鍐碉紙鎸囧嚱鏁頒笉鍔犵被鍨嬪0鏄庯級鍙戠敓”銆傚彲鏄紪璇?/p>
鍣ㄥ茍涓嶄竴瀹氳繖涔堣瀹氾紝璀鍦╒isual C++6.0涓笂榪癮dd鍑芥暟鐨勭紪璇戞棤閿欎篃鏃犺鍛婁笖榪愯姝g‘錛屾墍浠ヤ笉鑳藉瘎甯屾湜浜庣紪璇戝櫒浼氬仛涓ユ牸鐨勭被鍨嬫鏌ャ?/p>
銆銆鍥犳錛屼負浜嗛伩鍏嶆販涔憋紝鎴戜滑鍦ㄧ紪鍐機/C++紼嬪簭鏃訛紝瀵逛簬浠諱綍鍑芥暟閮藉繀欏諱竴涓笉婕忓湴鎸囧畾鍏剁被鍨嬨傚鏋滃嚱鏁版病鏈夎繑鍥炲鹼紝涓瀹氳澹版槑涓簐oid綾?/p>
鍨嬨傝繖鏃㈡槸紼嬪簭鑹ソ鍙鎬х殑闇瑕侊紝涔熸槸緙栫▼瑙勮寖鎬х殑瑕佹眰銆傚彟澶栵紝鍔犱笂void綾誨瀷澹版槑鍚庯紝涔熷彲浠ュ彂鎸ヤ唬鐮佺殑“鑷敞閲?#8221;浣滅敤銆備唬鐮佺殑“鑷敞
閲?#8221;鍗充唬鐮佽兘鑷繁娉ㄩ噴鑷繁銆?/p>
瑙勫垯浜?濡傛灉鍑芥暟鏃犲弬鏁?閭d箞搴斿0鏄庡叾鍙傛暟涓簐oid
銆銆鍦–++璇█涓0鏄庝竴涓繖鏍風殑鍑芥暟錛?br />
int function(void)
{
return 1;
}
銆銆鍒欒繘琛屼笅闈㈢殑璋冪敤鏄笉鍚堟硶鐨勶細
function(2);
銆銆鍥犱負鍦–++涓紝鍑芥暟鍙傛暟涓簐oid鐨勬剰鎬濇槸榪欎釜鍑芥暟涓嶆帴鍙椾換浣曞弬鏁般?/p>
銆銆鎴戜滑鍦═urbo C 2.0涓紪璇戯細
#include "stdio.h"
fun()
{
return 1;
}
main()
{
printf("%d",fun(2));
getchar();
}
銆銆緙栬瘧姝g‘涓旇緭鍑?錛岃繖璇存槑錛屽湪C璇█涓紝鍙互緇欐棤鍙傛暟鐨勫嚱鏁頒紶閫佷換鎰忕被鍨嬬殑鍙傛暟錛屼絾鏄湪C++緙栬瘧鍣ㄤ腑緙栬瘧鍚屾牱鐨勪唬鐮佸垯浼氬嚭閿欍傚湪C++
涓紝涓嶈兘鍚戞棤鍙傛暟鐨勫嚱鏁頒紶閫佷換浣曞弬鏁幫紝鍑洪敊鎻愮ず“'fun' : function does not take 1 parameters”銆?/p>
銆銆鎵浠ワ紝鏃犺鍦–榪樻槸C++涓紝鑻ュ嚱鏁頒笉鎺ュ彈浠諱綍鍙傛暟錛屼竴瀹氳鎸囨槑鍙傛暟涓簐oid銆傝嚦灝戞垜寰堝皯榪欐牱鐢ㄣ傘?/p>
銆銆瑙勫垯涓?灝忓績浣跨敤void鎸囬拡綾誨瀷
銆銆鎸夌収ANSI(American National Standards Institute)鏍囧噯錛屼笉鑳藉void鎸囬拡榪涜綆楁硶鎿嶄綔錛屽嵆涓嬪垪鎿嶄綔閮芥槸涓嶅悎娉曠殑錛?br />
void * pvoid;
pvoid++; //ANSI錛氶敊璇?br />
pvoid += 1; //ANSI錛氶敊璇?br />
//ANSI鏍囧噯涔嬫墍浠ヨ繖鏍瘋瀹氾紝鏄洜涓哄畠鍧氭寔錛氳繘琛岀畻娉曟搷浣滅殑鎸囬拡蹇呴』鏄‘瀹氱煡閬撳叾鎸囧悜鏁版嵁綾誨瀷澶у皬鐨勩?br />
//渚嬪錛?br />
int *pint;
pint++; //ANSI錛氭紜?/p>
銆銆pint++鐨勭粨鏋滄槸浣垮叾澧炲ぇsizeof(int)銆?/p>
銆銆浣嗘槸澶у悕榧庨紟鐨凣NU(GNU's Not Unix鐨勭緝鍐?鍒欎笉榪欎箞璁ゅ畾錛屽畠鎸囧畾void *鐨勭畻娉曟搷浣滀笌char *涓鑷淬?/p>
銆鍥犳涓嬪垪璇彞鍦℅NU緙栬瘧鍣ㄤ腑鐨嗘紜細
pvoid++; //GNU錛氭紜?br />
pvoid += 1; //GNU錛氭紜?/p>
銆銆pvoid++鐨勬墽琛岀粨鏋滄槸鍏跺澶т簡1銆?/p>
銆銆鍦ㄥ疄闄呯殑紼嬪簭璁捐涓紝涓鴻繋鍚圓NSI鏍囧噯錛屽茍鎻愰珮紼嬪簭鐨勫彲縐繪鎬э紝鎴戜滑鍙互榪欐牱緙栧啓瀹炵幇鍚屾牱鍔熻兘鐨勪唬鐮侊細
void * pvoid;
(char *)pvoid++; //ANSI錛氭紜紱GNU錛氭紜?br />
(char *)pvoid += 1; //ANSI錛氶敊璇紱GNU錛氭紜?/p>
銆銆GNU鍜孉NSI榪樻湁涓浜涘尯鍒紝鎬諱綋鑰岃█錛孏NU杈傾NSI鏇?#8220;寮鏀?#8221;錛屾彁渚涗簡瀵規洿澶氳娉曠殑鏀寔銆備絾鏄垜浠湪鐪熷疄璁捐鏃訛紝榪樻槸搴旇灝藉彲鑳藉湴榪庡悎
ANSI鏍囧噯銆?/p>
銆銆瑙勫垯鍥?濡傛灉鍑芥暟鐨勫弬鏁板彲浠ユ槸浠繪剰綾誨瀷鎸囬拡錛岄偅涔堝簲澹版槑鍏跺弬鏁頒負void *
銆銆鍏稿瀷鐨勫鍐呭瓨鎿嶄綔鍑芥暟memcpy鍜宮emset鐨勫嚱鏁板師鍨嬪垎鍒負錛?br />
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
銆銆榪欐牱錛屼換浣曠被鍨嬬殑鎸囬拡閮藉彲浠ヤ紶鍏emcpy鍜宮emset涓紝榪欎篃鐪熷疄鍦頒綋鐜頒簡鍐呭瓨鎿嶄綔鍑芥暟鐨勬剰涔夛紝鍥犱負瀹冩搷浣滅殑瀵硅薄浠呬粎鏄竴鐗囧唴瀛橈紝鑰屼笉
璁鴻繖鐗囧唴瀛樻槸浠涔堢被鍨嬨傚鏋渕emcpy鍜宮emset鐨勫弬鏁扮被鍨嬩笉鏄痸oid *錛岃屾槸char *錛岄偅鎵嶅彨鐪熺殑濂囨簡錛佽繖鏍風殑memcpy鍜宮emset鏄庢樉涓嶆槸涓涓?/p>
“綰補鐨勶紝鑴辯浣庣駭瓚e懗鐨?#8221;鍑芥暟錛?/p>
涓嬮潰鐨勪唬鐮佹墽琛屾紜細
//紺轟緥錛歮emset鎺ュ彈浠繪剰綾誨瀷鎸囬拡
int intarray[100];
memset ( intarray, 0, 100*sizeof(int) ); //灝唅ntarray娓?
//紺轟緥錛歮emcpy鎺ュ彈浠繪剰綾誨瀷鎸囬拡
int intarray1[100], intarray2[100];
memcpy ( intarray1, intarray2, 100*sizeof(int) ); //灝唅ntarray2鎷瘋礉緇檌ntarray1
銆銆鏈夎叮鐨勬槸錛宮emcpy鍜宮emset鍑芥暟榪斿洖鐨勪篃鏄痸oid *綾誨瀷錛屾爣鍑嗗簱鍑芥暟鐨勭紪鍐欒呮槸澶氫箞鍦板瘜鏈夊闂晩錛?/p>
銆銆瑙勫垯浜?void涓嶈兘浠h〃涓涓湡瀹炵殑鍙橀噺
銆銆涓嬮潰浠g爜閮戒紒鍥捐void浠h〃涓涓湡瀹炵殑鍙橀噺錛屽洜姝ら兘鏄敊璇殑浠g爜錛?br />
void a; //閿欒
function(void a); //閿欒
銆銆void浣撶幇浜嗕竴縐嶆娊璞★紝榪欎釜涓栫晫涓婄殑鍙橀噺閮芥槸“鏈夌被鍨?#8221;鐨勶紝璀涓涓漢涓嶆槸鐢蜂漢灝辨槸濂充漢錛堣繕鏈変漢濡栵紵錛夈?/p>
銆銆void鐨勫嚭鐜板彧鏄負浜嗕竴縐嶆娊璞$殑闇瑕侊紝濡傛灉浣犳紜湴鐞嗚В浜嗛潰鍚戝璞′腑“鎶借薄鍩虹被”鐨勬蹇碉紝涔熷緢瀹規槗鐞嗚Вvoid鏁版嵁綾誨瀷銆傛濡備笉鑳界粰鎶?/p>
璞″熀綾誨畾涔変竴涓疄渚嬶紝鎴戜滑涔熶笉鑳藉畾涔変竴涓獀oid錛堣鎴戜滑綾繪瘮鐨勭Оvoid涓?#8220;鎶借薄鏁版嵁綾誨瀷”錛夊彉閲忋?/p>
4.鎬葷粨
銆銆灝忓皬鐨剉oid钑磋棌鐫寰堜赴瀵岀殑璁捐鍝插錛屼綔涓轟竴鍚嶇▼搴忚璁′漢鍛橈紝瀵歸棶棰樿繘琛屾繁涓涓眰嬈$殑鎬濊冨繀鐒朵嬌鎴戜滑鍙楃泭鍖祬銆?br />
鍋囪鏈夊叡浜殑璧勬簮sum,涓庝箣鐩稿叧鑱旂殑mutex 鏄痩ock_s.鍋囪姣忎釜綰跨▼瀵箂um鐨勬搷浣滃緢綆鍗曠殑,涓巗um鐨勭姸鎬佹棤鍏?姣斿鍙槸sum++.閭d箞鍙敤mutex瓚沖浜?紼嬪簭鍛樺彧瑕佺‘淇濇瘡涓嚎紼嬫搷浣滃墠,鍙栧緱lock,鐒跺悗sum++,鍐島nlock鍗沖彲.姣忎釜綰跨▼鐨勪唬鐮佸皢鍍忚繖鏍穉dd()
{
銆銆pthread_mutex_lock(lock_s);
銆銆sum++;
銆銆pthread_mutex_unlock(lock_s);
}
銆銆濡傛灉鎿嶄綔姣旇緝澶嶆潅,鍋囪綰跨▼t0,t1,t2鐨勬搷浣滄槸sum++,鑰岀嚎紼媡3鍒欐槸鍦╯um鍒拌揪100鐨勬椂鍊?鎵撳嵃鍑轟竴鏉′俊鎭?騫跺sum娓呴浂.榪欑鎯呭喌涓?濡傛灉鍙敤mutex, 鍒檛3闇瑕佷竴涓驚鐜?姣忎釜寰幆閲屽厛鍙栧緱lock_s,鐒跺悗媯鏌um鐨勭姸鎬?濡傛灉sum>=100,鍒欐墦鍗板茍娓呴浂,鐒跺悗unlock.濡傛灉sum<100,鍒檜nlock,騫秙leep()鏈嚎紼嬪悎閫傜殑涓孌墊椂闂?
銆榪欎釜鏃跺?t0,t1,t2鐨勪唬鐮佷笉鍙?t3鐨勪唬鐮佸涓?br />
銆銆print()
銆銆{
銆銆銆銆while (1)
銆銆銆銆{
銆銆銆銆銆銆pthread_mutex_lock(lock_s);
銆銆銆銆銆銆if(sum<100)
銆銆銆銆銆銆{
銆銆銆銆銆銆銆銆printf(“sum reach 100!”);
銆銆銆銆銆銆銆銆pthread_mutex_unlock(lock_s);
銆銆銆銆銆銆}
銆銆銆銆銆銆else
銆銆銆銆銆銆{
銆銆銆銆銆銆銆銆pthread_mutex_unlock(lock_s);
銆銆銆銆銆銆銆銆my_thread_sleep(100);
銆銆銆銆銆銆銆銆return OK;
銆銆銆銆銆銆}
銆銆銆銆}
銆銆}
榪欑鍔炴硶鏈変袱涓棶棰?br />
銆銆1) sum鍦ㄥぇ澶氭暟鎯呭喌涓嬩笉浼氬埌杈?00,閭d箞瀵箃3鐨勪唬鐮佹潵璇?澶у鏁版儏鍐典笅,璧扮殑鏄痚lse鍒嗘敮,鍙槸lock鍜寀nlock,鐒跺悗sleep().榪欐氮璐逛簡CPU澶勭悊鏃墮棿.
銆銆2) 涓轟簡鑺傜渷CPU澶勭悊鏃墮棿,t3浼氬湪鎺㈡祴鍒皊um娌″埌杈?00鐨勬椂鍊檚leep()涓孌墊椂闂?榪欐牱鍗村張甯︽潵鍙﹀涓涓棶棰?浜﹀嵆t3鍝嶅簲閫熷害涓嬮檷.鍙兘鍦╯um鍒拌揪200鐨勬椂鍊?t3鎵嶄細閱掕繃鏉?
銆銆3) 榪欐牱,紼嬪簭鍛樺湪璁劇疆sleep()鏃墮棿鐨勬椂鍊欓櫡鍏ヤ袱闅懼鍦?璁劇疆寰楀お鐭簡鑺傜渷涓嶄簡璧勬簮,澶暱浜嗗張闄嶄綆鍝嶅簲閫熷害.鐪熸槸闅懼姙鍟?
銆銆榪欎釜鏃跺?condition variable鍐呰¥澶栫┛,浠庡ぉ鑰岄檷,鎷晳浜嗙劍澶寸儌棰濈殑浣?
銆銆浣犻鍏堝畾涔変竴涓猚ondition variable.
銆銆pthread_cond_t cond_sum_ready=PTHREAD_COND_INITIALIZER;
銆銆t0,t1,t2鐨勪唬鐮佸彧瑕佸悗闈㈠姞涓よ,鍍忚繖鏍?br />
銆銆add()
銆銆{
銆銆銆銆pthread_mutex_lock(lock_s);
銆銆銆銆sum++;
銆銆銆銆pthread_mutex_unlock(lock_s);
銆銆銆銆if(sum>=100)
銆銆銆銆pthread_cond_signal(&cond_sum_ready);
銆銆}
銆銆鑰宼3鐨勪唬鐮佸垯鏄?br />
銆銆print
銆銆{
銆銆銆銆pthread_mutex_lock(lock_s);
銆銆銆銆while(sum<100)
銆銆銆銆pthread_cond_wait(&cond_sum_ready, &lock_s);
銆銆銆銆printf(“sum is over 100!”);
銆銆銆銆sum=0;
銆銆銆銆pthread_mutex_unlock(lock_s);
銆銆銆銆return OK;
銆銆}
娉ㄦ剰涓ょ偣:
銆銆1) 鍦╰hread_cond_wait()涔嬪墠,蹇呴』鍏坙ock鐩稿叧鑱旂殑mutex, 鍥犱負鍋囧鐩爣鏉′歡鏈弧瓚?pthread_cond_wait()瀹為檯涓婁細unlock璇utex, 鐒跺悗block,鍦ㄧ洰鏍囨潯浠舵弧瓚沖悗鍐嶉噸鏂發ock璇utex, 鐒跺悗榪斿洖.
銆銆2) 涓轟粈涔堟槸while(sum<100),鑰屼笉鏄痠f(sum<100) ?榪欐槸鍥犱負鍦╬thread_cond_signal()鍜宲thread_cond_wait()榪斿洖涔嬮棿,鏈夋椂闂村樊,鍋囪鍦ㄨ繖涓椂闂村樊鍐?榪樻湁鍙﹀涓涓嚎紼媡4鍙堟妸sum鍑忓皯鍒?00浠ヤ笅浜?閭d箞t3鍦╬thread_cond_wait()榪斿洖涔嬪悗,鏄劇劧搴旇鍐嶆鏌ヤ竴閬峴um鐨勫ぇ灝?榪欏氨鏄敤while鐨勭敤鎰?/p>
boost lib
http://www.stlchina.org/twiki/bin/view.pl/Main/BoostThread#safag7ZYn7rqw
鏂囩珷鍑哄錛欴IY閮ㄨ惤(http://www.diybl.com/course/3_program/c++/cppxl/20090508/166837.html)
鍩烘湰鎿嶄綔
浜掓枼閲?/strong>
鍩烘湰鎿嶄綔
鏉′歡鍙橀噺
涓縐嶄俊鍙鋒満鍒?/p>
鍩烘湰鎿嶄綔
浜掓枼閲廇淇濇姢鏉′歡鍙橀噺B
鎴戠殑闂鏉ヤ簡錛屽亣濡傛槸涓涓繘紼嬩嬌鐢ㄤ簡udp鐨勯樆濉瀝ecvfrom()鏂規硶錛屽湪緗戠粶榪炴帴娌℃湁鏁版嵁鍒拌揪鏃訛紝榪涚▼浼氬湪榪欎釜鏂規硶涓婇潰闃誨錛熻繖涓樆濉炵殑鎰忔濇槸榪涚▼浼氳繘鍏ョ瓑寰呴槦鍒楋紝姝ゆ椂鐨勮繘紼嬪浜庝笅鍒楃殑浠涔堢姸鎬侊紵錛熺劧鍚巆pu榪涜岃皟搴﹀叾浠栬繘紼嬨傘傘傝繕鏄痗pu浠嶇劧緇欐榪涚▼鍒嗛厤鏃墮棿鐗囧湪瀹冭嚜宸辯殑鏃墮棿鐗囦笂璁╁叾闃誨鍦ㄦ鏂規硶涓?榪欎笉鏄氮璐筩pu鏃墮棿??
鎴戞槸鐪熺殑寰楀ソ濂界湅鐪嬫搷浣滅郴緇熺殑涔︿簡
D Uninterruptible sleep (usually IO)
涓嶅彲涓柇鐨勬繁搴︾潯鐪狅紝涓鑸敱IO寮曡搗錛屽悓姝O鍦ㄥ仛璇繪垨鍐欐搷浣滄椂錛屾榪涚▼涓嶈兘鍋氬叾瀹冧簨鎯咃紝鍙兘絳夊緟錛岃繖鏃惰繘紼嬪浜庤繖縐嶇姸鎬侊紝濡傛灉紼嬪簭閲囩敤寮傛IO錛岃繖縐嶇姸鎬佸簲璇ュ氨寰堝皯瑙佸埌浜?br />
R Running or runnable (on run queue)
榪涚▼澶勪簬榪愯鎴栧氨緇姸鎬?br />
S Interruptible sleep (waiting for an event to complete)
鍙帴鏀朵俊鍙風殑鐫$湢鐘舵侊紝sleep鍑芥暟鍙紨紺鴻繖縐嶇姸鎬?br />
T Stopped, either by a job control signal or because it is being traced.
琚玞trl+z涓柇鎴栬trace
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
榪涚▼宸茬粡瀹屽叏姝繪帀錛屼笉鍙兘鐪嬭榪欑鐘舵佺殑
Z Defunct ("zombie") process, terminated but not reaped by its parent.
榪涚▼宸茬粡緇堟錛屼絾鏄叾鐖惰繘紼嬫病鏈夋潵鍙婂鐞嗗畠錛屽榪涚▼鍐欎笉濂界殑璇濓紝榪欑鐘舵佹槸甯歌鐨?br />
For BSD formats and when the stat keyword is used, additional characters may
be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
鍏充簬D鍜孼涓孌墊湁瓚g殑瑙i噴錛?br />
鏈変竴綾誨瀮鍦懼嵈騫墮潪榪欎箞瀹規槗鎵撴壂錛岄偅灝辨槸鎴戜滑甯歌鐨勭姸鎬佷負 D (Uninterruptible sleep) 錛屼互鍙婄姸鎬佷負 Z (Zombie) 鐨勫瀮鍦捐繘紼嬨傝繖浜涘瀮鍦捐繘紼嬭涔堟槸姹傝屼笉寰楋紝鍍忔ㄥ涓鑸瓑寰呰祫婧?D)錛岃涔堟槸鍍佃屼笉姝伙紝鍍忓啢欖備竴鏍風瓑寰呰秴搴?Z)錛屽畠浠湪 CPU run_queue 閲屾粸鐣欎笉鍘伙紝鎶?Load Average 寮勭殑鑰侀珮鑰侀珮錛屾病鐪嬭繃鎴戝墠涓綃嘼log鐨勫浗闄呭弸浜鴻繕浠ヤ負榪欏効姘戞ㄦ哺鑵懼張鍑轟簡浠涔堝ぇ浜嬪憿銆傛庝箞鍔烇紵寮鏋紒kill -9錛佺湅浣犱滑璧版槸涓嶈蛋銆備絾榪欎袱縐嶅瀮鍦捐繘紼嬪亸鍋忔槸鍒鏋笉鍏ョ殑錛屼笉綆℃崲鍝鏋硶閮芥潃涓嶆帀瀹冧滑銆傛棤濂堬紝鍙ソreboot錛屽儚鍓跨伃紱芥祦鎰熼偅鏍蜂笉鍒嗛潚綰㈢殏鐧藉湴涓寰嬫墤鏉錛?br />
鎬ㄥ D錛屽線寰鏄敱浜?I/O 璧勬簮寰椾笉鍒版弧瓚籌紝鑰屽紩鍙戠瓑寰咃紝鍦ㄥ唴鏍告簮鐮?fs/proc/array.c 閲岋紝鍏舵枃瀛楀畾涔変負“ "D (disk sleep)", /* 2 */ ”錛堢敱姝ゅ彲鐭?D 鍘熸槸Disk鐨勬墦澶村瓧姣嶏級錛屽搴旂潃 include/linux/sched.h 閲岀殑“ #define TASK_UNINTERRUPTIBLE 2 ”銆備婦涓緥瀛愶紝褰?NFS 鏈嶅姟绔叧闂箣鏃訛紝鑻ユ湭浜嬪厛 umount 鐩稿叧鐩綍錛屽湪 NFS 瀹㈡埛绔墽琛?df 灝變細鎸備綇鏁翠釜鐧誨綍浼氳瘽錛屾寜 Ctrl+C 銆丆trl+Z 閮芥棤嫻庝簬浜嬨傛柇寮榪炴帴鍐嶇櫥褰曪紝鎵ц ps axf 鍒欑湅鍒板垰鎵嶇殑 df 榪涚▼鐘舵佷綅宸插彉鎴愪簡 D 錛宬ill -9 鏃犳硶鏉鐏傛紜殑澶勭悊鏂瑰紡錛屾槸椹笂鎭㈠ NFS 鏈嶅姟绔紝鍐嶅害鎻愪緵鏈嶅姟錛屽垰鎵嶆寕璧風殑 df 榪涚▼鍙戠幇浜嗗叾鑻﹁嫤絳夊緟鐨勮祫婧愶紝渚垮畬鎴愪換鍔★紝鑷姩娑堜骸銆傝嫢 NFS 鏈嶅姟绔棤娉曟仮澶嶆湇鍔★紝鍦?reboot 涔嬪墠涔熷簲灝?/etc/mtab 閲岀殑鐩稿叧 NFS mount 欏瑰垹闄わ紝浠ュ厤 reboot 榪囩▼渚嬭璋冪敤 netfs stop 鏃跺啀嬈″彂鐢熺瓑寰呰祫婧愶紝瀵艱嚧緋葷粺閲嶅惎榪囩▼鎸傝搗銆?/p>
銆銆鍐ら瓊 Z 涔嬫墍浠ユ潃涓嶆錛屾槸鍥犱負瀹冨凡緇忔浜嗭紝鍚﹀垯鎬庝箞鍙?Zombie錛堝兊灝革級鍛紵鍐ら瓊涓嶆暎錛岃嚜鐒舵槸鐢熷墠鏈夌粨鏈В涔嬫晠銆傚湪UNIX/Linux涓紝姣忎釜榪涚▼閮芥湁涓涓埗榪涚▼錛岃繘紼嬪彿鍙玃ID錛圥rocess ID錛夛紝鐩稿簲鍦幫紝鐖惰繘紼嬪彿灝卞彨PPID錛圥arent PID錛夈傚綋榪涚▼姝諱骸鏃訛紝瀹冧細鑷姩鍏抽棴宸叉墦寮鐨勬枃浠訛紝鑸嶅純宸插崰鐢ㄧ殑鍐呭瓨銆佷氦鎹㈢┖闂寸瓑絳夌郴緇熻祫婧愶紝鐒跺悗鍚戝叾鐖惰繘紼嬭繑鍥炰竴涓鍑虹姸鎬佸鹼紝鎶ュ憡姝昏銆傚鏋滅▼搴忔湁 bug錛屽氨浼氬湪榪欐渶鍚庝竴姝ュ嚭闂銆傚効瀛愯鎴戞浜嗭紝鑰佸瓙鍗存病鍚錛屾病鏈夊強鏃舵敹媯哄叆孌擄紝鍎垮瓙渚挎垚浜嗗兊灝搞傚湪UNIX/Linux涓秷鐏兊灝哥殑鎵嬫姣旇緝孌嬪繊錛屾墽琛?ps axjf 鎵懼嚭鍍靛案榪涚▼鐨勭埗榪涚▼鍙鳳紙PPID錛岀涓鍒楋級錛屽厛鏉鍏剁埗錛岀劧鍚庡啀鐢辮繘紼嬪ぉ瀛?init錛堝叾PID涓?錛孭PID涓?錛夋潵涓璧鋒敹鎷劇埗瀛愬兊灝革紝瓚呭害浜¢瓊錛屽線鐢熸瀬涔愩傛敞鎰忥紝瀛愯繘紼嬪彉鎴愬兊灝稿彧鏄鐪艱屽凡錛屽茍涓嶇浜嬶紝濡傛灉鍍靛案鐨勭埗榪涚▼褰撳墠鏈夎鍔″湪韜紝鍒欏崈涓囦笉鍙錘鐒舵潃涔嬨?/p>