天天看點

多線程為什麼比單線程快?

多線程為什麼比單線程快呢?

單線程的也就是程式執行時,所跑的程式路徑(處理的東西)是連續順序下來的,必須前面的處理好,後面的彩繪執行到。

多線程嘛,舉個例子也就是說程式可以同時執行2個以上相同類似的操作,比如一些搜尋代理或者群發email的多線程軟體,由于操作一次需要網絡的傳回資訊 花的時間比較長,而對cpu來說卻是空閑的,如果是一個一個順序執行,那麼搜尋幾千個IP就會花上好久好久。 而如果用多線程就可以在等待期間 加入其他的搜尋,然後等待,這樣可以提高效率。不過多線程和多程序公用一些資源時要考慮的問題好像也是一樣的,對于一些公共資源或者公共變量的通路和修改時要注意特别的,需要一些鎖定什麼的,還有順序問題的考慮。

多線程程式設計的目的,就是"最大限度地利用CPU資源",當某一線程的處理不需要占用CPU而隻和I/O,OEMBIOS等資源打交道時,讓需要占用CPU資源的其它線程有機會獲得CPU資源。每個程式執行時都會産生一個程序,而每一個程序至少要有一個主線程。這個線程其實是程序執行的一條線索,除了主線程外你還可以給程序增加其它的線程,也即增加其它的執行線索,由此在某種程度上可以看成是給一個應用程式增加了多任務功能。當程式運作後,您可以根據各種條件挂起或運作這些線程,尤其在多CPU的環境中,這些線程是并發運作的。多線程就是在一個程序内有多個線程。進而使一個應用程式有了多任務的功能。多程序技術也可以實作這一點,但是建立程序的高消耗(每個程序都有獨立的資料和代碼空間),程序之間通信的不友善(消息機制),程序切換的時間太長,這些導緻了多線程的提出,對于單CPU來說(沒有開啟超線程),在同一時間隻能執行一個線程,是以如果想實作多任務,那麼就隻能每個程序或線程獲得一個時間片,在某個時間片内,隻能一個線程執行,然後按照某種政策換其他線程執行。由于時間片很短,這樣給使用者的感覺是同時有好多線程在執行。但是線程切換是有代價的,是以如果采用多程序,那麼就需要将線程所隸屬的該程序所需要的記憶體進行切換,這時間代價是很多的。而線程切換代價就很少,線程是可以共享記憶體的。是以采用多線程在切換上花費的比多程序少得多(與程序相比,線程之間的上下文切換有一點主要差別:位址空間保持不變,即不需要切換目前使用的頁表)。但是,線程切換還是需要時間消耗的,是以采用一個擁有兩個線程的程序執行所需要的時間比一個線程的程序執行兩次所需要的時間要多一些。即采用多線程不會提高程式的執行速度,反而會降低速度,但是對于使用者來說,可以減少使用者的響應時間。上述結果隻是針對單CPU,如果對于多CPU或者CPU采用超線程技術的話,采用多線程技術還是會提高程式的執行速度的。因為單線程隻會映射到一個CPU上,而多線程會映射到多個CPU上,超線程技術本質是多線程硬體化,是以也會加快程式的執行速度。

繼續閱讀