記憶體池常見問題

2021-09-18 01:33:56 字數 996 閱讀 9749

首先,threadcache沒有記憶體,向centralcache申請的時候,是申請乙個批量的記憶體,比如你要1個,那我就一次申請20個,當然20個這個具體數字也不是固定的,你想申請50個,80個也是沒問題的,只是擔心申請多了,用不完;假設要1個,那我就一次申請20個,申請20個需要進行一次加鎖,但是剩下的19次申請記憶體,就不用加鎖了,直接去threadcache拿就行了;

如果乙個執行緒要的是8位元組的記憶體,另外乙個執行緒要的也是8位元組的記憶體,這時候肯定是需要加鎖的,乙個申請完了,另外乙個再申請,但是有可能是乙個要的是8位元組,乙個要的是16位元組的,這時候就不用加鎖了,這時候我們就可以把鎖的力度控制的更小,一般而言,鎖的力度越小,是越好的(鎖的力度大,就是一把鎖,把這兒全鎖住了,這就是大鎖);我們可以把鎖的力度控制的很小,乙個span控制乙個鎖,意味著只要訪問不用的,就不用加鎖,所以只要兩個執行緒不是申請同樣大小的記憶體時,是不需要加鎖的;這也是為什麼不把間隔都設定為8位元組,如果都設定為8位元組,每乙個位置都有乙個鎖,這樣每乙個位置就會有乙個浪費,但是如果按照我們的控制在%12的內碎片浪費得話,就只有184個鎖,就會減少好多浪費。

直接掛物件的話,只考慮了平衡,掛span,是因為它是以頁為單位的一些記憶體物件的集合,它裡面有乙個使用計數usecount,usecount最開始為0,申請乙個記憶體出去,usecount+批量大小,當這些記憶體物件還回來時,usecount--,當usecount減到0表示span就可以**了,找它的前乙個頁和後一頁,如果它們的usecoun也為0,就可以進行合併,這就是為什麼還要記錄它的頁號的原因。

centralcache掛的是多個span,span的_list裡面是切好的物件,centralcache的span關注的是span裡面切好的物件,這個切好的物件是給threadcache用的,還關注usecount,當所有的物件回來時即usecount為0時,就會把當前span還給pagecache;

pagecache的span不關注切好的物件,它關注的是整頁的記憶體,申請時,是把大的span切成小的span的過程,釋放時,是把小的span合併成大的span,從而解決記憶體碎片問題。

Linux共享記憶體常見問題分析

這個是接上篇,本來是記錄在一篇草稿上的,但是,內容根本不相關,排版怎麼都覺得不好看,也不方便以後查閱。乾脆再起一篇。shmget函式用來建立乙個新的,或者訪問乙個已存在的共享記憶體區。include include int shmget key t key,size t size,int oflag...

電腦記憶體常見問題處理方法

相信眾多朋友在使用電腦時,總會遇到這樣或那樣的各種問題。如啟動電腦卻無法正常啟動 無法進入作業系統或是執行應用軟體,無故經常宕機等故障時,這些問題的產生常會因為記憶體出現異常故障而導致操作失敗。這是因為記憶體做為電腦中三大件配件之一,主要擔負著資料的臨時訪問任務。而市場上記憶體條的質量又參差不齊,所...

電腦記憶體常見問題處理方法

相信眾多朋友在使用電腦時,總會遇到這樣或那樣的各種問題。如啟動電腦卻無法正常啟動 無法進入作業系統或是執行應用軟體,無故經常宕機等故障時,這些問題的產生常會因為記憶體出現異常故障而導致操作失敗。這是因為記憶體做為電腦中三大件配件之一,主要擔負著資料的臨時訪問任務。而市場上記憶體條的質量又參差不齊,所...