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