單線程和多線程的優缺點

單線程和多線程的優缺點

多線程處理的優點

同步應用程序的開發比較容易,但由於需要在上一個任務完成後才能開始新的任務,所以其效率通常比多線程應用程序低。如果完成同步任務所用的時間比預計時間長,應用程序可能會不響應。多線程處理可以同時運行多個過程。例如,文字處理器應用程序在您處理文檔的同時,可以檢查拼寫(作爲單獨的任務)。由於多線程應用程序將程序劃分成獨立的任務,因此可以在以下方面顯著提高性能: 
多線程技術使程序的響應速度更快,因爲用戶界面可以在進行其他工作的同時一直處於活動狀態。 
當前沒有進行處理的任務可以將處理器時間讓給其他任務。 
佔用大量處理時間的任務可以定期將處理器時間讓給其他任務。 
可以隨時停止任務。 
可以分別設置各個任務的優先級以優化性能。 

是否需要創建多線程應用程序取決於多個因素。在以下情況下,最適合採用多線程處理: 
耗時或大量佔用處理器的任務阻塞用戶界面操作。 
各個任務必須等待外部資源(如遠程文件或 INTERNET 連接)。 

例如,用於跟蹤 WEB 頁上的鏈接並下載滿足特定條件的文件的 INTERNET 應用程序“ROBOT”。這種應用程序可以依次同步下載各個文件,也可以使用多線程同時下載多個文件。多線程方法比同步方法的效率高很多,因爲即使在某些線程中遠程 WEB 服務器的響應非常慢,也可以下載文件。

下面是多線程的例子
還在DOS時代,人們就在尋求一種多任務的實現。於是出現了TSR類型的後臺駐留程序,比較有代表性的有SIDE KICK、VSAFE等優秀的TSR程序,這類程序的出現和應用確實給用戶使用計算機帶來了極大的方便,比如SIDE KICK,們編程可以在不用進編輯程序的狀態下,一邊編輯源程序,一邊編譯運行,非常方便。但是,DOS單任務操作系統的致命缺陷註定了在DOS下不可能開發出真正的多任務程序。進入WINDOWS3.1時代,這種情況依然沒有根本的改變,一次應用只能做一件事。比如數據庫查詢,除非應用編得很好,在查詢期間整個系統將不響應用戶的輸入。
 進入了WINDOWS NT和WINDOWS 9X時代,情況就有了徹底的改觀,操作系統從真正意義上實現了多任務(嚴格地說,WIN9X還算不上)。一個應用程序,在需要的時候可以有許多個執行線程,每個線程就是一個小的執行程序,操作系統自動使各個線程共享CPU資源,確保任一線程都不能使系統死鎖。這樣,在編程的時候,可以把費時間的任務移到後臺,在前臺用另一個線程接受用戶的輸入。對那些對實時性要求比較高的編程任務,如網絡客戶服務、串行通信等應用時,多線程的實現無疑大大地增強了程序的可用性和穩固性。

=====================================================================================

壞處:增加了調度和管理的開銷,帶來了一些不確定性,需要複雜的同步機制,避免死鎖等等。
好處:一定程度上提高響應速度,在多核的情況下還是更能充分利用CPU資源的。

=====================================================================================

單線程的也就是程序執行時,所跑的程序路徑(處理的東西)是連續順序下來的,必須前面的處理好,後面的纔會執行到。   
id="iframe_0.8937144000083208" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://blog.163.com/#/?_=3817768%22%20style=%22border:none;max-width:1141px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.8937144000083208',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="border-style: none; border-width: initial; width: 0px; height: 0px;">       多線程嘛,舉個例子也就是說程序可以同時執行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操作時或處理的情況需要花大量的時間等等,比如:讀寫文件、視頻圖像的採集、處理、顯示、保存等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章