其實在單道系統時期,是沒有併發的,cpu更是沒有多核。程式設計師輸入資料,計算機處理,計算機輸出結果,每次乙個程式執行完才能執行其他程式。但不久聰明的程式設計師們發現這樣極大的浪費計算機資源。比如,在執行乙個算術問題時候,程式設計師輸入資料是很慢的(scanf())。而這幾秒鐘cpu卻阻塞在這裡等待io完成。
所以,為了克服單道系統的各種問題。研究出了多道作業系統,讓計算機可以同時執行多個程式(巨集觀上)。讓程式在等待io時候,而cpu在執行其他程式,提高效率,節約資源。計算機系統採用分時復用的方式。將程序(執行的程式)貼上時間片的標籤。可以理解為a程序時間片1s,b程序時間片2s,時間片代表程序能用於cpu的時間。a程序裝載進cpu後1s後,a程序退出,讓b程序裝載進cpu執行2s,如此迴圈。所以在人眼中,敲**和聽**是同時進行的。在微觀上,其實是程序在分時使用cpu,只是時間片太短,以至於使用者是感覺不到的。
所以參考度娘,併發有如下定義:
併發,在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任乙個時刻點上只有乙個程式在處理機上執行。
併發只是巨集觀上的並行(程序同時執行),隨著計算機的發展,cpu不再是以前的單核 ,漸漸有了2核心,4核心,8核心。這樣a程序可以在1核心上執行的同時,b程序在2核心上執行。多核計算機上實現了真正的巨集觀上微觀上的並行。
實現並行和併發一般分為兩種,兩者各有優勢,可以根據實際需求考慮。
1,多程序實現
2,多執行緒實現
執行緒就是乙個輕量級的程序,就如作業系統裡這麼說" 程序是資源分配的最小單位,執行緒是cpu排程的最小單位」。執行緒不擁有資源,執行緒公用乙個程序的資源,這也奠定了執行緒占用記憶體小,共享資料簡單但執行緒的安全是乙個大問題。
多程序的實現,程序的安全由作業系統進行管理,程式設計師不用太關心程序的安全,而更多在於多個程序的通訊,多程序的通訊方式有管道,共享記憶體,訊息等
多執行緒的實現,由於不占用資源,共享資源,所以資料的通訊是很簡單的。而共享資源的資源是不安全的。由於作業系統不會提供執行緒的安全機制,所以需要程式設計師來維護資源的安全。這也是多執行緒的研究方向。
記憶體方面: 多程序占用大,多執行緒占用小
cpu方面:多程序利用率低,多執行緒利用率高
資料通訊:多程序資料通訊複雜,多執行緒資料通訊簡單
資料安全:多程序容易,多執行緒困難
總體速度:多程序慢,多執行緒快
安全方面:多程序更安全,多執行緒不安全。
看看標題,我主要講多執行緒方面。下面是乙個執行緒安全的栗子。
c++自11版本開始支援執行緒,執行緒的操作放在 #include 標頭檔案中宣告,因此使用 執行緒時需要包含 #include 標頭檔案。
建立乙個執行緒:
std::thread t1(fun,引數);
物件方法detach是將主程序和執行緒分離執行;
如下,我想用執行緒列印出一段資料。
但結果是出乎意料的,執行緒並沒有根據我預想的列印出來。執行緒是多個的,甚至cpu也可以多核,但控制台只有乙個。執行緒操作控制台式無序的。你不能知道是a執行緒先執行還是b執行緒先執行。甚至執行緒內部的操作也是不同步的,如上第一行。執行緒一還沒有列印換行,控制台就被執行緒2搶去列印了。所以最後引入了執行緒間是需要同步的。
再舉個栗子,如下,fun1先sleep一秒鐘,然後資料自加操作。fun2先sleep一秒鐘,然後資料自減操作。兩種執行緒都執行100次。自加100次,自減100次,理論上最後結果應該是0
結果也是如此,與理論不符。這涉及底層原理。反彙編看看原始碼。
//do something
data++
;00fc80f3 mov eax,dword ptr [data]
00fc80f6 mov ecx,dword ptr [eax]
00fc80f8 add ecx,
100fc80fb mov edx,dword ptr [data]
00fc80fe mov dword ptr [edx]
,ecx
自加操作,記憶體中的data先會寫入暫存器中,由暫存器進行自加操作後,最後會將暫存器結果寫入data記憶體。
這樣問題就來了。假如data為0,自加操作進行到add ecx,1 ,暫存器儲存值為1,還沒寫進記憶體,時間片到期了。自減執行緒開始操作。而自減操作讀取的仍然是data值為0,自減得到-1,寫入記憶體,時間片到期。剛才的自加執行緒繼續執行。將暫存器中的1寫入data記憶體。最後一次自加操作和自減操作得到了結果1。所以引入了執行緒還需要考慮訪問資料的安全問題
多執行緒 理解多執行緒(一)
程序 程序是cpu分配資源的基本單位 執行緒 執行緒是cpu排程的基本單位 資源分配給程序,所有執行緒共享該程序的資源 當執行緒數大於cpu的數量,會出現時間片的輪詢。cpu時間片是直接分配給執行緒的,執行緒拿到cpu時間片就能執行了 cpu時間片不是先分給程序然後再由程序分給程序下的執行緒的。所有...
多執行緒理解
本文介紹我對於多執行緒的理解。一 概念 1.作業系統下的多程序場景 但其實上面的情景是屬於作業系統下的多程序,不是單個程式內的多程序,這種多程序跟我們在單個程式內的多執行緒沒有什麼可以比較的。2.執行緒 舉個最簡單例子 我們的任務需要兩個計算型操作 a b 每個操作耗時10秒,如果是單執行緒,這時我...
多執行緒理解
單核cpu 單執行緒與多執行緒 執行時都是併發操作 a.執行條件 無io等操作,時間大小 多執行緒 單執行緒,原因 多執行緒執行時執行緒切換耗時間 b.執行條件 有io等操作,時間大小 單執行緒 多執行緒,原因 單執行緒要等待io的操作時間,從而加長時間 單核多執行緒的作用 在b中展現出優點。多核c...