併發程式設計、並行、多執行緒、鎖、同步、非同步、多執行緒、單執行緒、阻塞io、非阻塞io
一、
cpu的每一個核在同一時間下,只能執行一個執行緒,就是單核同一時間只能執行一個執行緒
而cpu可以不停的切換,這樣就導致使用者感覺可以執行多個執行緒,這是併發,而不是並行
併發和並行
你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。
你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支援併發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支援並行。
併發的關鍵是你有處理多個任務的能力,不一定要同時。並行的關鍵是你有同時處理多個任務的能力。
程序和執行緒
程序就是一個執行的程式,其中一個程序有單獨的資源和記憶體空間,而執行緒是在程序中的執行單元,其中一個程序可以
多執行緒在操作同一個資源的時候,就會出現問題,所以就出現鎖的問題,執行緒安全,執行緒不安全都是圍繞這個話題來講的,其中mysql的操作也是圍繞這個來的
多執行緒和非阻塞的區別
IO操作其實可以分成兩個步驟,請求IO操作和執行IO操作。
一般的IO呼叫過程是這樣的:發起IO操作的請求,執行IO操作,得到IO操作的結果,將結果返回給IO操作請求。
阻塞和非阻塞:側重點是在響應方的策略
阻塞:就是處理完使用者的請求之後進行響應資料
非阻塞:就是在不管有沒有處理完資料,都立刻給使用者響應,這裡是響應,而不是主動通知,這個響應式傳送方不斷的輪詢的
同步和非同步:側重點是在傳送方的策略
同步是在傳送方傳送請求後一直等待響應方的響應,
非同步是在傳送方傳送請求之後不管有沒有響應,就不管理,而是等待響應方主動給傳送方通知
同步/非同步關注的是訊息通知的機制,而阻塞/非阻塞關注的是程式(執行緒)等待訊息通知時的狀態。
dubbo就是用了nio+rpc協議的的原理
Nginx高併發的原理:使用了多路複用和多程序(單執行緒)的原理來實現高併發的
4 小明的故事# 對上面所講的概念再次進行一個場景梳理,上面已經明確說明,同步/非同步關注的是訊息通知的機制,而阻塞/非阻塞關注的是程式(執行緒)等待訊息通知時的狀態。以小明下載檔案打個比方,從這兩個關注點來再次說明這兩組概念,希望能夠更好的促進大家的理解。
同步阻塞:小明一直盯著下載進度條,到 100% 的時候就完成。 同步體現在:等待下載完成通知;
阻塞體現在:等待下載完成通知過程中,不能做其他任務處理;
同步非阻塞:小明提交下載任務後就去幹別的,每過一段時間就去瞄一眼進度條,看到 100% 就完成。 同步體現在:等待下載完成通知;
非阻塞體現在:等待下載完成通知過程中,去幹別的任務了,只是時不時會瞄一眼進度條;【小明必須要在兩個任務間切換,關注下載進度】
非同步阻塞:小明換了個有下載完成通知功能的軟體,下載完成就“叮”一聲。不過小明仍然一直等待“叮”的聲音(看起來很傻,不是嗎)。 非同步體現在:下載完成“叮”一聲通知;
阻塞體現在:等待下載完成“叮”一聲通知過程中,不能做其他任務處理;
非同步非阻塞:仍然是那個會“叮”一聲的下載軟體,小明提交下載任務後就去幹別的,聽到“叮”的一聲就知道完成了。 非同步體現在:下載完成“叮”一聲通知;
非阻塞體現在:等待下載完成“叮”一聲通知過程中,去幹別的任務了,只需要接收“叮”聲通知即可;【軟體處理下載任務,小明處理其他任務,不需關注進度,只需接收軟體“叮”聲通知,即可】
也就是說,同步/非同步是“下載完成訊息”通知的方式(機制),而阻塞/非阻塞則是在等待“下載完成訊息”通知過程中的狀態(能不能幹其他任務),在不同的場景下,同步/非同步、阻塞/非阻塞的四種組合都有應用。 --------------------- 作者:調皮的玩程式碼 來源:CSDN 原文:https://blog.csdn.net/weily11/article/details/80309007 版權宣告:本文為博主原創文章,轉載請附上博文連結!