優化多執行緒安全的記憶體池

2022-05-03 11:00:34 字數 806 閱讀 4295

記憶體池的實現和管理(一)

記憶體池的實現和管理(二)

雖然在記憶體申請和釋放的時候,使用lock_guard()實現了多執行緒安全的記憶體池,但是頻繁的加鎖和解鎖帶來了不必要的上下文切換開銷,導致整個記憶體池的使用效能下降許多(主要體現在單次申請釋放/釋放記憶體需要的時間上公升),和直接向系統申請記憶體的效率差許多

也就是說,雖然可以減少記憶體碎片的產生,但是並不能提高申請記憶體的效率

在多執行緒情況下,申請記憶體時加鎖是必然的,每次申請向記憶體池申請記憶體塊的時候都要即時加鎖,但是釋放記憶體塊的時候我們可以延時釋放,做乙個定時任務去遍歷記憶體池中管理記憶體塊的鍊錶,加鎖一次釋放多個記憶體塊,這樣就減少了釋放記憶體塊時的加鎖次數

在記憶體池中釋放記憶體塊有兩個步驟:

1、把記憶體使用標記從已使用狀態改為未使用

2、第乙個未使用記憶體塊指標的移動

釋放記憶體時只要求第2步需要互斥進行,所以我們在釋放的時候先修改標記狀態(不加鎖),執行一次定時任務,遍歷管理記憶體塊的鍊錶,修改第乙個未分配記憶體塊的指標(加鎖)

產生衝突的根本原因是因為多個執行緒共用乙個記憶體池,我們可以讓每個執行緒都擁有乙個記憶體池,這樣記憶體塊的申請和釋放都在本執行緒內進行,自然不用加鎖

但是這樣在多執行緒的 情況下使用不方便,記憶體利用率低下,並且管理記憶體池很繁瑣

換乙個思路,依然時多個執行緒共用乙個記憶體池,但是我們給不同的執行緒安排不同的記憶體使用區域,這樣即時不加鎖也可以實現記憶體池的互斥使用

具體做法是可以給num個記憶體塊進行編號,假設有n個執行緒,每個執行緒可使用的記憶體塊個數t=num/n,根據執行緒id確定該執行緒使用的記憶體區域為[t*(id-1),t*id);id的取值範圍為[1,n]

參考部落格

多執行緒 執行緒池

第一 降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。第二 提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。第三 提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一分配 調優和監控...

多執行緒 執行緒池

執行緒池是什麼 執行緒池 thread pool 是一種基於池化思想管理執行緒的工具,經常出現在多執行緒伺服器中,如mysql。執行緒過多會帶來額外的開銷,其中包括建立銷毀執行緒的開銷 排程執行緒的開銷等等,同時也降低了計算機的整體效能。執行緒池維護多個執行緒,等待監督管理者分配可併發執行的任務。這...

多執行緒 執行緒池

執行緒池的作用 減少了每次建立 銷毀執行緒所帶來的損耗。執行緒池建立執行緒的簡易流程 文字描述 1 先判斷核心執行緒池 corepoolsize 是否已滿,沒滿就建立核心執行緒執行,滿了就進行下一判斷。2 判斷等待佇列 workqueue 是否已經滿了,沒滿就新增到等待佇列,滿了就進行下一判斷。3 ...