併發程式設計的目的是為了讓程式執行得更快,但是,並不是啟動更多的執行緒就能讓程式最大限度地併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行得更快,會面臨非常多的挑戰。
即使是單核處理器也支援多執行緒執行**,cpu通過給每個執行緒分配cpu時間片來實現這個機制。時間片是cpu分配給各個執行緒的時間,因為時間片非常短,所以cpu通過不停地切換執行緒執行,讓我們感覺多個執行緒是同時執行的,時間片一般是幾十毫秒(ms)。
cpu通過時間片分配演算法來迴圈執行任務,當前任務執行乙個時間片後會切換到下乙個任務。但是,在切換前會儲存上乙個任務的狀態,以便下次切換回這個任務時,可以再載入這個任務的狀態。所以任務從儲存到再載入的過程就是一次上下文切換,如waiting的執行緒少了,系統上下文切換的次數就會少,因為每一次從waitting到runnable都會進行一次上下文的切換。
減少上下文切換的方法有無鎖併發程式設計、cas演算法、使用最少執行緒和使用協程。
避免死鎖的幾個常見方法。
對於硬體資源限制,可以考慮使用集群並行執行程式。既然單機的資源有限制,那麼就讓程式在多機上執行。比如使用odps、hadoop或者自己搭建伺服器集群,不同的機器處理不同的資料。可以通過「資料id%機器數」,計算得到乙個機器編號,然後由對應編號的機器處理這筆資料。對於軟體資源限制,可以考慮使用資源池將資源復用。比如使用連線池將資料庫和socket連線復用,或者在呼叫對方webservice介面獲取資料時,只建立乙個連線。
附:度量上下文切換帶來的消耗
·使用lmbench3 可以測量上下文切換的時長。
·使用vmstat 可以測量上下文切換的次數。
併發程式設計的挑戰
併發程式設計的目的是為了讓程式執行的更快,但是,並不是啟動更多的執行緒就能讓程式最大限度的併發執行。在進行併發程式設計的時候,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如 上下文切換的問題 死鎖的問題以及受限於硬體和軟體資源限制問題。cpu通過時間片分配演算法來迴圈執行任務...
併發程式設計學習 併發程式設計的挑戰
死鎖 資源限制的挑戰 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於硬體和軟體的資源限制問題 即使是單核處理器也支...
Java併發程式設計的挑戰
併發程式設計的目的是為了讓程式執行得更快,但是,並不是執行緒啟動的越多,就能讓程式最大限度地併發執行。併發程式設計時,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於各種硬體和軟體的資源限制問題。cpu通過時間片分配演算法來迴圈執行任務,當前任務執行乙個時間後會切換到下乙個任務。但是...