1. 程式人生 > >線程的理解和並發解決方案

線程的理解和並發解決方案

運算 一個 吃飯 離開 提前 fff 1.5 調度 有時

一,並發和並行的區別

並行:同時做某些事,可以互不幹擾的同一時刻做幾件事(不一定同時)。
並行:同一時刻做某些事,但是強調同一時刻做了幾件事。

並發的解決方案

1,隊列,緩沖區
假設只有一個窗口,陸續進入食堂打飯,排隊的人就是隊列,先進先出,解決資源使用問題。排成的隊列,就是緩沖區

2,爭搶

只開一個窗戶,可能沒有秩序,誰的拳頭大是吃飯,拳頭大的搶到窗口,打完飯離開,後面的繼續爭搶再到下一個拳頭大的。不管怎麽爭搶,總會只有一個人占據窗口,這個時候這個窗口只為這個人服務,不再為其他人提供服務,這就是一種鎖機制。
爭搶是一種高並發的解放方案,但是,不好,因為有人比較弱小,長時間抵不過拳頭大的。

3,預處理

如果排長隊的原因,是由於每個人打飯等候時間過長,比如要吃的菜沒有,要現炒,沒打著飯菜不走,鎖定占著窗口。
可以提前統計大多數人愛吃的飯菜,最愛吃的80%的飯菜提前做好,保證供應,20%的冷門菜,現做。這樣可以大大的減少排隊打飯的時間,這種提前加載用戶需要的思路,預處理思想,緩存常用。

4,並行

很多人來打飯,一個窗口搞不定,開多個窗戶排多個隊列,並行打飯。但是多開窗口,就意味著更多打飯的師傅守在窗口提供服務,造成成本的上升。日常可以通過更多服務器,或多開進程,線程實現並行處理,來解決並發問題,註意這些是水平擴展思想。

5,提速

提高單個窗口的打飯速度,也是解決高並發的方式。打飯人員提高工作技能,打飯人員換成手腳麻利的年輕人,或者單個窗口配置更多的服務人員,比如上菜,打飯的由不同的人來做,甚至為每某幾個菜配置一個服務人員,都是提速的方法。

提高單個CPU性能,或單個服務器安裝更多的CPU。這是一種垂直擴展思想。

6,消息中間件

地鐵站外的走廊曲折,緩沖人流,進去之後在多口過安檢進站。常見的消息中間件有RabbitMQ,ActiveMQ,RocketMQ,kafka等。
當然還有其他的解決方案比如分布式之類的,但是已經列舉了常用的解決方案,不同的並發場景比如秒殺服務,訪問量大的網站等是具有不同的策略的,而策略可能就是多種方式的優化組合。
例如食堂多開,開分店(多地),也可以把食堂修到距離員工最近的地方(就近)等。

二,進程和線程

線程是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位,一個程序的執行實例就是一個進程。

進程(process),是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。
線程(thread),有時候也被稱為輕量級進程(LightWeight Process,LWP),是程序執行的最小單元。一個標準的線程由線程ID,當前指令指針,寄存器集合和堆棧組成。
進程和線程區別:
地址空間:同一個進程的線程共享本線程的地址空間,而進城之間則是獨立的地址空間。
資源擁有:同一個進程內的線程共享本進程的資源如內存,I/O,CPU等,但是進程之間是獨立的。
一個進程崩潰後,在保護模式下不會對其他進程造成影響,但是一個線程崩潰整個進程都會死掉。多以進程比線程更加健壯。
進程切換時,消耗的資源大,效率高。所以涉及到頻繁的切換時,使用線程要優於進程。

線程的狀態
狀態 含義
就緒(Ready ) 線程能夠運行,但在等待被調度。可能線程剛剛被創建,或剛剛從阻塞中恢復,或者被其它線程搶占
運行(Runnning) 線程正在運行
阻塞(Blocked) 線程等待外部事件發生而無法運行,如等待I/O操作
終止(Terminated) 線程完成,或退出,或被取消

技術分享圖片

線程的理解和並發解決方案