Program, Process, Thread之間的差異~

在程式領域,我還是自認我是一位beginner,今天就來開網誌,把我所遇所學的問題記錄下來!
第一篇文,先來記錄一些比較簡單的東西吧!
往後陸續要記錄一些平常一知半解的東西(ex: 記憶體的 RAM vs ROM)


 

首先,先釐清Program與Process之間的關係

Program可以說是一群程式碼的集合,用以解決特定的問題,若以物件導向的觀念來比擬,就相當於Class的功能;而Process則是由Program所產生的執行個體(或稱做處理序、進程),一個Program可以同時執行多次,產生多個Process,再以物件導向的觀念來比擬的話,就相當於用了此類別new 了一個新的object實體。每一個Process又由以下兩個東西組成,一個是Memory Space,相當於object的variables,不同Process的Memory Space也不同,彼此看不到對方的Memory Space,代表著各自的local variables 是不能互相通用的;另一個則是”一個以上的Thread”,這就是我第二個想講的東西,Process與Thread之間的關係。

執行緒(Thread,或稱作線程)是作業系統能夠進行運算排程的最小單位,被包含在處理序(Process)中,在進代作業系統中,被設計為Process中的實際運作單位。而Thread又由下面兩項組成,Stack(紀錄函數的呼叫路徑,以及這些函數所用到的區域變數)以及目前CPU的狀態。

由上面的描述中,可以歸納Thread的重點如下:

  1. 一個Process可以有多個Thread。
  2. 同一個Process內的Thread使用相同的Memory Space,但這些Thread各自擁有其Stack。換句話說,Thread能透過reference存取到相同的object,但是local variable卻是各自獨立的。
  3. 現代的作業系統會根據Process的優先權,分別讓各個Process佔據CPU一段時間,以讓各個Process都有機會執行;而Process又會根據Thread的優先權以及已經用掉的CPU時間,在不同的Thread作切換,以讓各個Thread都有機會執行。

我就以瀏覽器的分頁以及下載資料來舉例吧:

Firefox 單獨只有firefox.exe這個Process(可能還有另外一個plugin-container.exe),所有分頁是用Multi-Thread完成;而 Chrome 則是每個分頁都相當於一個執行個體(Multi-Process),所以 Firefox 崩潰通常都是整個Process崩潰(plugin-container.exe 可能還活著),而 Chrome 則透過Multi-Process的方式避免一個分頁出問題,導致整個程序都出問題,當然相對Multi-Thread來說Multi-Process開發上會比較麻煩,這也就是為什麼Chrome很吃資源的原因之一。

另一個例子就是,當你使用瀏覽器開啟一個分頁,從這個頁面下載多個檔案的時候,代表著同時有好幾個Thread分別在背後處理下載資料的動作,假設目前只有單一個Thread,則你只能同時間下載一個檔案,而且你的瀏覽器使用者介面還會因此當機無法回應!(因為回應使用者的UI Thread跑去為你下載資料了),這也是為什麼大部分的應用程式都會使用Multi-Thread的原因。


這篇就先介紹到這邊,不過有一個問題我實在是滿好奇的,我知道在Multi-Thread的應用程式開發當中,要很小心地避免Thread之間"同時"存取同一個變數,所以我經常在Multi-Thread的應用當中使用lock來鎖住執行緒,不過lock也有另一個問題,就是有可能會導致"死結Deadlock",但筆者經驗不多,倒是還沒真正遇到過這個問題,這部分等到我真的遇到了以後,再繼續往下寫吧。

BTW,筆者才疏學淺,以上若有錯誤,請不吝糾正。