記憶體分配器一

2021-07-09 10:34:30 字數 2375 閱讀 9749

glibc記憶體管理學習

x86平台linux程序記憶體布局:

text:elf格式程式**

data:程式執行時就能確定的資料,可讀可寫

bss:沒有初始化的全域性變數和靜態表裡

heap

stack:由編譯器自動分配釋放,存放函式引數、區域性變數等

mmap:對映區域

實現乙個malloc

分頁與位址

現代作業系統中,不論是虛擬記憶體還是物理記憶體,都不是以位元組為單位進行管理的,而是以頁(page)為單位。一般記憶體頁的大小為4k(4096byte),需要12位的位址,記憶體位址是以頁號加乙個12位的偏移組成。

實現malloc

void * malloc(size_t size)

函式的主要功能是分配大小至少為size引數所指定的位元組數並返回乙個乙個指標指向該記憶體位址的首位址

實現參照

首先簡單實現函式:

imalloc.h:

#ifndef imalloc_h

#define imalloc_h

#include

#include

void *imalloc(size_t size);

#endif`

imalloc.c:

#include

"imalloc.h"

void

*imalloc(size_t size)

其中函式

void *sbrk(intptr_t increment);

是用來獲取heap區域的break點,由於受物理儲存量的限制,整個堆虛擬記憶體空間不可能全部對映到實際物理記憶體位址中。從堆起始位址到break之間的位址空間為對映好的,可以供程序訪問;而從break往上,是未對映的位址空間,如果訪問這段空間則程式會報錯。

main.c:

#include"imalloc.h"

int main(void)

編譯鏈結可以在gdb中除錯:

gcc -g main.c imalloc.c -o main

(gdb) main

(gdb) start

然後執行到

(gdb) n

10 p[2]=3;

可以檢視記憶體如下,p[0]和p[1]中的值為1和2

(gdb) x/8a p

0x804b000: 0x1 0x2 0x0 0x0

0x804b010: 0x0 0x0 0x0 0x0

越界操作,修改了p[2]位址中的值

(gdb) n

11 pp[0]=4;

(gdb) x/8a p

0x804b000: 0x1 0x2 0x3 0x0

0x804b010: 0x0 0x0 0x0 0x0

然後執行將值修改回來

(gdb) n

12 pp[1]=5;

(gdb) x/8a p

0x804b000: 0x1 0x2 0x4 0x0

0x804b010: 0x0 0x0 0x0 0x

當執行到pp[1028]=10這段**之前,可以修改當前heap的break後面記憶體的值。

(gdb) n

14 pp[1028]=10;

(gdb) x/8a p

0x804b000: 0x1 0x2 0x4 0x5

0x804b010: 0x5 0x0 0x0 0x0

當前break指向的位址為如下所示,在pp[2]之前

(gdb) display cur

1: cur = (void *) 0x804b00c

但是當我們訪問超出一頁記憶體(4k)時,會報錯

program received signal sigsegv, segmentation fault.

0x080484a7 in main () at main.c:14

14 pp[1028]=10;

說明了一點heap上面對映的區域是一頁一頁對映的,當訪問當前break之後的一頁的記憶體時會出錯。

當修改**為如下時,則可以正常執行。

int

*pp=(int

*)imalloc(sizeof(int)*1028);

ACE記憶體分配器一

ace的記憶體分配器都是支援ace allocator介面。the definition of this class is located in malloc.cpp.class ace allocator brief inte ce for a dynamic memory allocator t...

記憶體分配 定長記憶體分配器

在各種記憶體分配演算法中,有一種很實用,實現起來也簡單 定長的記憶體分配器。即每次分配的記憶體大小是固定的。大概邏輯是 在一些區域性的單執行緒邏輯中,可以有效提高效率。很短,很容易看懂 fallocator.h pragma once 固定長度的記憶體分配器 include include incl...

(六)記憶體分配器

c 的stl中定義了很多容器,容器的第二個模板引數通常為allocator型別。標準庫中allocator類定義在標頭檔案memory中,用於幫助將記憶體分配和物件的構造分離開來。它分配的記憶體是原始的 未構造的。allocatoralloc 定義了乙個可以分配string的allocator物件 ...