併發、進程、線程的基本概念
併發
兩個或者更多的任務(獨立的事情)同時進行;
一個程序同時執行多個獨立的任務;
以往計算機只有單核cpu,某一時刻只能執行一個任務:有操作系統調度,每秒鐘進行多次所謂的“任務切換”。不是真正的併發,屬於併發的假象;這種切換(上下文切換)是要有時間開銷的,比如操作系統要保存你切換時的各種狀態,執行進度等信息,都需要時間一會兒切換回來時需要復原這些信息。
硬件發展,出現了多處理器計算機:用於服務器和高性能計算領域。
臺式機:在一塊芯片上有多核cpu,4核,8核,10核
能夠實現真正的並行執行多個任務(硬件併發);
使用併發的原因:同時幹多個事情,提高性能;
可執行程序
磁盤上的一個文件,windows下,.exe文件,Linux下,執行權限帶x的文件。
進程
一個可執行程序運行起來,就是一個進程。
進程就是運行起來的可執行程序;
線程
每個進程(執行起來的可執行程序),都有一個主線程,這個主線程是惟一的,也就是一個進程中只能有一個主線程
當你執行可執行程序,產生一個進程後,這個主線程就隨着這個進程默默啓動起來了。
運行這個程序的時候實際上是進程的主線程來調用main 函數中的代碼。
主線程與進程脣齒相依。
線程:執行代碼的;線程可以理解成一條代碼的執行通路。
除了主線程之外,我們可以通過自己寫代碼來創建其它線程,其它線程走的是別的道路。每創建一個新線程,我們就可以在同一時刻,多幹一個不同的事情,
多線程
線程並不是越多越好,每個線程都需要一個獨立的堆棧空間(1MB),線程之間切換要保存很多中間狀態
切換會耗費本該屬於程序運行的時間
總結線程:
1、線程是用來執行代碼的
2、把線程理解成一條代碼的執行通路,一個新新線程代表一個新通路。
3、一個進程自動包含一個主線程,主線程隨着進程默默啓並運行,我們可以通過編碼來創建多個其它線程。但是創建的數量最大都不建議超過200-300個,至於多少個合適,大家可以在實際項目中不斷調整優化。有的時候線程太多效率反而降低
4、因爲主線程是自動啓動的,所以一個進程中最少也是有一個線程(主線程)的。
5、說白了,多線程程序,可以同時幹多個事情,所以運行效率高。但是到底有多高,並不是一個很容易評估和量化的東西。
併發的實現方法
兩個或者更多任務(獨立任務)同時發生
實現併發的手段:
1、我們通過過個進程實現併發;
2、在單獨的進程中,我創建多個線程來實現併發;自己寫代碼來創建除主線程之外的其它線程
多進程併發:
如賬號服務器,遊戲邏輯服務器。
服務器進程之間的通訊
進程之間通訊:同一個電腦上:管道;文件;消息隊列;共享內存;
不通電腦:socket通信
多線程併發:
在單個進程中,創建了多個線程
線程:像是輕量級的進程,每個進程都有自己的運行路徑,但是一個進程中所有的線程共享地址空間(共享內存),全局標量,指針,引用 都可以在線程之間傳遞;所以,使用多線程開銷遠遠小於多進程
共享內存帶來了一個新問題,數據一致性問題;
多進程併發和多進程併發雖然可以混合使用,但是建議,優先考慮多線程技術而不是多進程;
總結
和進程比線程有如下有點:
1、線程啓動速度更快,更輕量;
2、系統資源開銷少,執行速度更快,比如共享內存這種通訊方式比其他任何通訊方式都快
缺點:
使用有難度
C++11線程庫:
以往的多線程代碼不能跨平臺。
POSIX thread:跨平臺,但是需要額外配置。
從C++11開始,C++本身增加了對多線程的支持,意味着可移植性;