malloc 碎片整理吐核故障初步解決

2021-06-02 13:08:04 字數 771 閱讀 8847

mltp clean(mltp mmlist)  

return mmlist;

}

上面是原來的碎片整理函式. 

在while{}範圍內,nextm指向mm->next,普通情況下,這一切工作得很好(其實這裡就很不嚴謹),當跟mm相鄰的碎片剛好是mm->next的時候,mm和他相鄰的碎片已經合二為一,並且那一塊碎片已經不在鍊錶中,而nextm依然指向該碎片,從而是這塊記憶體被兩個節點描述,開始不會有什麼問題,當進行多次申請釋放之後.鍊錶就是乙個完全錯誤的記憶體描述,不吐核才更危險.那就可能一塊記憶體分配給了多個申請.後果不堪設想.

當然這還夠不成吐核的條件,由於記憶體塊的描述就在該記憶體前面相連的,如果將大的那塊分配出去了,這就破壞了這塊記憶體的描述,當申請這塊記憶體的時候,就會有機率吐核了.

問題雖然看上去解決了,不過我還是不放心,因為,我只分配記憶體進行測試,並沒有對分配的記憶體進行讀寫,所有破壞的機率不大.這可能只是其中的乙個bug.

下面是修改後的碎片整理程式

其他函式見malloc實現

mltp clean(mltp ml)while(size != mm->size);

ml = add(ml,mm);

if(mm != nextm->next)

mm = nextm->next;

else

mm = nextm->next->next;

}return ml;

}

mysql索引碎片整理 MysqL碎片整理優化

先來說一下什麼是碎片,怎麼知道碎片有多大!簡單的說,刪除資料必然會在資料檔案中造成不連續的空白空間,而當插入資料時,這些空白空間則會被利用起來.於是造成了資料的儲存位置不連續,以及物理儲存順序與理論上的排序順序不同,這種是資料碎片.實際上資料碎片分為兩種,一種是單行資料碎片,另一種是多行資料碎片.前...

mysql碎片整理 提速 MysqL碎片整理優化

先來說一下什麼是碎片,怎麼知道碎片有多大!簡單的說,刪除資料必然會在資料檔案中造成不連續的空白空間,而當插入資料時,這些空白空間則會被利用起來.於是造成了資料的儲存位置不連續,以及物理儲存順序與理論上的排序順序不同,這種是資料碎片.實際上資料碎片分為兩種,一種是單行資料碎片,另一種是多行資料碎片.前...

malloc原理和記憶體碎片

當乙個程序發生缺頁中斷的時候,程序會陷入核心態,執行以下操作 1 檢查要訪問的虛擬位址是否合法 2 查詢 分配乙個物理頁 3 填充物理頁內容 讀取磁碟,或者直接置0,或者啥也不幹 4 建立對映關係 虛擬位址到實體地址 重新執行發生缺頁中斷的那條指令 如果第3步,需要讀取磁碟,那麼這次缺頁中斷就是ma...