併發的概念:
計算機裡面的併發是指單個系統同時執行多個獨立的任務,而非順序的一個任務一個任務的執行。
在單處理器的單核CPU裡,雖然某一時刻只能有一個任務在執行,但是它可以不斷進行任務切換,這個任務執行一會兒,再切換到別的任務執行一會兒,由於切換得很快,所以使用者感覺像是多個任務在同時執行。單核實現併發模型如下圖,橙色和綠色表示兩個任務交替執行,中間灰色部分表示任務切換的開銷。
在多核心的處理器上,同一時刻可以有多個任務分別在不同的核上執行,這種同一時刻多個任務同時執行,嚴格意義上我們叫它並行。如下圖表示兩個任務在雙核處理器上實現並行。
多核上除了並行,併發也是存在的,在每個核上可以有多個任務交替執行,以此實現併發,如下圖展示四個任務在兩個核上實現併發。
實現併發的方法:
多程式方式實現併發。
多執行緒方式實現併發。
程式與執行緒的區別:
區別1:從概念上進行理解,程式是指一個程式的執行過程,執行緒是一個程式中一段程式碼的執行過程。執行緒是依附於程式存在的,在一個程式中,至少有一個主執行緒,當然還可以有更多的執行緒,而一個執行緒只可能唯一屬於某個程式。
區別2:多程式和多執行緒都可以實現併發,在上下文切換時程式開銷大,執行緒開銷小。
區別3:程式的資源是獨立的,程式之間互相不影響,但是同一個程式內的多個執行緒共享程式的資源,共享的資源每個執行緒都可以訪問,訪問的話要保證任意時刻任何執行緒訪問到的資源都是一致的,所以程式不共享資源雖然程式間通訊困難,但是資源獨立不用關心一致性問題(使用共享記憶體實現程式通訊時要關心),執行緒共享程式的資源,通訊簡單,但是要注意一致性問題。
區別4:程式中一個執行緒崩潰了,整個程式就崩潰了,但是多程式時一個程式崩潰了,不影響其他程式。
所以如果需要頻繁的建立和銷燬時推薦使用執行緒,因為建立和銷燬一個程式的代價的高昂的。需要頻繁切換任務時,也推薦使用多執行緒,上下文切換速度快,開銷小。如果希望更高的安全性時,推薦使用多程式。
為什麼要用併發:
1:效能:因為合理的安排併發,能提高程式效能(並不是一定提高哦,一定是要合理實現併發才能提高效能)
2:關注點分離:將一個大的任務分離成小的顆粒,比如一個伺服器程式,可以讓一個任務負責處理使用者的連線請求,一個任務負責處理使用者資料的收發和邏輯處理。
什麼時候不使用併發:
大多數情況下,併發的程式碼往往更難理解,維護成本更高,當使用併發的收益不比維護的成本高時,沒必要使用併發增加軟體的複雜度。