malloc的底層實現


1. Allocate分配器中,如何解決多線程鎖的爭奪問題?

答:為了解決多線程鎖的爭奪問題,內存分配器分為了主分配區main_area和非主分配區no_main_area。主分配區和非主分配區

主分配區和非主分配區們形成一個環形鏈表,每一個分配區都是由一個互斥鎖來控制,主分配區可以通過brk和mmap實現內存的分配,非主分配區只能通過mmap實現,在收集小內存的時候,ptmalloc也要對分配進行上鎖操作。

在執行當前線程的時候,會查看當前線程的私有變量是否已經有分配區,如果存在的話,嘗試是否能加鎖,如果能加鎖的話,就使用該分配區分配內存。否則,遍歷環形鏈表查看是否有空閑的,能上鎖的分配區,如果有的話,使用該內存分配區去分配內存;如果沒有的話,malloc會再分配一個分配區供當前線程使用,同時將該分配區加入到環形鏈表中。

 

2. 在一台內存為2G的機器上,malloc(20G) 會怎樣?如果是new(20G) 會怎樣?

答:

  • 首先,malloc和new申請的都是虛擬內存。和物理內存沒有直接關系

  • 每個進程允許的虛擬內存是4G,如果是20G的話,已經超出了4G這個上限,無法申請。
  • new的話,底層實現還是malloc,在分配失敗的時候會拋出bad_alloc類型的異常

 

內容參考:

https://blog.csdn.net/z_ryan/article/details/79950737


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM