一、 上下文切換linux
單核處理器也支持多線程執行代碼,cpu經過給每一個線程分配cpu時間片來實現這個機制。時間片是cpu分配給每一個線程的時間,時間片很是短,因此cpu經過不停的切換線程執行,讓咱們感受多個線程是同時執行的,時間片通常是幾十毫秒。算法
CPU經過時間片分配算法來循環執行任務,當前任務執行一個時間片後會切換到下一個任務。可是切換前會保存上一個任務的狀態,以便下次切換回這個任務時,能夠再加載這個任務的狀態,因此任務從保存到再加載的過程就是一次上下文切換。數據庫
例子:使用兩個線程實現累加操做和使用串行實現累加,在百萬級別如下時,二者的效率類似,隨着數據量的不斷降低,串行效率更高;當數據量達到千萬左右及以上時,並行效率更高。編程
測試代碼性能工具:Lmbench開源工具測試上下文切換的時長;多線程
Vmstat:linux命令,測量上下文切換速度。併發
減小上下文切換:無鎖併發編程, CAS算法,使用最小線程和使用協程socket
二、死鎖工具
死鎖的出現會形成業務系統不在提供服務了,可感知;性能
避免死鎖的方法:測試
A.避免一個線程中獲取多個鎖;
B、避免一個線程在鎖內同時佔用多個資源,儘可能保證每一個鎖只佔用一個資源
C、嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制
D、對於數據庫鎖,加鎖和解鎖必須在一個數據庫鏈接裏,不然會出現解鎖失敗的狀況。
三、 資源限制的挑戰
進行併發編程時,程序執行速度受限於計算機硬件資源和軟件資源(硬件資源如帶寬,軟件資源如數據庫鏈接數和socket鏈接數等),資源的限制可能致使多線程運行比單線程運行速度更加慢;
解決:因爲單機性能必定,沒法提升,硬件方面能夠進行集羣提升處理效率;軟件層面使用資源池複用資源。