1. linux 進程回收線程資源指哪些資源
Linux系統中程序的線程資源是有限的,表現為對於一個程序其能同時運行的線程數是有限的。而默認的條件下,一個線程結束後,其對應的資源不會被釋放,於是,如果在一個程序中,反復建立線程,而線程又默認的退出,則最終線程資源耗盡,進程將不再能建立新的線程。
解決這個問題,有2種方式,系統自動釋放線程資源,或者由另一個線程釋放該線程資源。
注意,在這里,我認為進程運行後,本身,也是一個線程,主線程,主線程和主線程建立的線程共享進程資源。不同於其他線程,在於主線程運行結束後,程序退出,所有程序建立的線程也會退出。
系統自動釋放
如果想在線程結束時,由系統釋放線程資源,則需要設置線程屬性為detach。
代碼上,可以這樣表示:
pthread_t t;
pthread_attr_t a; //線程屬性
pthread_attr_init(&a); //初始化線程屬性
pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED); //設置線程屬性
::pthread_create( &t, &a, GetAndSaveAuthviewSDRStub, (void*)lp); //建立線程
其他線程釋放
另一種方式,則是由另一個線程將該資源釋放。
代碼上,可以這樣表示:
pthread_t t;
::pthread_create( NULL, NULL, GetAndSaveAuthviewSDRStub, (void*)lp);
::pthread_join( t);
::pthread_join( t)等待線程t退出,並釋放t線程所佔用的資源。當然,這里也有個同步的功能,使一個線程等待另一個線程退出,然後才繼續運行。
linux線程執行和windows不同,pthread有兩種狀態joinable狀態和unjoinable狀態,如果線程是joinable狀態,當線程函數自己返回退出時或pthread_exit時都不會釋放線程所佔用堆棧和線程描述符(總計8K多)。只有當你調用了pthread_join之後這些資源才會被釋放。
若是unjoinable狀態的線程,這些資源在線程函數退出時或pthread_exit時自動會被釋放。
unjoinable屬性可以在pthread_create時指定,或在線程創建後在線程中pthread_detach自己,如:pthread_detach(pthread_self()),將狀態改為unjoinable狀態,確保資源的釋放。或者將線程置為joinable,然後適時調用pthread_join.
在程序運行中檢查/proc/ <pid> /maps文件,若看到大概8K左右的很多虛擬內存碎片,基本上可以確認是線程資源泄漏造成的300個線程後pthread_create失敗。
不知是否因為自己,先對要創建的線程做了以下屬性設定,
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
然後又在線程函數中使用
pthread_detach(pthread_self());
兩段代碼作用有沖突。
===============================================================================
pthread_detach(threadid)和pthread_detach(pthread_self())的區別應該是調用他們的線程不同,沒其他區別。
pthread_detach(threadid)函數的功能是使線程ID為threadid的線程處於分離狀態,一旦線程處於分離狀態,該線程終止時底層資源立即被回收;否則終止子線程的狀態會一直保存(佔用系統資源)直到主線程調用pthread_join(threadid,NULL)獲取線程的退出狀態。
通常是主線程使用pthread_create()創建子線程以後,一般可以調用pthread_detach(threadid)分離剛剛創建的子線程,這里的threadid是指子線程的threadid;如此以來,該子線程止時底層資源立即被回收;
被創建的子線程也可以自己分離自己,子線程調用pthread_detach(pthread_self())就是分離自己,因為pthread_self()這個函數返回的就是自己本身的線程ID。
2. linux內存回收的三種方式
1. 快速內存回收:處於get_page_from_freelist()函數中,在遍歷zonelist過程中,對每個zone都在分配前進行判斷,如果分配後zone的空閑內存數量 < 閥值 + 保留頁框數量,那麼此zone就會進行快速內存回收。其中閥值可能是min/low/high的任何一種,因為在快速內存分配,慢速內存分配和oom分配過程中如果回收的頁框足夠,都會調用到get_page_from_freelist()函數,所以快速內存回收不僅僅發生在快速內存分配中,在慢速內存分配過程中也會發生。
2. 直接內存回收:處於慢速分配過程中,直接內存回收只有一種情況下會使用,在慢速分配中無法從zonelist的所有zone中以min閥值分配頁框,並且進行非同步內存壓縮後,還是無法分配到頁框的時候,就對zonelist中的所有zone進行一次直接內存回收。注意,直接內存回收是針對zonelist中的所有zone的,它並不像快速內存回收和kswapd內存回收,只會對zonelist中空閑頁框不達標的zone進行內存回收。在直接內存回收中,有可能喚醒flush內核線程。
3. kswapd內存回收:發生在kswapd內核線程中,每個node有一個swapd內核線程,也就是kswapd內核線程中的內存回收,是只針對所在node的,並且只會對分配了order頁框數量後空閑頁框數量 < 此zone的high閥值 + 保留頁框數量的zone進行內存回收,並不會對此node的所有zone進行內存回收。
3. linux鏉姝昏繘紼嬪懡浠killlinux鏉姝昏繘紼
linuxkill鏉涓嶆帀榪涚▼錛
linux榪涚▼kill涓嶆帀
涓鏄榪涚▼宸茬粡鎴愪負鍍墊昏繘紼,褰撳畠鐨勭埗榪涚▼灝嗗畠鍥炴敹鎴栧皢瀹冪殑鐖惰繘紼媖ill鎺夊嵆鍙鍦╬s杈撳嚭鐪嬩笉鍒頒簡;
浜屾槸榪涚▼姝e勫湪鍐呮牳鐘舵佷腑,Linux榪涚▼榪愯屾椂鍒嗗唴鏍稿拰鐢ㄦ埛涓ょ嶇姸鎬,褰撹繘紼嬭繘鍏ュ唴鏍哥姸鎬佸悗,浼氬睆钄芥墍鏈変俊鍙,鍖呮嫭SIGKIL,鎵浠ヨ繖涓鏃跺檏ill-9涔熷彉寰楁棤鏁堜簡銆
濡備綍kill鏉鎺塴inux緋葷粺涓鐨勫兊灝竏efunct榪涚▼錛
鎵懼埌璇defunct鍍靛案榪涚▼鐨勭埗榪涚▼錛屽皢璇ヨ繘紼嬬殑鐖惰繘紼嬫潃鎺夛紝鍒欐defunct榪涚▼灝嗚嚜鍔ㄦ秷澶
linux濡備綍鏌ヨ繘紼嬶紝鏉榪涚▼錛岄噸鍚榪涚▼錛
鏌ユ壘榪涚▼ps-ef|grep-vgrep|grep"XXXXX"鏉榪涚▼kill-9`ps-ef|grep-vgrep|grepXXXXX|awk'{print$2}'`閲嶈搗serviceXXXXrestart
濡備綍鏉鎺塋inux涓鐨勫兊灝歌繘紼嬶紵
1銆佷嬌鐢╰op鍛戒護灝卞彲浠ユ煡鐪嬪埌鍍靛案榪涚▼銆
2銆佹煡鐪嬪叿浣撹繘紼媝id#ps-A-ostat,ppid,pid,cmd|grep-e"^"璇存槑錛氫笉鏄鏌ヤ笉鍑哄兊灝歌繘紼嬶紝鏄鍥犱負鎴戦噸鍚浜嗙郴緇燂紝娌℃湁鍍靛案榪涚▼銆
3銆佹潃姝誨兊灝歌繘紼#kill-9pid鍙
4. Linux到底有沒有回收站
linux下的回收站在每一個當前用戶目錄./local/share/Trash中。
也可以給linux添加一個回收站。
mkdir /tmp/trash_tmp 建立一個回收站目錄
vi /bin/trash 編輯一個文件
mv $@ /tmp/trash_tmp
:wq 保存退出
alias rm=/bin/trash添加別名
vi /etc/bashrc
在最後一行添加alias rm=/bin/trash
chmod 755 /bin/trash
chmod 777 /tmp/trash_tmp
source /etc/bashrc 啟用環境變數
如果要真的刪除某個文件的時候用 /bin/rm -i file_name
這樣一來一個回收站就建立了,以後用rm的時候會自動的將file_name 移動到/tmp/trash_tmp/目錄下
5. 在Linux編程中,父進程為什麼要等待並回收子進程的退出狀態不這樣做會有什麼後果
分幾種情況:
父進程永不退出:這種情況下若子進程退出,而父進程沒有收集子進程的退出狀態,則此子進程會變為僵屍進程,一直佔用少量資源,有危害;
父進程比子進程先退出:這種情況下父進程退出時,仍在運行的子進程會變為孤兒進程,孤兒進程會被託管給init進程,孤兒進程結束時由init進程負責回收;
父進程比子進程晚退出:子進程先退出時會變為僵屍進程,佔用少量資源;待到父進程再退出時,子進程由僵屍進程變為孤兒進程,init進程會回收這些已僵死的孤兒進程,則這些已經僵死的孤兒進程就能瞑目而去了;
6. linux鍐呭瓨鍥炴敹鐨勪笁縐嶆柟寮弆inux鍐呭瓨鍥炴敹
linux瀹炵幇涓誨瓨絀洪棿鐨勫垎閰嶄笌鍥炴敹錛
Linux緋葷粺閫氳繃鍛戒護malloc鍜宖ree鏉ュ垎閰嶅拰閲婃斁涓誨瓨絀洪棿銆
Linux鐢ㄦ埛榪涚▼鏄濡備綍閲婃斁鍐呭瓨鐨勶紵
濡傛灉鍐呭瓨澶燂紝榪涚▼涓嶅幓涓誨姩鍥炴敹錛屽唴瀛樻槸涓嶄細閲婃斁鐨凩inux緋葷粺鐨勭紦瀛樻満鍒舵槸鐩稿綋鍏堣繘鐨勶紝浠栦細閽堝筪entry錛堢敤浜嶸FS錛屽姞閫熸枃浠惰礬寰勫悕鍒癷node鐨勮漿鎹錛夈丅ufferCache錛堥拡瀵圭佺洏鍧楃殑璇誨啓錛夊拰PageCache錛堥拡瀵規枃浠秈node鐨勮誨啓錛夎繘琛岀紦瀛樻搷浣溿
浣嗘槸鍦ㄨ繘琛屼簡澶ч噺鏂囦歡鎿嶄綔涔嬪悗錛岀紦瀛樹細鎶婂唴瀛樿祫婧愬熀鏈鐢ㄥ厜銆備絾瀹為檯涓婃垜浠鏂囦歡鎿嶄綔宸茬粡瀹屾垚錛岃繖閮ㄥ垎緙撳瓨宸茬粡鐢ㄤ笉鍒頒簡銆
linux涓璳helper榪涚▼鏄浠涔堬紵
1.khelper鏄灞炰簬鍐呮牳甯鍔╄繘紼
2.涓嬮潰鏄痩inux甯歌佽繘紼嬬殑浠嬬粛鍒楄〃
鍐呮牳綰跨▼綆$悊
鐢ㄤ簬榪涚▼鍦ㄤ笉鍚岀殑CPU闂磋縼縐
鍐呮牳璋冨害/綆$悊絎0涓狢PU杞涓鏂鐨勫畧鎶よ繘紼
綆$悊澶氭牳蹇
鍐呮牳璋冨害/綆$悊絎1涓狢PU杞涓鏂鐨勫畧鎶よ繘紼
澶勭悊鍐呮牳浜嬩歡瀹堟姢榪涚▼
澶勭悊鍐呮牳浜嬩歡瀹堟姢榪涚▼
鍦ㄦ瘡涓澶勭悊鍣ㄤ笂鍗曠嫭榪愯岃繘紼嬶紝閫氳繃鏂囦歡緋葷粺瀹炵幇
鍐呮牳甯鍔╄繘紼
緗戠粶浠跨湡鍣錛屾ā鎷熺綉緇滅幆澧
寮傛ュ姞瀵嗙$悊榪涚▼
鍖呯$悊
鐗規潈鍚屾ワ紝灝嗙紦鍐插尯鏂囦歡寮哄埗鍐欏叆紜鐩
JTAG璋冭瘯鍣ㄩ粯璁よ繘紼
鍐呮牳瀹屾暣鎬ф鏌
鍐呮牳瀹屾暣鎬ф鏌
綆$悊紓佺洏鍧楄誨啓
綆$悊紓佺洏鍧楄誨啓
楂樼駭閰嶇疆鍜岀數婧愮$悊鎺ュ彛
acpi榪涚▼鐨勯氱煡榪涚▼
acpi鐑鎻掓嫈綆$悊
ATA紜鐩樻帴鍙g$悊
ATA紜鐩樻帴鍙g$悊
ATA紜鐩樻帴鍙g$悊
鍐呮牳鐨剈sbhub
鍐呮牳綰跨▼
鍐呭瓨鍥炴敹錛岀『淇濈郴緇熺┖闂茬墿鐞嗗唴瀛樼殑鏁伴噺鍦ㄤ竴涓鍚堥傜殑鑼冨洿
浣滀負鍐呮牳涓鐨勫畧鎶よ繘紼嬪瓨鍦錛屽畠瀹氭湡鎵ц岄〉闈㈡壂鎻忥紝璇嗗埆鍓鏈欏甸潰騫跺悎騫跺壇鏈錛岄噴鏀捐繖浜涢〉闈浠ヤ緵瀹冪敤
浠f浛鐢ㄦ埛榪涚▼綆$悊io
浠f浛鐢ㄦ埛榪涚▼綆$悊io
鍔犲瘑緋葷粺
鎻愪緵鍔犲瘑瑙e瘑鐩稿叧鍑芥暟
鎻愪緵鍔犲瘑瑙e瘑鐩稿叧鍑芥暟
scsi璁懼
scsi璁懼
scsi璁懼
scsi璁懼
鍐呮牳榧犳爣鏀鎸
Ext3鏂囦歡緋葷粺鐨勬棩蹇楃$悊
Ext3鏂囦歡緋葷粺鐨勬棩蹇楃$悊
閲婃斁瀛樺偍鍦ㄧ紦瀛樺尯涓鐨勬暟鎹
閲婃斁瀛樺偍鍦ㄧ紦瀛樺尯涓鐨勬暟鎹
3.甯屾湜瀵逛綘鏈夋墍鏀惰幏銆