java高併發之基礎認知

在進入高併發學習之前,先了解一些計算機基礎知識:

我們知道計算機基於二進制建立只能識別0和1,可以想象一下用0和1編寫代碼是何其繁瑣易錯還有不人性,爲了更好讓人類使用計算機,於是出現了低級語言,低級語言是對0和1編製成的代碼片段進行封裝,這樣就可以僅寫幾個字符就能代替N個0和1通過規律編譯的代碼段,想想都是極好的。

低級語言在處理人與計算機“交流”上起到了不可忽視的作用,但是對處理功能需求上就顯得不那麼給力,例如現在 1+1需要相加100次的需求上,使用低級語言編寫就顯得特別笨拙,在這種基礎上爲了人類便於交互計算機,高級語言出現了。

高級語言的出現,才使得計算機進入蓬勃發展時期,類似C語言等優秀語言被人們廣泛運用,各種各樣的嵌入式產品出現在生活中惠及每個人,最最最有名的還是當屬計算機,通過與操作系統(c、c++和彙編(低級)語言編寫而成)的結合,發展成爲當今時代集成 辦公、娛樂、學習等等於一體的龐然大物

秀了一波計算機基礎知識,感覺相當nice。

這跟高併發粘不到邊,屬於知識拓展,既然進入狀態了那下面聊聊於高併發有關的基礎知識!

 

什麼是進程?什麼是線程?

進程是指在操作系統中正在運行的一個應用程序,是程序執行時的一個實例(程序一旦運行就是進程)

進程是系統進行資源分配的獨立實體, 且每個進程擁有獨立的地址空間。一個進程無法直接訪問另一個進程的變量和數據結構, 如果希望讓一個進程訪問另一個進程的資源,需要使用進程間通信,比如:管道,文件, 套接字等。

一個進程可以擁有多個線程,每個線程使用其所屬進程的棧空間。 線程與進程的一個主要區別是,同一進程內的多個線程會共享部分狀態, 多個線程可以讀寫同一塊內存(一個進程無法直接訪問另一進程的內存)。同時, 每個線程還擁有自己的寄存器和棧,其它線程可以讀寫這些棧內存。

線程是進程的一個實體,是進程的一條執行路徑

線程是進程的一個特定執行路徑。當一個線程修改了進程中的資源, 它的兄弟線程可以立即看到這種變化

 

線程進程的區別體現在幾個方面:

1)地址空間和其它資源(如打開文件):進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。

2)通信:進程間通信IPC(管道,信號量,共享內存,消息隊列),線程間可以直接讀寫進程數據段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。

3)調度和切換:線程上下文切換比進程上下文切換要快得多。

4)在多線程OS中,進程不是一個可執行的實體。

 

進程與線程的選擇取決以下幾點:

1、需要頻繁創建銷燬的優先使用線程;因爲對進程來說創建和銷燬一個進程代價是很大的。

2、線程的切換速度快,所以在需要大量計算,切換頻繁時用線程,還有耗時的操作使用線程可提高應用程序的響應

3、因爲對CPU系統的效率使用上線程更佔優,所以可能要發展到多機分佈的用進程,多核分佈用線程;

4、並行操作時使用線程,如C/S架構的服務器端併發線程響應用戶的請求;

5、需要更穩定安全時,適合選擇進程;需要速度時,選擇線程更好。

 

1 什麼是高併發:

1.1 場景一

高併發的產生

對於web項目,隨着用戶量的增加就有可能產生高併發的問題。高併發簡單的來說就是在同一時刻不同用戶訪問同一資源的問題,專業一點的說法就是在同一時刻有多個線程訪問了同一個數據資源。

解決方案

目前對於高併發大部分的解決方案都是通過鎖機制,鎖機制有兩個層面。 一種是代碼層次上的,如java中的同步鎖,典型的就是同步關鍵字synchronized,這裏我不在做過多的講解,感興趣的可以參考:http://www.cnblogs.com/xiohao/p/4151408.html另外一種是數據庫層次上的,比較典型的就是悲觀鎖和樂觀鎖。這裏我們重點講解的就是悲觀鎖(傳統的物理鎖)和樂觀鎖。樂觀鎖機制,通過‘version’版本字段來控制併發問題,原理我貼一段SQL就清楚了

update t_order set qty=1 and version=version+1 where version=:version

這裏就是在更新操作時驗證當前訂單的版本號時候被其它事務改變否則就已報錯的方式,引導用戶重新查詢然後編輯。這樣講來比較簡單,但是就是這麼簡單就可以處理高併發的問題,對於數據庫和系統性能也不會有什麼影響。以外一種悲觀鎖機制,一般都是通過數據庫的特性來解決,數據庫的四大特性中有一個隔離性,意思就是說在同一個事物內操作的數據會被加上鎖,其它操作不能夠訪問。通過數據庫加鎖這種方式並不好,第一大量的鎖會給數據庫帶來很大的開銷,而且對於用戶而言沒有獲取鎖就不能操作數據,陷入等待的狀態,非常不友好。

 

1.2 場景二

那麼很多請求,具體達到多少請求纔算是高併發系統呢?這個也沒有明確數量上的定義,根據網上很多大型互聯網公司的相關高併發博客,一般PV(page view)在千萬級別以上的公司纔會涉及到這個概念,所以如果某個系統的日PV在千萬級別以上,可能是一個高併發系統.這裏根據具體業務不同,這個數字可能高或者低一些。

高併發的概念

這裏我引用一篇推文究竟啥纔是互聯網架構高併發中的一段話來描述:

高併發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求

併發與並行的區別

這裏涉及到一個問題,很多同學搞不清楚併發與並行的區別,這裏我根據我根據知乎上這個問題某位網友的例子,我覺得很好

           你吃飯吃到一半,電話來了,你一直到吃完了以後纔去接,這就說明你不支持併發也不支持並行

你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支持併發

你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支持並行

併發:你有處理多個任務的能力,不一定同時(一個CPU輪流)

並行:有同時處理多個任務的能力(多個CPU同時)

併發和並行都可以是很多個線程,就看這些線程能不能同時被(多個)CPU執行,可以說明是並行,併發是多個線程被一個CPU隨機切換着執行

高併發的相關指標

高併發相關指標有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),併發用戶數等

響應時間:系統對某個請求做出相應的時間.例如處理一個HTTP請求,從HTTP發出到收到響應需要200ms,則200ms就是系統的響應時間.

吞吐量:單位時間內處理的請求數量

QPS:每秒響應請求數,這個感覺和吞吐量區分不大

併發用戶數:同時承載正常使用系統功能的用戶數量. 例如微信,同時可以x億人在線,一定程度代表了系統的併發用戶數

提高併發能力有以下途徑:

  • 增加機器:讀寫分離,分佈式部署(不同模塊),集羣(相同服務)
  • 增強單機性能:數據庫優化,優化代碼(如算法),硬件升級(CPU,內存,SSD等)

 

參考資料:

https://blog.csdn.net/qq_19004627/article/details/79804562

https://blog.csdn.net/AlbenXie/article/details/78507361

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章