2013年1月28日 星期一

多執行緒

處理序(Process)

不同的應用程式,在作業系統中是以處理序 (Process) 做為分隔,讓不同的應用程式間不會相互干擾,我們從 Windows 工作管理員可以看到幾個頁籤,其中「應用程式」頁是指有視窗的應用程式,「處理程序」頁則列出所有正在執行的處理序。

執行緒 (Thread): 
是作業系統分配處理器 (CPU) 時間的基本單元,也就是當應用程式在執行時是經由執行緒向作業系統申請處理器的使用權。因為同一時間一個處理器只能給一個執行緒使用,作業系統中所有正在執行的處理序所建立的所有執行緒需要使用處理器時,會在一個佇列中等候作業系統分配可用的處理器時間,當執行緒使用處理器的時間量超過限額時就會暫止,由佇列中下一個執行緒繼續使用。每段時間量的長度視作業系統和處理器而定,由於這是一個極短的時間,例如每一個執行緒使用10毫秒,1秒鐘就會有100個執行緒次被執行,因此即使只有一個處理器,看起來就像多個執行緒同時在執行一樣,但終究和多工有所不同,多工是指不管把時間細分到多小都還是同時執行。


一個處理序可同時使用多個執行緖,那什麼時候應該使用多執行緒呢?

使用多執行緒最大的好處在於讓工作同時開工,如果我們使用單一執行緒執行一段會耗時很久的程式碼,這段時間無法經由使用者介面得到回應。如果使用多執行緒,就能讓一個執行緒儘量保持在閒置狀態以便快速回應使用者,另一方面又可以同時在其他執行緒進行作業,如果再搭配執行進度的回報,使用者就可以清楚地知道到底進行了多少工作,還有多少工作未完成。
使用多執行緒另一個可能得到的好處是可以節省無謂的等待時間使用單一執行緒時,即使後面的步驟與前面的步驟互不相關,還是得等前面的執行完才能接下去做,使用多執行緒分頭辦事比較有效率,在同一時間內可以同時執行多項工作,自然可以花較少的時間。但這不意味只要使用多執行緒就能節省空等的時間,執行緒只是幫忙跑腿把工作交給處理器,有沒有多個閒置的處理器可以同時作業?再來,這些工作是不是真的要耗用很多處理器時間?還是短暫經手後交給其他主機的處理器或 I/O 裝置等,如果是後面這種情形,本機處理器多寡就不重要了,真正的執行者有沒有空閒才是關鍵,如果不同的執行緒送交的工作最後還是找上同一個執行工作者,還是沒有辦法同時執行,就達不到縮短工時的效果了。所以使用多執行緒只能讓工作同時啟動,要工作能真的同時並行才能有效縮短工時。