標籤:cat back buffer sig buffers cached 簡單的 多少 ace
在平時工作中,經常會聽到應用程式的進程和線程的概念,那麼它們兩個之間究竟有什麼關係或不同呢?
一、深入理解進程和線程的區別
1)兩者概念
進程是具有一定獨立功能的程式關於某個資料集合上的一次運行活動,進程是系統進行資源分派和調度的一個獨立單位.
線程是指進程內的一個執行單元,也是進程內的可調度實體. 線程是CPU調度和指派的基本單位,它是比進程更小的能獨立啟動並執行基本單位線程自己基本上不擁有系統資源,只擁有一點
在運行中必不可少的資源(如程式計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共用進程所擁有的全部資源.
2)兩者關係
一個線程可以建立和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行.
相對進程而言,線程是一個更加接近於執行體的概念,它可以與同進程中的其他線程共用資料,但擁有自己的棧空間,擁有獨立的執行序列。
3)兩者區別
進程和線程的主要差別在於它們是不同的作業系統資源管理方式:進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響;而線程只是一個進程中的不同執行路徑。
線程有自己的堆棧和局部變數,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程式要比多線程的程式健壯,但在進程切換時,耗費資源較大,效率要差
一些。但對於一些要求同時進行並且又要共用某些變數的並行作業,只能用線程,不能用進程。
進程和線程的區別:
. 地址空間:線程是進程內的一個執行單元;進程至少有一個線程;它們共用進程的地址空間;而進程有自己獨立的地址空間;
. 資源擁有:進程是資源分派和擁有的單位,同一個進程內的線程共用進程的資源
. 線程是處理器調度的基本單位,但進程不是.
. 進程和線程二者均可並發執行.
. 簡而言之,一個程式至少有一個進程,一個進程至少有一個線程.
. 線程的劃分尺度小於進程,使得多線程程式的並發性高。
. 另外,進程在執行過程中擁有獨立的記憶體單元,而多個線程共用記憶體,從而極大地提高了程式的運行效率。
. 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程式啟動並執行入口、順序執行序列和程式的出口。但是線程不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個線程執行控制。
. 從邏輯角度來看,多線程的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分派。這就是進程和線程的重要區別。
4)優缺點
線程和進程在使用上各有優缺點:
. 線程執行開銷小,但不利於資源的管理和保護;而進程正相反。
. 線程適合於在SMP機器上(即對稱式多處理結構的簡稱,是指在一個電腦上彙集了一組處理器(多CPU),各CPU之間共用記憶體子系統以及匯流排結構)運行,而進程則可以跨機器遷移。
二、如何查看某一進程的線程數
有些時候需要確定進程內部當前運行了多少線程,查詢方法如下: 1)通過pstree命令(根據pid)進行查詢:[[email protected]_web2 ~]# ps -ef|grep java //尋找進程pid(比如這裡尋找java(tomcat)進程的pid)[[email protected]_web2 ~]# pstree -p 19135java(19135)─┬─{java}(19136) ├─{java}(19137) ....... └─{java}(13578)[[email protected]_web2 ~]# pstree -p 19135|wc -l46 //由於第一行包括了2個線程,所以該進程下一共有47個線程! 或者使用top命令查看(可以查看到線程情況)[[email protected]_web2 ~]# top -Hp 19135 //下面結果中的Tasks 對應的47即是線程的個數 top - 14:05:55 up 391 days, 20:59, 1 user, load average: 0.00, 0.00, 0.00Tasks: 47 total, 0 running, 47 sleeping, 0 stopped, 0 zombieCpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stMem: 8058056k total, 7718656k used, 339400k free, 354216k buffersSwap: 0k total, 0k used, 0k free, 4678160k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 19135 root 20 0 5339m 632m 5476 S 0.0 8.0 0:00.00 java 19136 root 20 0 5339m 632m 5476 S 0.0 8.0 0:00.84 java ...... 2)根據ps命令直接查詢:[[email protected]_web2 ~]# ps hH p 19135| wc -l47 3)通過查看/proc/pid/statusproc偽檔案系統,它駐留在/proc目錄,這是最簡單的方法來查看任何活動進程的線程數。/proc目錄以可讀文字檔形式輸出,提供現有進程和系統硬體相關的資訊如CPU、中斷、記憶體、磁碟等等。 [[email protected]_web2 ~]# cat /proc/19135/statusName: javaState: S (sleeping)Tgid: 19135Pid: 19135PPid: 1TracerPid: 0........Threads: 47 //這裡顯示的是進程建立的匯流排程數。輸出表明該進程有47個線程。SigQ: 1/62793SigPnd: 0000000000000000ShdPnd: 0000000000000000.......voluntary_ctxt_switches: 1nonvoluntary_ctxt_switches: 1 或者,也可以在/proc//task中簡單的統計子目錄的數量,如下所示:[[email protected]_web2 ~]# ll /proc/19135/task總用量 0dr-xr-xr-x 6 root root 0 6月 14 17:57 11553......[[email protected]_web2 ~]# ll /proc/19135/task|wc -l48 這是因為,對於一個進程中建立的每個線程,在/proc/<pid>/task中會建立一個相應的目錄,命名為其線程ID。由此在/proc/<pid>/task中目錄的總數表示在進程中線程的數目。
Linux下進程與線程的區別及查詢方法