作為某知名大廠老程式設計師回答下這個問題。
問題中涉及到兩個要點:併發和架構
提到併發就不得不提到並行,這兩者很相近卻有細微的差別:
併發是指作業系統中有多個任務同時存在
並行是指作業系統中有多個任務同時執行
關係:併發是並行的子集
我們知道,作業系統是管理計算機硬體與軟體資源的計算機程式,其中最核心的硬體是CPU,即計算機的大腦。作業系統執行任務(任務排程)主要是指把任務的指令交給CPU運算,即分配CPU時間。
對於只有單核的計算機來說,某一時刻只能為一個任務分配CPU時間,即執行一個任務,其他任務只能等待作業系統分配CPU時間,只是作業系統只會某個任務分配很短的CPU時間,然後就為別的任務分配CPU,由於時間很短,我們感覺不到這個切換過程,只是感覺到多個任務在同時執行,就是典型的併發。
對於擁有多核的計算機來說,某一時刻可以為多個任務分配CPU時間,即同一時刻執行多個任務,這是真正的同時執行,這就是並行。
提到併發的架構的選型就不得不提到程序、執行緒和協程:
程序是作業系統進行資源分配和排程的基本單位,這裡我們關注的是CPU的分配和排程。
執行緒是作業系統CPU分配和排程的基本單位。
程序和執行緒都是系統層面實現的,是作業系統的基礎設施,基於這兩個設施,我們可以自己實現使用者層面的協程,協程有不同的實現方式,可以一個執行緒對應多個協程,也可以多個執行緒對應多個協程,由於協程是基於執行緒內部實現的,因此又稱纖程。
在考慮併發架構,我們會先考慮是使用多程序模型、多執行緒模型、多程序+協程模型還是多執行緒+協程模型。
無論哪種選型,都會面臨到底選擇多程序還是多執行緒?下面對這兩種模型做下對比:
1、在資料共享方面,程序資料共享複雜,需用IPC 共享,而多執行緒共享程序空間,資料共享簡單
2、在資料同步方面,由於多程序的資料是分開的,因此同步簡單,而多執行緒同步複雜
3、在記憶體使用方面,多程序佔用記憶體多 ,多執行緒佔用記憶體少
4、在CPU利用率方面,多程序切換複雜,CPU利用率低 ,而多執行緒切換簡單,CPU利用率高
5、在建立銷燬、切換 方面,多程序建立銷燬、切換複雜,速度慢,而多執行緒建立銷燬、切換簡單,速度很快
6、在程式設計、除錯方面,多程序程式設計簡單,除錯簡單,而多執行緒程式設計複雜,除錯複雜
7、在可靠性方面,多程序間不會互相影響,而一個執行緒掛掉將導致整個程序掛掉
8、在分散式方面,多程序適應於多核、多機分散式;如果一臺機器不夠,擴充套件到多臺機器比較簡單,而多執行緒適應於多核分散式多程序和多執行緒各有優劣,在特定的業務場景下,差異總是不是很明顯,可根據根據的業務、人員配置,考慮使用最適合自己的模型來滿足自己,下面僅提供建議幾點參考:
1、需頻繁建立銷燬的優先用執行緒
不過來一個建立一個消耗還是很大的,所以會考慮採用執行緒池複用,或者程序池複用。
2、需要進行大量計算的優先使用執行緒
大量計算需要消耗大量CPU時間,切換頻繁,這種情況下執行緒是最合適的。
3、強相關的處理用執行緒,弱相關的處理用程序
4、都滿足需求的情況下,用你最熟悉、最拿手的
方式
無論是多程序還還是多執行緒,在高峰時段,頻繁建立和銷燬,都會導致CPU資源浪費和效能下降,因此一般都採用執行緒池複用,或者程序池複用。
大體選型確定了,還要考慮要不要使用協程。協程可以做到同步寫程式碼,非同步非同步效果,在一定程度減輕了程式設計複雜度和提升併發效能。
除此之外,從架構層面,還要考慮防雪崩,頻率限制,黑名單,安全攻擊,負載均衡,高可用,可拓展性等,因為內容比較多,這裡不做展開了,有需要可私聊我大家一起探討。
作為某知名大廠老程式設計師回答下這個問題。
問題中涉及到兩個要點:併發和架構
提到併發就不得不提到並行,這兩者很相近卻有細微的差別:
併發是指作業系統中有多個任務同時存在
並行是指作業系統中有多個任務同時執行
關係:併發是並行的子集
我們知道,作業系統是管理計算機硬體與軟體資源的計算機程式,其中最核心的硬體是CPU,即計算機的大腦。作業系統執行任務(任務排程)主要是指把任務的指令交給CPU運算,即分配CPU時間。
對於只有單核的計算機來說,某一時刻只能為一個任務分配CPU時間,即執行一個任務,其他任務只能等待作業系統分配CPU時間,只是作業系統只會某個任務分配很短的CPU時間,然後就為別的任務分配CPU,由於時間很短,我們感覺不到這個切換過程,只是感覺到多個任務在同時執行,就是典型的併發。
對於擁有多核的計算機來說,某一時刻可以為多個任務分配CPU時間,即同一時刻執行多個任務,這是真正的同時執行,這就是並行。
提到併發的架構的選型就不得不提到程序、執行緒和協程:
程序是作業系統進行資源分配和排程的基本單位,這裡我們關注的是CPU的分配和排程。
執行緒是作業系統CPU分配和排程的基本單位。
程序和執行緒都是系統層面實現的,是作業系統的基礎設施,基於這兩個設施,我們可以自己實現使用者層面的協程,協程有不同的實現方式,可以一個執行緒對應多個協程,也可以多個執行緒對應多個協程,由於協程是基於執行緒內部實現的,因此又稱纖程。
在考慮併發架構,我們會先考慮是使用多程序模型、多執行緒模型、多程序+協程模型還是多執行緒+協程模型。
無論哪種選型,都會面臨到底選擇多程序還是多執行緒?下面對這兩種模型做下對比:
1、在資料共享方面,程序資料共享複雜,需用IPC 共享,而多執行緒共享程序空間,資料共享簡單
2、在資料同步方面,由於多程序的資料是分開的,因此同步簡單,而多執行緒同步複雜
3、在記憶體使用方面,多程序佔用記憶體多 ,多執行緒佔用記憶體少
4、在CPU利用率方面,多程序切換複雜,CPU利用率低 ,而多執行緒切換簡單,CPU利用率高
5、在建立銷燬、切換 方面,多程序建立銷燬、切換複雜,速度慢,而多執行緒建立銷燬、切換簡單,速度很快
6、在程式設計、除錯方面,多程序程式設計簡單,除錯簡單,而多執行緒程式設計複雜,除錯複雜
7、在可靠性方面,多程序間不會互相影響,而一個執行緒掛掉將導致整個程序掛掉
8、在分散式方面,多程序適應於多核、多機分散式;如果一臺機器不夠,擴充套件到多臺機器比較簡單,而多執行緒適應於多核分散式多程序和多執行緒各有優劣,在特定的業務場景下,差異總是不是很明顯,可根據根據的業務、人員配置,考慮使用最適合自己的模型來滿足自己,下面僅提供建議幾點參考:
1、需頻繁建立銷燬的優先用執行緒
不過來一個建立一個消耗還是很大的,所以會考慮採用執行緒池複用,或者程序池複用。
2、需要進行大量計算的優先使用執行緒
大量計算需要消耗大量CPU時間,切換頻繁,這種情況下執行緒是最合適的。
3、強相關的處理用執行緒,弱相關的處理用程序
4、都滿足需求的情況下,用你最熟悉、最拿手的
方式
無論是多程序還還是多執行緒,在高峰時段,頻繁建立和銷燬,都會導致CPU資源浪費和效能下降,因此一般都採用執行緒池複用,或者程序池複用。
大體選型確定了,還要考慮要不要使用協程。協程可以做到同步寫程式碼,非同步非同步效果,在一定程度減輕了程式設計複雜度和提升併發效能。
除此之外,從架構層面,還要考慮防雪崩,頻率限制,黑名單,安全攻擊,負載均衡,高可用,可拓展性等,因為內容比較多,這裡不做展開了,有需要可私聊我大家一起探討。