今晚和一同事在車上閒聊起了關於linux下的多線程和單線程問題,最後總結後獲得一個問題:在軟實時的linux操做系統下(cpu單核和多核分兩種狀況說),對消息的處理,是採用多線程程序處理快呢,仍是採用單線程程序處理快呢?linux
因爲問題假設太多,一時想不清楚,回來差了一下資料,暫時獲得了一個WINDOW平臺下的相似例子,有參考價值,暫且存下。數據庫
多線程處理的優勢
同步應用程序的開發比較容易,但因爲須要在上一個任務完成後才能開始新的任務,因此其效率一般比多線程應用程序低。若是完成同步任務所用的時間比預計時間長,應用程序可能會不響應。多線程處理能夠同時運行多個過程。例如,文字處理器應用程序在您處理文檔的同時,能夠檢查拼寫(做爲單獨的任務)。因爲多線程應用程序將程序劃分紅獨立的任務,所以能夠在如下方面顯著提升性能:
多線程技術使程序的響應速度更快,由於用戶界面能夠在進行其餘工做的同時一直處於活動狀態。
當前沒有進行處理的任務能夠將處理器時間讓給其餘任務。
佔用大量處理時間的任務能夠按期將處理器時間讓給其餘任務。
能夠隨時中止任務。
能夠分別設置各個任務的優先級以優化性能。
是否須要建立多線程應用程序取決於多個因素。在如下狀況下,最適合採用多線程處理:
耗時或大量佔用處理器的任務阻塞用戶界面操做。
各個任務必須等待外部資源(如遠程文件或 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上,超線程技術本質是多線程硬件化,因此也會加快程序的執行速度。併發
====================================================================================ide
若是線程出現死鎖,惟一能證實的就是應用程序有問題,這並非線程的缺點。
線程相對於進程的優勢:
一、開銷小
二、資源共享性好。
線程相對於進程的缺點:
一、共享資源須要耗費必定的鎖資源,同步相對複雜。
二、一個線程崩潰可能致使整個進程崩潰,這個固然是本身的應用程序有問題性能
====================================================================================優化
CPU是以時間片的方式爲進程分配CUP處理時間的,當一個進程以同步的方式去完成幾件事情時,此進程必須完成了第一件事情之後再作第二件事,如此按順序地向CPU請求完成要作的事情。在此單線程的工做模式下,若是把CUP看做是一共有100個時間片的話,CPU可能一直都只是花了其中的10個時間片來處理當前進程所要作的事情,只是用到了CPU的10%的時間片,而其餘時間都白白浪費了,固然,實際上CPU的工做模式仍是作完一件事之後再去作另外一件事,只是CUP的處理速度很是快,很快就處理完成所請求的情事。
爲了提升CPU的使用率,採用多線程的方式去同時完成幾件事情而互不干擾,如當前進程要完成三件事情一、二、3,那麼CPU會分別用10%的時間來同時處理這3件事情,從而讓CPU的使用率達到了30%,大大地提升了CPU的利用率。多線程的好處在處理一些特殊的場合其優點尤爲明顯。好比下載文件,你要一邊下載一邊顯示進度一邊保存,在這種狀況下,若是沒有用多線程的話,沒有意外的話通常都會把主線程阻塞,好比進度條的進度根本沒有隨着已下載的量而變化,堪至是整個窗體都動不了,用多線程就能夠很好地解決這個問題。
這裏有一個生活實例可能更好地去理解多線程:回去看你女友作飯,正常的話她都會把洗好的菜(肉)先放到鍋裏煮,而後一邊洗別的菜或處理別的事情,如:洗碗、收拾桌臺準備開飯,人仍是一我的,但她同時作幾件事情,這樣就能夠大大地提升效率。總的一句話就是:CPU仍是要花一樣多的時間去完成全部的事情,但多線程可讓CPU摻插地同時作多件事情,在視覺上讓用戶以爲計算機在同時幫他處理多件事情,更好地改善用戶體驗。
瞭解了多線程的好處之後,就要了解應該在什麼樣的狀況下使用多線程技術。由於並非說全部狀況下用多線程都是好事,由於多線程的狀況下,CPU還要花時間去維護,CPU處理各線程的請求時在線程間的切換也要花時間,因此通常狀況下是能夠不用多線程的,用了有時反而會得不償失。大多狀況下,要用到多線程的主要是須要處理大量的IO操做時或處理的狀況須要花大量的時間等等,好比:讀寫文件、視頻圖像的採集、處理、顯示、保存等。