多線程學習---多線程理解

寫在前面

大體幾天時間學了些多線程,有一些理解,於是便想着寫篇博客來記錄一下。關於多線程我會多寫幾篇,偏重於自己的思路,偏向於理解。
首先需要一些基礎概念(大體理解):
進程:進入內存的程序。
線程:進程的一個執行單元,負責當前進程中程序的執行,一個進程中至少有一個線程;一個進程中可以有多個線程,此時該進程就是多線程的程序。可以理解成進程是一個大的項目,線程是工人,一個項目至少由一個工人來完成,而一個項目也當然可以由多個工人來一起完成。
併發:交替執行
並行:同時執行
之前操作系統中學過一點多線程知識,不過忘了一些,無妨,這裏也還是好理解的。

此線程非彼線程

除了程序的線程,我們平常其實接觸的還有線程,四核八線程,六核十二線程,cpu的線程對吧,我是挺喜歡自己裝臺式機的,16年暑假買了點垃圾給老電腦升級,用四核八線程的E3V2換了老電腦的那塊雙核?線程的奔騰g3x20(我都記不清型號了haha),瞬間體驗上了一個檔次,媽媽再也不用擔心我後臺同時開着迅雷網易雲qq巴拉巴啦玩遊戲卡了。cpu也是有線程概念的,但是這個線程跟我們的程序的線程不是一個東西,此線程非彼線程。
我上網查過,有些人說一個是硬件概念,一個是軟件概念,emmmm,確實是這回事兒,但不過好抽象,啥硬件軟件呀,不都叫線程嘛,抽象抽象。
同時,我們經常使用的任務管理器中也有線程的概念,如下圖所示
任務管理器截圖
性能cpu這裏也有線程,還有2千多個,瘋了瘋了,這到底什麼鬼。下面我想了一個例子,來解釋cpu與多線程程序之間的關係以及多線程執行的過程,理解了這些關係,此彼線程也就能不那麼模糊了。

多線程程序與CPU的關係

我們不把cpu的線程與程序的線程區分開,而把它們統一看成一根根水管,cpu呢看成是抽水泵,程序看成是水箱。執行程序的過程就看做是抽水泵把水箱灌滿的過程。這裏的我們cpu假設成四核八線程的cpu,那麼這個cpu就是一個有着8根出水管的水泵;而水箱有很多,它們排着隊等着想被水泵灌滿,我們這裏挑一個有四個線程的多線程程序來舉例,也就是一個有着四根入水管的水箱。
要把水箱灌滿,那麼必須把水管給它連起來,用水泵的四根出水管連接水箱的四根入水管就ok了。那麼我們從水泵來看,水泵就擁有同時給八根管子輸送水的能力。而從水箱的角度來看,它就擁有同時被四根水管輸送水的能力。注意這裏的“給”與“被”。
在這裏插入圖片描述
我們再將目光移到多線程程序上來看,我們關注它的一根入水管,這根入水管是希望與水泵的出水管連接的,然後輸送水到水箱中,但是水泵是公共的,從上面任務管理器的截圖來看,有196個進程,2392個程序線程等着輸送水呢。想象一下,你家水箱去接水,後面還有好多個人帶着水箱排着隊呢,你一直佔着水泵不合適吧,要是讓你把水泵的這根出水管一直佔着,那其他人不就等急死了嘛。所以你得把水箱的這根入水管接到水泵的出水管上,然後水泵嘩啦啦的向水箱輸送水,就一小會兒,你還沒裝多少水,就得把管子拔了,把位置讓給你後面排隊的人,然後自己重新排隊。由於你們換的速度很快很快,一秒鐘在同一根出水管上更換入水管的水箱數太多太多,所以你甚至沒有感覺到自己曾經離開過水泵的出水管,感覺自己一直在被服務,連冷戰都沒打,很順滑。而對於水泵的這根出水管來說,它已經服務了不知道多少個水箱了。所以每個水箱都以爲自己一直在被水泵的這根出水管注水,從未間斷。在這裏,更換的頻率就是系統所規定的切換線程的時間片的倒數。而每次能注入多少水,那就要看cpu的能力了,主頻啊,IPC這些等等。
由於每個水箱的入水管都以爲自己一直在被注水,那麼每個程序都以爲自己的每個線程都在每時每刻佔用cpu,它個各個線程在自己看來是並行的,如果沒有通信的話,就是相互之間不干擾的。而在cpu的一個線程看來,它一秒鐘服務了很多程序,在它看來,那些程序是併發的。
而當我的水泵並沒有那麼多個出水管時呢,比如單核單線程的cpu,要運行一個四線程的多線程程序,那麼四個入水管會在一個出水管下面排隊,他們會交替執行,當然順訊不確定,要看優先級還有概率,那此時,四個線程就不是同時運行的了。

多線程程序存在意義

一般我們的一個程序,從main()方法進入,會一直從第一行代碼運行到最後一行,它只會佔用cpu的的一個線程。而當出現這兩種情況時:

  1. 程序存在多個可以分開執行的業務。
  2. 程序中途會調用一些慢速設備,比如IO,此時需要等待,等待的時間不如做些後續工作,以提高運行效率。

此時,我們使用多線程,便可以提高運行效率,節省時間,這便是多線程存在的意義。

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