Ads 468x60px

##EasyReadMore##

01 8月, 2011

多執行緒 (Multi-Thread)程式設計

Program,Process,Thread
在介紹Thread之前,我們必須先把Program和Process這兩個觀念作一個釐清。
Program:一群程式碼的集合,用以解決特定的問題。以物件導向的觀念來類比,相當於Class。
Process:由Program所產生的執行個體,一個Program可以同時執行多次,產生多個Process。以物件導向的觀念來類比,相當於Object。每一個Process又由以下兩個東西組成
一個Memory Space。相當於Object的variable,不同Process的Memory Space也不同,彼此看不到對方的Memory Space。
一個以上的Thread。Thread代表從某個起始點開始(例如main),到目前為止所有函數的呼叫路徑,以及這些呼叫路徑上所用到的區域變數。當然程式的執行狀態,除了紀錄在主記憶體外,CPU內部的暫存器(如Program Counter, Stack Pointer, Program Status Word等)也需要一起紀錄。所以Thread又由下面兩項組成
Stack:紀錄函數呼叫路徑,以及這些函數所用到的區域變數
目前CPU的狀態
由上面的描述中,我們在歸納Thread的重點如下
一個Process可以有多個Thread。
同一個Process內的Thread使用相同的Memory Space,但這些Thread各自擁有其Stack。換句話說,Thread能透過reference存取到相同的Object,但是local variable卻是各自獨立的。
作業系統會根據Thread的優先權以及已經用掉的CPU時間,在不同的Thread作切換,以讓各個Thread都有機會執行。
不同的應用程式,在作業系統中是以處理序 (Process) 做為分隔,讓不同的應用程式間不會相互干擾,我們從 Windows 工作管理員可以看到幾個頁籤,其中「應用程式」頁是指有視窗的應用程式,「處理程序」頁則列出所有正在執行的處理序。執行緒 (Thread) 是作業系統分配處理器 (CPU) 時間的基本單元,也就是當應用程式在執行時是經由執行緒向作業系統申請處理器的使用權。因為同一時間一個處理器只能給一個執行緒使用,作業系統中所有正在執行的處理序所建立的所有執行緒需要使用處理器時,會在一個佇列中等候作業系統分配可用的處理器時間,當執行緒使用處理器的時間量超過限額時就會暫止,由佇列中下一個執行緒繼續使用。每段時間量的長度視作業系統和處理器而定,由於這是一個極短的時間,例如每一個執行緒使用10毫秒,1秒鐘就會有100個執行緒次被執行,因此即使只有一個處理器,看起來就像多個執行緒同時在執行一樣,但終究和多工有所不同,多工是指不管把時間細分到多小都還是同時執行。執行緒的內容包含其主處理序的位址空間中能順利繼續執行所需的所有資訊,包括一組 CPU 暫存器和堆疊。每個執行緒會維護例外處理常式 (Exception Handler)、排程優先權,以及系統用來在執行緒排程之前儲存其內容的一組結構。
一個處理序可同時使用多個執行緖,那什麼時候應該使用多執行緒呢?使用多執行緒最大的好處在於讓工作同時開工,如果我們使用單一執行緒執行一段會耗時很久的程式碼,這段時間無法經由使用者介面得到回應,這對使用者而言是很不愉快的經驗,不知道到底是當機還是仍在作業中,也無法取消工作(除非直接結束應用程式)。如果使用多執行緒,就能讓一個執行緒儘量保持在閒置狀態以便快速回應使用者,另一方面又可以同時在其他執行緒進行作業,如果再搭配執行進度的回報,使用者就可以清楚地知道到底進行了多少工作,還有多少工作未完成。使用多執行緒另一個可能得到的好處是可以節省無謂的等待時間
對程式開發者而言,使用多執行緒不容易控制程式碼的執行流程,容易發生錯誤且偵錯不易,不小心還會造成執行緒相互封鎖而形成死結。使用多執行緒有優點也有缺點,如何決定是否該使用多執行緒呢?我認為一開始應該優先考慮使用單一執行緒,確認程式可以按步就班正確執行,如果其中有某些工作耗時特別久,首先應該檢討演算法有無改進的空間,有時使用不同的演算法可以得到大幅的改善,從數十分鐘縮短成數十秒鐘。如果仍無法有效縮短工作時間,且這些工作與使用者介面使用相同的執行緒,那最好是另外建立一個背景執行緒來執行這些工作,讓使用者介面可以繼續回應,否則使用者等了很久看到程式仍無回應,恐怕沒耐心繼續等下去,直接就把應用程式結束掉了。最後,嘗試找出這些工作中可以並行處理的部份,再從背景執行緒建立多個執行緒讓這些小工作同時開工,如果程式執行時期的外在環境允許,這些小工作就有可能同時並行達到縮短工時的效果。
來源:
http://marlon.blog.ithome.com.tw/post/894/23101
http://programming.im.ncnu.edu.tw/J_Chapter9.htm

2 意見:

  1. 嗯 ~ 同一個process裡的多個thread意指~~它們可以共用程式空間,但資料空間是有區隔的,這是thread比process輕量的原因之一,另一個好處thread之間共享某塊記憶體,通常要比process容易些,而且較不花費cpu的資源。

    一個舉例是: 一個.exe檔案執行100次,那記憶體裡面會佔用100份資料空間,100份程式空間,例如果是100個thread,就只會有100份資料空間,1份程式空間,省記憶體。

    回覆刪除

 
Blogger Templates