執行緒的理解和併發解決方案
一,併發和並行的區別
並行:同時做某些事,可以互不干擾的同一時刻做幾件事(不一定同時)。
並行:同一時刻做某些事,但是強調同一時刻做了幾件事。
併發的解決方案
1,佇列,緩衝區
假設只有一個視窗,陸續進入食堂打飯,排隊的人就是佇列,先進先出,解決資源使用問題。排成的佇列,就是緩衝區。
2,爭搶
只開一個窗戶,可能沒有秩序,誰的拳頭大是吃飯,拳頭大的搶到視窗,打完飯離開,後面的繼續爭搶再到下一個拳頭大的。不管怎麼爭搶,總會只有一個人佔據視窗,這個時候這個視窗只為這個人服務,不再為其他人提供服務,這就是一種鎖機制。
爭搶是一種高併發的解放方案,但是,不好,因為有人比較弱小,長時間抵不過拳頭大的。
3,預處理
如果排長隊的原因,是由於每個人打飯等候時間過長,比如要吃的菜沒有,要現炒,沒打著飯菜不走,鎖定佔著視窗。
可以提前統計大多數人愛吃的飯菜,最愛吃的80%的飯菜提前做好,保證供應,20%的冷門菜,現做。這樣可以大大的減少排隊打飯的時間,這種提前載入使用者需要的思路,預處理思想,快取常用。
4,並行
很多人來打飯,一個視窗搞不定,開多個窗戶排多個佇列,並行打飯。但是多開視窗,就意味著更多打飯的師傅守在視窗提供服務,造成成本的上升。日常可以通過更多伺服器,或多開程序,執行緒實現並行處理,來解決併發問題,注意這些是水平擴充套件思想。
5,提速
提高單個視窗的打飯速度,也是解決高併發的方式。打飯人員提高工作技能,打飯人員換成手腳麻利的年輕人,或者單個視窗配置更多的服務人員,比如上菜,打飯的由不同的人來做,甚至為每某幾個菜配置一個服務人員,都是提速的方法。
6,訊息中介軟體
地鐵站外的走廊曲折,緩衝人流,進去之後在多口過安檢進站。常見的訊息中介軟體有RabbitMQ,ActiveMQ,RocketMQ,kafka等。
當然還有其他的解決方案比如分散式之類的,但是已經列舉了常用的解決方案,不同的併發場景比如秒殺服務,訪問量大的網站等是具有不同的策略的,而策略可能就是多種方式的優化組合。
例如食堂多開,開分店(多地),也可以把食堂修到距離員工最近的地方(就近)等。
二,程序和執行緒
執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位,一個程式的執行例項就是一個程序。
執行緒(thread),有時候也被稱為輕量級程序(LightWeight Process,LWP),是程式執行的最小單元。一個標準的執行緒由執行緒ID,當前指令指標,暫存器集合和堆疊組成。
程序和執行緒區別:
地址空間:同一個程序的執行緒共享本執行緒的地址空間,而進城之間則是獨立的地址空間。
資源擁有:同一個程序內的執行緒共享本程序的資源如記憶體,I/O,CPU等,但是程序之間是獨立的。
一個程序崩潰後,在保護模式下不會對其他程序造成影響,但是一個執行緒崩潰整個程序都會死掉。多以程序比執行緒更加健壯。
程序切換時,消耗的資源大,效率高。所以涉及到頻繁的切換時,使用執行緒要優於程序。
執行緒的狀態
狀態 | 含義 |
---|---|
就緒(Ready ) | 執行緒能夠執行,但在等待被排程。可能執行緒剛剛被建立,或剛剛從阻塞中恢復,或者被其它執行緒搶佔 |
執行(Runnning) | 執行緒正在執行 |
阻塞(Blocked) | 執行緒等待外部事件發生而無法執行,如等待I/O操作 |
終止(Terminated) | 執行緒完成,或退出,或被取消 |
轉載於:https://blog.51cto.com/berniem2m/2372602