在平時工作中,經常會聽到應用程式的程序和線程的概念,那麼它們兩個之間究竟有什麼關系或不同呢?
一、對比程序和線程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<code>1)兩者概念</code>
<code>. 程序是具有一定獨立功能的程式關于某個資料集合上的一次運作活動,程序是系統進行資源配置設定和排程的一個獨立機關.</code>
<code>. 線程是指程序内的一個執行單元,也是程序内的可排程實體. 線程是CPU排程和分派的基本機關,它是比程序更小的能獨立運作的基本機關線程自己基本上不擁有系統資源,隻擁有一點</code>
<code> </code><code>在運作中必不可少的資源(如程式計數器,一組寄存器和棧),但是它可與同屬一個程序的其他的線程共享程序所擁有的全部資源.</code>
<code>2)兩者關系</code>
<code>. 一個線程可以建立和撤銷另一個線程;同一個程序中的多個線程之間可以并發執行.</code>
<code>. 相對程序而言,線程是一個更加接近于執行體的概念,它可以與同程序中的其他線程共享資料,但擁有自己的棧空間,擁有獨立的執行序列。</code>
<code>3)兩者差別</code>
<code>程序和線程的主要差别在于它們是不同的作業系統資源管理方式:程序有獨立的位址空間,一個程序崩潰後,在保護模式下不會對其它程序産生影響;而線程隻是一個程序中的不同執行路徑。</code>
<code>線程有自己的堆棧和局部變量,但線程之間沒有單獨的位址空間,一個線程死掉就等于整個程序死掉,是以多程序的程式要比多線程的程式健壯,但在程序切換時,耗費資源較大,效率要差</code>
<code>一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,隻能用線程,不能用程序。</code>
<code>程序和線程的差別:</code>
<code>. 位址空間:線程是程序内的一個執行單元;程序至少有一個線程;它們共享程序的位址空間;而程序有自己獨立的位址空間;</code>
<code>. 資源擁有:程序是資源配置設定和擁有的機關,同一個程序内的線程共享程序的資源</code>
<code>. 線程是處理器排程的基本機關,但程序不是.</code>
<code>. 程序和線程二者均可并發執行.</code>
<code>. 簡而言之,一個程式至少有一個程序,一個程序至少有一個線程.</code>
<code>. 線程的劃分尺度小于程序,使得多線程程式的并發性高。</code>
<code>. 另外,程序在執行過程中擁有獨立的記憶體單元,而多個線程共享記憶體,進而極大地提高了程式的運作效率。</code>
<code>. 線程在執行過程中與程序還是有差別的。每個獨立的線程有一個程式運作的入口、順序執行序列和程式的出口。但是線程不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個</code>
<code> </code><code>線程執行控制。</code>
<code>. 從邏輯角度來看,多線程的意義在于一個應用程式中,有多個執行部分可以同時執行。但作業系統并沒有将多個線程看做多個獨立的應用,來實作程序的排程和管理以及資源配置設定。這就</code>
<code> </code><code>是程序和線程的重要差別。</code>
<code>4)優缺點</code>
<code>線程和程序在使用上各有優缺點:</code>
<code>. 線程執行開銷小,但不利于資源的管理和保護;而程序正相反。</code>
<code>. 線程适合于在SMP機器上(即對稱多處理結構的簡稱,是指在一個計算機上彙集了一組處理器(多CPU),各CPU之間共享記憶體子系統以及總線結構)運作,而程序則可以跨機器遷移。</code>
二、如何檢視某個程序的線程數
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<code>有些時候需要确定程序内部目前運作了多少線程,查詢方法如下:</code>
<code>1)通過pstree指令(根據pid)進行查詢:</code>
<code>[root@xqsj_web2 ~]</code><code># ps -ef|grep java //查找程序pid(比如這裡查找java(tomcat)程序的pid)</code>
<code>[root@xqsj_web2 ~]</code><code># pstree -p 19135</code>
<code>java(19135)─┬─{java}(19136)</code>
<code> </code><code>├─{java}(19137)</code>
<code> </code><code>.......</code>
<code> </code><code>└─{java}(13578)</code>
<code>[root@xqsj_web2 ~]</code><code># pstree -p 19135|wc -l</code>
<code>46 </code><code>//</code><code>由于第一行包括了2個線程,是以該程序下一共有47個線程!</code>
<code>或者使用</code><code>top</code><code>指令檢視(可以檢視到線程情況)</code>
<code>[root@xqsj_web2 ~]</code><code># top -Hp 19135 //下面結果中的Tasks 對應的47即是線程的個數</code>
<code>top</code> <code>- 14:05:55 up 391 days, 20:59, 1 user, load average: 0.00, 0.00, 0.00</code>
<code>Tasks: 47 total, 0 running, 47 sleeping, 0 stopped, 0 zombie</code>
<code>Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.7%</code><code>id</code><code>, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st</code>
<code>Mem: 8058056k total, 7718656k used, 339400k </code><code>free</code><code>, 354216k buffers</code>
<code>Swap: 0k total, 0k used, 0k </code><code>free</code><code>, 4678160k cached</code>
<code> </code><code>PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND </code>
<code>19135 root 20 0 5339m 632m 5476 S 0.0 8.0 0:00.00 java </code>
<code>19136 root 20 0 5339m 632m 5476 S 0.0 8.0 0:00.84 java </code>
<code>......</code>
<code>2)根據</code><code>ps</code><code>指令直接查詢:</code>
<code>[root@xqsj_web2 ~]</code><code># ps hH p 19135| wc -l</code>
<code>47</code>
<code>3)通過檢視</code><code>/proc/pid/status</code>
<code>proc僞檔案系統,它駐留在</code><code>/proc</code><code>目錄,這是最簡單的方法來檢視任何活動程序的線程數。</code><code>/proc</code><code>目錄以可讀文本檔案形式輸出,提供現有程序和系統硬體</code>
<code>相關的資訊如CPU、中斷、記憶體、磁盤等等。</code>
<code>[root@xqsj_web2 ~]</code><code># cat /proc/19135/status</code>
<code>Name: java</code>
<code>State: S (sleeping)</code>
<code>Tgid: 19135</code>
<code>Pid: 19135</code>
<code>PPid: 1</code>
<code>TracerPid: 0</code>
<code>........</code>
<code>Threads: 47 </code><code>//</code><code>這裡顯示的是程序建立的總線程數。輸出表明該程序有47個線程。</code>
<code>SigQ: 1</code><code>/62793</code>
<code>SigPnd: 0000000000000000</code>
<code>ShdPnd: 0000000000000000</code>
<code>.......</code>
<code>voluntary_ctxt_switches: 1</code>
<code>nonvoluntary_ctxt_switches: 1</code>
<code>或者,也可以在</code><code>/proc//task</code><code>中簡單的統計子目錄的數量,如下所示:</code>
<code>[root@xqsj_web2 ~]</code><code># ll /proc/19135/task</code>
<code>總用量 0</code>
<code>dr-xr-xr-x 6 root root 0 6月 14 17:57 11553</code>
<code>[root@xqsj_web2 ~]</code><code># ll /proc/19135/task|wc -l</code>
<code>48</code>
<code>這是因為,對于一個程序中建立的每個線程,在</code><code>/proc/</code><code><pid></code><code>/task</code><code>中會建立一個相應的目錄,命名為其線程ID。由此在</code><code>/proc/</code><code><pid></code><code>/task</code><code>中目錄的總數表示在程序中線程的數目。</code>
***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************
本文轉自散盡浮華部落格園部落格,原文連結:http://www.cnblogs.com/kevingrace/p/5252919.html,如需轉載請自行聯系原作者