基礎知識——線程和進程的定義及區別

區別:
線程(threads, 臺灣稱 執行緒),也被稱爲輕量進程(lightweight processes)。計算機科學術語,指運行中的程序的調度單位。

線程是進程中的實體,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程不擁有系統資源,只有運行必須的一些數據結構;它與父進程的其它線程共享該進程所擁有的全部資源。線程可以創建和撤消線程,從而實現程序的併發執行。一般,線程具有就緒、阻塞和運行三種基本狀態。

在多中央處理器的系統裏,不同線程可以同時在不同的中央處理器上運行,甚至當它們屬於同一個進程時也是如此。大多數支持多處理器的操作系統都提供編程接口來讓進程可以控制自己的線程與各處理器之間的關聯度(affinity)。

 

進程的概念
          談到進程時,還要涉及到線程的概念。進程是指在系統中正在運行的一個應用程序;線程是系統分配處理器時間資源的基本單元,或者說進程之內獨立執行的一個單元。對於操 作系統而言,其調度單元是線程。一個進程至少包括一個線程,通常將該線程稱爲主線程。一個進程從主線程的執行開始進而創建一個或多個附加線程,就是所謂基於多線程的多任務。
  那進程與線程的區別到底是什麼?進程是執行程序的實例。例如,當你運行記事本程序(Nodepad)時,你就創建了一個用來容納組成Notepad.exe的代碼及其所需調用動態鏈接庫的進程。每個進程均運行在其專用且受保護的地址空間內。因此,如果你同時運行記事本的兩個拷貝,該程序正在使用的數據在各自實例中是彼此獨立的。在記事本的一個拷貝中將無法看到該程序的第二個實例打開的數據。
  我這裏以沙箱爲例進行闡述。一個進程就好比一個沙箱。線程就如同沙箱中的孩子們。孩子們在沙箱子中跑來跑去,並且可能將沙子攘到別的孩子眼中,他們會互相踢打或撕咬。但是,這些沙箱略有不同之處就在於每個沙箱完全由牆壁和頂棚封閉起來,無論箱中的孩子如何狠命地攘沙,他們也不會影響到其它沙箱中的其他孩子。因此,每個進程就象一個被保護起來的沙箱。未經許可,無人可以進出。
  實際上線程運行而進程不運行。兩個進程彼此獲得專用數據或內存的唯一途徑就是通過協議來共享內存塊。這是一種協作策略。下面讓我們分析一下任務管理器裏的進程選項卡。
  這裏的進程是指一系列進程,這些進程是由它們所運行的可執行程序實例來識別的,這就是進程選項卡中的第一列給出了映射名稱的原因。請注意,這裏並沒有進程名稱列。進程並不擁有獨立於其所歸屬實例的映射名稱。換言之,如果你運行5個記事本拷貝,你將會看到5個稱爲Notepad.exe的進程。它們是如何彼此區別的呢?其中一種方式是通過它們的進程ID,因爲每個進程都擁有其獨一無二的編碼。該進程ID由Windows NT或Windows 2000生成,並可以循環使用。因此,進程ID將不會越編越大,它們能夠得到循環利用。
  
  第三列是被進程中的線程所佔用的CPU時間百分比。它不是CPU的編號,而是被進程佔用的CPU時間百分比。此時我的系統基本上是空閒的。儘管系統看上去每一秒左右都只使用一小部分CPU時間,但該系統空閒進程仍舊耗用了大約99%的CPU時間。
  
  第四列,CPU時間,是CPU被進程中的線程累計佔用的小時、分鐘及秒數。請注意,我對進程中的線程使用佔用一詞。這並不一定意味着那就是進程已耗用的CPU時間總和,因爲,如我們一會兒將看到的,NT計時的方式是,當特定的時鐘間隔激發時,無論誰恰巧處於當前的線程中,它都將計算到CPU週期之內。通常情況下,在大多數NT系統中,時鐘以10毫秒的間隔運行。每10毫秒NT的心臟就跳動一下。有一些驅動程序代碼片段運行並顯示誰是當前的線程。讓我們將CPU時間的最後10毫秒記在它的帳上。因此,如果一個線程開始運行,並在持續運行8毫秒後完成,接着,第二個線程開始運行並持續了2毫秒,這時,時鐘激發,請猜一猜這整整10毫秒的時鐘週期到底記在了哪個線程的帳上?答案是第二個線程。因此,NT中存在一些固有的不準確性,而NT恰是以這種方式進行計時,實際情況也如是,大多數32位操作系統中都存在一個基於間隔的計時機制。請記住這一點,因爲,有時當你觀察線程所耗用的CPU總和時,會出現儘管該線程或許看上去已運行過數十萬次,但其CPU時間佔用量卻可能是零或非常短暫的現象,那麼,上述解釋便是原因所在。上述也就是我們在任務管理器的進程選項卡中所能看到的基本信息列。

發佈了11 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章