(一)CPU概念基礎
1,超執行緒技術
-
什麼是超執行緒技術?
超執行緒技術是一顆單核CPU把一個物理核心模擬成兩個邏輯核心,這兩個核心共享一個CPU資源,每個核心同一時刻只能處理一個執行緒。
-
超執行緒技術實現並行操作的原理?
一個執行緒在執行時會佔用CPU資源,其他執行緒想要得到執行就必須等待該執行緒將CPU資源讓出。
利用超執行緒技術,模擬出的兩個邏輯核心共享同一個CPU資源,所以同一時刻可以有兩個執行緒都佔用CPU資源,因此這兩個執行緒都可以得到執行,這就是實現同一時間執行兩個執行緒的並行操作。
-
超執行緒的效能如何?
由於超執行緒技術是共享同一個CPU資源並不是真正擁有兩個CPU,所以效能比不上兩顆單核CPU一樣在同一時間執行兩個執行緒。
1,單核CPU
單核CPU同一時刻只能執行一個執行緒。
-
單核CPU中可以執行多執行緒嗎?
可以; 在單核CPU中執行多執行緒程式,看起來像多個任務同時執行,實際上是系統幫忙切換執行緒去佔用CPU資源,同一時刻還是隻有一個執行緒得到執行而已。
-
單核CPU中執行多執行緒的效能怎麼樣?
在單核CPU執行多執行緒程式,更多的時候速度其實並沒有變快,反而效能降低,因為執行緒之間的切換會增加開銷。所以一般情況下,單核CPU不推薦使用多執行緒。
2,多核CPU
多核CPU就是基板上整合有多個單核CPU。
單核CPU同一時刻只能執行一個執行緒,因此整合多個單核CPU的多核CPU可以同時執行多個執行緒,比如雙核CPU可以同時執行兩個執行緒。
多核CPU要用多執行緒才能體現出優勢。同樣,多執行緒也要在多核CPU上才能體現出優勢。
(二)併發與並行
1,什麼是併發?什麼是並行?
併發就是幾件事切換著做,有效利用等待的時間。
並行就是幾件事同時做。
2,舉個栗子
-
併發的栗子
程式猿小明把材料放進鍋裡,按下開關燉湯。燉湯要等60分鐘。這60分鐘小明並不需要在鍋旁邊等著,而是回到電腦桌前繼續寫程式。60分鐘到了之後,小明停下寫程式,揭開鍋放點其他調料進去,還要繼續燉個30分鐘。在這30分鐘,小明又回到電腦桌前繼續寫程式。
小明燉湯和寫程式這兩件事交替地執行,同一時刻只做一件事,但是這樣卻能有效利用等待燉湯的時間,大大提高了效率。
由於執行緒之間切換的速度非常快,所以計算機處理併發時,看起來就像多個任務同時進行一樣,實際上還是切換執行的。
-
並行的栗子
盛了一碗燉湯來到電腦桌前,小明左手敲程式碼,右手喝湯。在同一時刻,小明同時做多件事,這就是並行。
(三)多執行緒實現的是併發還是並行?
多執行緒可能被分配到同一個CPU核心中執行,也可能被分配到不同的CPU執行,分配過程是作業系統管理的,無法在程式中進行控制。所以我們寫的多執行緒程式,可能是並行的,也可能是併發的,關鍵看執行過程中作業系統是將這多個執行緒分配到不同的CPU中還是同一個CPU中。
(四)多執行緒的應用場景
多執行緒可以幫助我們有效利用多核CPU的優勢,提高效能;但是如果使用不當會導致資料不一致的問題。
1,需要及時響應
比如有一個執行緒是處理大量資料的耗時操作,如果不採取多執行緒,其他任務無法執行。這樣使用者只能等待該耗時操作執行完後才能得到其他資訊或進行下一步操作,使用者體驗大大降低。
就比如有的程式執行一些耗時操作,看起來就像當機一樣,給使用者的體驗特別不好。 如果採用多執行緒,那麼在耗時操作處理的時候,可以讓另一個執行緒去執行,反饋一些其他資訊給使用者,這樣使用者就知道程式並沒有卡死。
2,解決效能問題
多執行緒主要用於解決因為併發而導致的效能問題。
比如我們要爬取某個小說網站的所有小說簡介和所有小說正文,我們就可以考慮建立兩個執行緒,一個執行緒專門用於爬取小說簡介,一個執行緒專門用於爬取小說正文。
比如爬蟲應用中,爬蟲佇列中存在很多未爬取的任務,此時開啟多執行緒就可以大大提高效能,縮短爬取時間。