日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆概述(一)

發布時間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆概述(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在程序運行過程中,堆可以提供動態分配的內存,允許程序申請大小未知的內存。堆其實就是程序虛擬地址空間的一塊連續的線性區域,它由低地址向高地址方向增長。我們一般稱管理堆的那部分程序為堆管理器。

堆管理器處于用戶程序與內核中間,主要做以下工作

1.響應用戶的申請內存請求,向操作系統申請內存,然后將其返回給用戶程序。同時,為了保持內存管理的高效性,內核一般都會預先分配很大的一塊連續的內存,然后讓堆管理器通過某種算法管理這塊內存。只有當出現了堆空間不足的情況,堆管理器才會再次與操作系統進行交互。

⒉管理用戶所釋放的內存。一般來說,用戶釋放的內存并不是直接返還給操作系統的,而是由堆管理器進行管理。這些釋放的內存可以來響應用戶新申請的內存的請求。

Linux 中早期的堆分配與回收由Doug Lea實現,但它在并行處理多個線程時,會共享進程的堆內存空間。因此,為了安全性,一個線程使用堆時,會進行加鎖。然而,與此同時,加鎖會導致其它線程無法使用堆,降低了內存分配和回收的高效性。同時,如果在多線程使用時,沒能正確控制,也可能影響內存分配和回收的正確性。Wolfram Gloger在Doug Lea的基礎上進行改進使其可以支持多線程,這個堆分配器就是ptmalloc。在glibc-2.3.x.之后, glibc中集成了ptmalloc2。

堆相關的數據結構

堆的操作相當的復雜,那么在glibc內部必然也有精心設計的數據結構來管理它。與堆相應的數據結構主要分為宏觀結構,包含堆的宏觀信息,可以通過這些數據結構索引堆的基本信息。微觀結構,用于具體處理堆的分配與回收中的內存塊。

該結構體定義了有6個變量

微觀結構 malloc chunk

fd指向下一個元素

bk執向前一個元素

一個chunk 在內存中的狀態

這里 上一個chunk加上size 就能找到下一個chunk的位置

當該chunk被釋放的時候

當一個chunk處于使用狀態時,它的下一個chunk的prev_size域無效,所以下一個chunk的該部分也可以被當前chunk使用。這就是chunk中的空間復用。

總結

以上是生活随笔為你收集整理的堆概述(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。