單線程和多線程的優缺點
多執行緒的優點
同步應用程式的開發比較容易,但由於需要在上一個任務完成後才能開始新的任務,所以其效率通常比多線程應用程式低。如果完成同步任務所用的時間比預計時間長,應用程式可能會不響應。多執行緒可以同時運行多個過程。例如,文文書處理器應用程式在您處理文檔的同時,可以檢查拼字(作為單獨的任務)。由於多線程應用程式將程式劃分成獨立的任務,因此可以在以下方面顯著提高效能:
多線程技術使程式的響應速度更快,因為使用者介面可以在進行其他工作的同時一直處於活動狀態。
當前沒有進行處理的任務可以將處理器時間讓給其他任務。
佔用大量處理時間的任務可以定期將處理器時間讓給其他任務。
可以隨時停止任務。
可以分別設定各個任務的優先順序以最佳化效能。
是否需要建立多線程應用程式取決於多個因素。在以下情況下,最適合採用多執行緒:
耗時或大量佔用處理器的任務阻塞使用者介面操作。
各個任務必須等待外部資源(如遠程檔案或 INTERNET 串連)。
例如,用於跟蹤 WEB 頁上的連結並下載滿足特定條件的檔案的 INTERNET 應用程式“ROBOT”。這種應用程式可以依次同步下載各個檔案,也可以使用多線程同時下載多個檔案。多線程方法比同步方法的效率高很多,因為即使在某些線程中遠程 WEB 伺服器的響應非常慢,也可以下載檔案。
下面是多線程的例子
還在DOS時代,人們就在尋求一種多任務的實現。於是出現了TSR類型的後台駐留程式,比較有代表性的有SIDE KICK、VSAFE等優秀的TSR程式,這類程式的出現和應用確實給使用者使用電腦帶來了極大的方便,比如SIDE KICK,們編程可以在不用進編輯程式的狀態下,一邊編輯來源程式,一邊編譯運行,非常方便。但是,DOS單任務作業系統的致命缺陷註定了在DOS下不可能開發出真正的多任務程式。進入WINDOWS3.1時代,這種情況依然沒有根本的改變,一次應用只能做一件事。比如資料庫查詢,除非應用編得很好,在查詢期間整個系統將不響應使用者的輸入。
進入了WINDOWS NT和WINDOWS 9X時代,情況就有了徹底的改觀,作業系統從真正意義上實現了多任務(嚴格地說,WIN9X還算不上)。一個應用程式,在需要的時候可以有許多個執行線程,每個線程就是一個小的執行程式,作業系統自動使各個線程共用CPU資源,確保任一線程都不能使系統死結。這樣,在編程的時候,可以把費時間的任務移到後台,在前台用另一個線程接受使用者的輸入。對那些對即時性要求比較高的編程任務,如網路客戶服務、串列通訊等應用時,多線程的實現無疑大大地增強了程式的可用性和穩固性。
=====================================================================================
壞處:增加了調度和管理的開銷,帶來了一些不確定性,需要複雜的同步機制,避免死結等等。
好處:一定程度上提高響應速度,在多核的情況下還是更能充分利用CPU資源的。
=====================================================================================
單線程的也就是程式執行時,所跑的程式路徑(處理的東西)是連續順序下來的,必須前面的處理好,後面的才會執行到。
多線程嘛,舉個例子也就是說程式可以同時執行2個以上相同類似的操作,比如一些搜尋代理或者群發email的多線程軟體,由於操作一次需要網路的返回資訊 花的時間比較長,而對cpu來說卻是閒置,如果是一個一個順序執行,那麼搜尋幾千個IP就會花上好久好久。 而如果用多線程就可以在等待期間 加入其他的搜尋,然後等待,這樣可以提高效率。不過多線程和多進程公用一些資源時要考慮的問題好像也是一樣的,對於一些公用資源或者公開變數的訪問和修改時要注意特別的,需要一些鎖定什麼的,還有順序問題的考慮。
多線程編程的目的,就是"最大限度地利用CPU資源",當某一線程的處理不需要佔用CPU而只和I/O,OEMBIOS等資源打交道時,讓需要佔用CPU資源的其它線程有機會獲得CPU資源。每個程式執行時都會產生一個進程,而每一個進程至少要有一個主線程。這個線程其實是進程執行的一條線索,除了主線程外你還可以給進程增加其它的線程,也即增加其它的執行線索,由此在某種程度上可以看成是給一個應用程式增加了多任務功能。當程式運行後,您可以根據各種條件掛起或運行這些線程,尤其在多CPU的環境中,這些線程是並發啟動並執行。多線程就是在一個進程內有多個線程。從而使一個應用程式有了多任務的功能。多進程技術也可以實現這一點,但是建立進程的高消耗(每個進程都有獨立的資料和代碼空間),進程之間通訊的不方便(訊息機制),進程切換的時間太長,這些導致了多線程的提出,對於單CPU來說(沒有開啟超執行緒),在同一時間只能執行一個線程,所以如果想實現多任務,那麼就只能每個進程或線程獲得一個時間片,在某個時間片內,只能一個線程執行,然後按照某種策略換其他線程執行。由於時間片很短,這樣給使用者的感覺是同時有好多線程在執行。但是線程切換是有代價的,因此如果採用多進程,那麼就需要將線程所隸屬的該進程所需要的記憶體進行切換,這時間代價是很多的。而線程切換代價就很少,線程是可以共用記憶體的。所以採用多線程在切換上花費的比多進程少得多。但是,線程切換還是需要時間消耗的,所以採用一個擁有兩個線程的進程執行所需要的時間比一個線程的進程執行兩次所需要的時間要多一些。即採用多線程不會提高程式的執行速度,反而會降低速度,但是對於使用者來說,可以減少使用者的回應時間。上述結果只是針對單CPU,如果對於多CPU或者CPU採用超執行緒技術的話,採用多線程技術還是會提高程式的執行速度的。因為單線程只會映射到一個CPU上,而多線程會映射到多個CPU上,超執行緒技術本質是多線程硬體化,所以也會加快程式的執行速度。
====================================================================================
如果線程出現死結,唯一能證明的就是應用程式有問題,這並不是線程的缺點。
線程相對於進程的優點:
1、開銷小
2、資源共用性好。
線程相對於進程的缺點:
1、共用資源需要耗費一定的鎖資源,同步相對複雜。
2、一個線程崩潰可能導致整個進程崩潰,這個當然是自己的應用程式有問題
====================================================================================
CPU是以時間片的方式為進程分配CUP處理時間的,當一個進程以同步的方式去完成幾件事情時,此進程必須完成了第一件事情以後再做第二件事,如此按順序地向CPU請求完成要做的事情。在此單線程的工作模式下,如果把CUP看作是一共有100個時間片的話,CPU可能一直都只是花了其中的10個時間片來處理當前進程所要做的事情,只是用到了CPU的10%的時間片,而其他時間都白白浪費了,當然,實際上CPU的工作模式還是做完一件事以後再去做另一件事,只是CUP的處理速度非常快,很快就處理完成所請求的情事。
為了提高CPU的使用率,採用多線程的方式去同時完成幾件事情而互不干擾,如當前進程要完成三件事情1、2、3,那麼CPU會分別用10%的時間來同時處理這3件事情,從而讓CPU的使用率達到了30%,大大地提高了CPU的利用率。多線程的好處在處理一些特殊的場合其優勢尤其明顯。比如下載檔案,你要一邊下載一邊顯示進度一邊儲存,在這種情況下,如果沒有用多線程的話,沒有意外的話一般都會把主線程阻塞,比如進度條的進度根本沒有隨著已下載的量而變化,堪至是整個表單都動不了,用多線程就可以很好地解決這個問題。
這裡有一個生活執行個體可能更好地去理解多線程:回去看你女朋友做飯,正常的話她都會把洗好的菜(肉)先放到鍋裡煮,然後一邊洗別的菜或處理別的事情,如:洗碗、收拾桌台準備開飯,人還是一個人,但她同時做幾件事情,這樣就可以大大地提高效率。總的一句話就是:CPU還是要花同樣多的時間去完成所有的事情,但多線程可以讓CPU摻插地同時做多件事情,在視覺上讓使用者覺得電腦在同時幫他處理多件事情,更好地改善使用者體驗。
瞭解了多線程的好處以後,就要瞭解應該在什麼樣的情況下使用多線程技術。因為並不是說所有情況下用多線程都是好事,因為多線程的情況下,CPU還要花時間去維護,CPU處理各線程的請求時線上程間的切換也要花時間,所以一般情況下是可以不用多線程的,用了有時反而會得不償失。大多情況下,要用到多線程的主要是需要處理大量的IO操作時或處理的情況需要花大量的時間等等,比如:讀寫檔案、視頻映像的採集、處理、顯示、儲存等。