併發在於結構,並行在於執行
程式:本文所說的程式是指為了完成某個具體任務,而開發的一套軟體,其微觀動態上可以是(一組程序,多個執行緒,或者是一組協程執行體)
並行就是在任一粒度的時間內都具備同時執行的能力:最簡單的並行就是多機,多台機器並行處理;smp表面上看是並行的,但是由於是共享記憶體,以及執行緒間的同步等,不可能完全做到並行;
併發是在規定的時間粒度內多個請求都得到執行和處理,強調的是給人的感覺,實際可能是分時操作,重在避免阻塞,使程式不會因為乙個阻塞而停止處理,最典型的應用場景就是:分時作業系統就是一種併發設計(忽略多核cpu);
在當前的計算機單機體系下:並行具有瞬時性,併發具有過程性;
在非計算密集型應用中,cpu的處理能力是非常出眾的,cpu大都因為等待其他部件而阻塞,(磁碟,網路,其他裝置);此時為了發揮cpu的執行效率,就需要將乙個大程式拆分為多個執行體(多執行緒,多程序),最大限度的發揮
cpu的處理能力,提高程式吞吐量,這也是多執行緒,多程序程式設計的最大目的。
併發強調的是程式的設計粒度,粒度小,排程快,給人在感覺上同時處理(避免阻塞,等待時間短);
程式在執行中可能遇到各種等待,等待io操作,所以在設計程式結構時,將其設計成多個執行體,乙個執行體阻塞,其他執行體能正常執行;
實現併發的技術有多種:多程序訊息佇列,多執行緒,協程(go的goroutine併發設計理念,當然多個goroutine的通訊和鎖機制是另乙個主題);
協程一般需要軟體庫支援或者語言層面的支援,在使用者態再做一層排程,協程是更小使用者態的執行體,可以有成千上萬,底層支撐是多執行緒來執行,最複雜的就是支撐排程的執行時(golang是在語言層面解決,程式設計師簡單實用go就可以,排程完全是語言執行時去解決)。
並行就是同時處理,其屬於更底層的東西,一般是cpu和作業系統開發者需要著重考慮的問題:cpu功耗,cpu排程和負載平衡等等;
作為普通的程式設計師,唯一可以選擇的就是充分借助os提供的介面結合實際需求合理設計程式(常見的高效能程式設計模式:多程序,多執行緒,協程(使用者態執行緒排程));
#執行緒數量選擇:
如果所有的任務都是計算密集型的,此時系統上跑的核心執行緒數和cpu核心數保持一致,能最大限度的發揮cpu的優勢;
如果任務是io密集型的任務,我們可以開闢更多的執行緒執行任務;當乙個任務執行io操作的時候,執行緒將會被阻塞,處理器立刻會切換到另外乙個合適的執行緒去執行。
#預設如果不是在裸機上寫程式,某人說自己寫並行程式,其實是在扯淡,隔著一層os,程式設計師不能控制cpu的並行執行,其只能委託給os去處理,實際上大多數程式設計師只能通過os提供的特性來提公升程式併發處理能力,os提供的往往都是多執行緒,多程序模型;當然高階語言的執行時提供使用者態協程;
#os為應用程式的並行和併發執行提供了天然的基石,其提供的程序排程就是一種併發手段,其使用cpu多核的能力是一種並行手段;單個程序的應用程式,多個程序的應用程式在os上跑著;應用程式不能決定自己並行執行能力,但是可以併發的執行。
linux之父linus都認為平行計算基本上就是浪費大家的時間,可見並行程式設計領域充滿分歧和爭議。
Mysql高併發線上經驗總結
mysql總大連線限制 mysql會有最大連線數,預設最大連線著在150左右 這個數值的作用就是總的連線如果超過150,其它連線就無法連線上了,這個引數是可以配置的。mysql寫入壓力大時,讀的速度是否會有影響 mysql 寫入一張表壓力大的時候,這張表會有寫鎖存在,寫鎖存在會影響讀的速度。影響還是...
對於大併發的思考
一般如果是壟斷組織,用佇列就行了,讓客人慢慢等,不過如果不是的話,在技術上就沒有了競爭力 現在一般來講,大併發的瓶頸都在資料庫上現在一般是走兩條路 1.分庫,把主要資料按照一定規則的劃分,再分布在不同的伺服器上,這樣來分散伺服器的寫操作.2,存記憶體,用memerydb等工具把資料分布式存在不同的伺...
javaweb對於高併發策略 快取
前言 在系統開發過程中,經常遇到資料重複插入 重複更新 訊息重發傳送等等問題,因為應用系統的複雜邏輯以及網路互動存在的不確定性,會導致這一重複現象,但是有些邏輯是需要有冪等特性的,否則造成的後果會比較嚴重,例如訂單重複建立,這時候帶來的問題可是非同一般啊。什麼是系統的冪等性 冪等是資料中得乙個概念,...