死鎖
資源限制的挑戰
併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於硬體和軟體的資源限制問題
即使是單核處理器也支援多執行緒執行**,cpu通過給每個執行緒分配cpu時間片來實現這個機制。時間片是cpu分配給各個執行緒的時間,因為時間片非常短,所以cpu通過不停的切換執行緒執行,讓我們感覺多個執行緒是同時執行的,時間片一般是幾十毫秒(ms)。
cpu通過時間片分配演算法來迴圈執行任務,當前任務執行乙個時間片後會切換到下個任務,但是在切換前會儲存上乙個任務的狀態,以便下次切換回這個任務時,可以再載入這個任務的狀態。所以任務的儲存到再載入的過程就是一次上下文切換
[root@qxkj-s2 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 516560 3135424 0 6940864 0 0 0 149 1 0 1 0 98 0 0
0 0 516560 3135020 0 6940864 0 0 0 112 1013 1302 1 0 99 0 0
0 0 516560 3135052 0 6941056 0 0 0 0 867 1139 0 0 99 0 0
0 0 516560 3135176 0 6941056 0 0 0 0 855 1207 0 0 100 0 0
cs(content switch)表示上下文切換的次數,從上面的測試結果中,我們可以看到其中上下文的每一秒鐘切換1000多次
大概幾十毫秒
鎖是個非常有用的工具,運用場景非常多,因為其使用起來非常簡單,而且易於理解。但同時它也會帶來一些困擾,那就是可能會引起死鎖,一旦產生死鎖,會造成系統功能不可用,哲學家進餐問題就是經典的死鎖案例
對於硬體資源限制,可以考慮使用集群並行執行程式,既然單機的資源有限制,那麼就讓程式在多機上執行,比如使用odps,hadoop或者自己搭建伺服器集群,不同的機器處理不同的資料,比如將資料id%機器數,得到乙個機器編號,然後由對應編號的機器處理這筆資料。
對於軟體資源限制,可以考慮使用資源池將資源復用,比如使用連線池將資料庫和sorket連線復用,或者呼叫對方webservice介面獲取資料時,只建立乙個連線。
併發程式設計的挑戰
併發程式設計的目的是為了讓程式執行的更快,但是,並不是啟動更多的執行緒就能讓程式最大限度的併發執行。在進行併發程式設計的時候,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如 上下文切換的問題 死鎖的問題以及受限於硬體和軟體資源限制問題。cpu通過時間片分配演算法來迴圈執行任務...
JAVA併發1 併發程式設計的挑戰
乙個cpu同一時刻只能執行乙個執行緒 cpu 通過給每個執行緒分配一定的時間片,時間片非常短,通常是幾十毫秒,來不停的切換執行緒執行任務,達到了多執行緒的效果。當執行緒用完自己的時間片後,及時任務還沒有完成,作業系統也會剝奪它的執行權,讓另一條執行緒執行。當一條執行緒的時間片用完後,作業系統會暫停該...
併發程式設計的藝術(一) 併發程式設計的挑戰
含義 cpu通過給每個執行緒分配cpu時間片實現多執行緒執行 當前任務執行乙個時間片後會切換下乙個任務,但切換前會儲存上乙個任務的狀態,從儲存到載入的過程就是一次上下文切換。但執行緒會有建立和上下文切換的開銷,所以多執行緒不一定快。減少上下文切換方法 無鎖併發程式設計 如id按hash演算法取模,不...