linux 程序和執行緒
2011-10-16 8:43:00
了解linux的程序與執行緒
* 程序狀態
task_running //執行
task_interruptible //程序可接收os訊號。
task_uninterruptible //此時程序不接收os訊號。
task_zombie //程序結束,資源釋放,程序描述符還未釋放。
task_stopped //程序停止執行
* kernel space and user space
kernel space 是供核心,裝置驅動執行的記憶體區域。
user space 是供普通應用程式執行的區域。
pmap -x 檢視程序的記憶體占用資訊;
lsof -a -p 檢視程序開啟的檔案資訊。
ps -lf 檢視程序的執行緒數。
* 程序建立
fork程序建立。建立後子程序和父程序指向同一記憶體區域,僅當子程序有write發生時候,才會把改動的區域copy到子程序新的位址空間。
* linux的執行緒實現
linux執行緒是通過程序來實現。linux kernel為程序建立提供乙個clone()系統呼叫,clone的引數包括如 clone_vm, clone_files, clone_sighand 等。通過clone()的引數,新建立的程序,也稱為lwp(lightweight process)與父程序共享記憶體空間,檔案控制代碼,訊號處理等,從而達到建立執行緒相同的目的。
linux 2.6的執行緒庫叫nptl(native posix thread library)。posix thread(pthread)是乙個程式設計規範,通過此規範開發的多執行緒程式具有良好的跨平台特性。儘管是基於程序的實現,但新版的nptl建立執行緒的效率非常高。在linux 2.6之前,linux kernel並沒有真正的thread支援,一些thread library都是在clone()基礎上的一些基於user space的封裝,因此通常在訊號處理、程序排程(每個程序需要乙個額外的排程執行緒)及多執行緒之間同步共享資源等方面存在一定問題。nptl的實現是在kernel增加了futex(fast userspace mutex)支援用於處理執行緒之間的sleep與wake。futex是一種高效的對共享資源互斥訪問的演算法。kernel在裡面起仲裁作用,但通常都由程序自行完成。
nptl是乙個1×1的執行緒模型,即乙個執行緒對於乙個作業系統的排程程序,優點是非常簡單。而其他一些作業系統比如solaris則是mxn的,m對應建立的執行緒數,n對應作業系統可以執行的實體。(n
* 訊號
程序接收訊號有兩種:同步和非同步。同步訊號比如segill(非法訪問), sigsegv(segmentation fault)等。發生此類訊號之後,系統會立即轉到核心陷阱處理程式
,因此同步訊號也稱為陷阱。非同步訊號如kill, lwp_kill, sigsend等呼叫產生的都是,非同步訊號也稱為中斷。
kill 呼叫的是 sigterm, 此訊號可以**獲和忽略。
kill -9 呼叫的是 sigkill, 殺掉程序,不能**獲和忽略。
2、linux下檢視程序和執行緒的命令
2.1 ps aux |less //顯示當前里程快照 a表所有,u表使用者,less表示分屏顯示
2.2 ps aux | grep pid //列出某程序的詳細資訊
2.3 ps -m //檢視系統中所有的執行緒
2.4 top -hknump //動態顯示系統中的程序 h表幫助,k表殺死,n表程序數 u表按使用者,m表按記憶體,p表按cpu
理解程序和執行緒
很多同學都聽說過,現代作業系統比如mac os x,unix,linux,windows等,都是支援 多工 的作業系統。什麼叫 多工 呢?簡單地說,就是作業系統可以同時執行多個任務。打個比方,你一邊在用瀏覽器上網,一邊在聽 一邊在用word趕作業,這就是多工,至少同時有3個任務正在執行。還有很多任務...
程序和執行緒簡單理解
執行緒可以有效地提高系統的執行效率,但並不是在所有計算機系統中都是適用的,如某些很少做程序排程和切換的實時系統。使用執行緒的好處是有多個任務需要處理機處理時,減少處理機的切換時間 而且,執行緒的建立和結束所需要的系統開銷也比程序的建立和結束要小得多。最適用使用執行緒的系統是多處理機系統和網路系統或分...
程序和執行緒通俗理解
cpu 工廠 一次只能有乙個車間開工 cpu一次只能執行乙個任務 程序就好比工廠的車間,它代表cpu所能處理的單個任務。任一時刻,cpu總是執行乙個程序,其他程序處於非執行狀態 乙個車間裡,可以有很多任務人。他們協同完成乙個任務。執行緒就好比車間裡的工人。乙個程序可以包括多個執行緒 車間的空間是工人...