Linux環境應用程式設計(二) 記憶體分配

2021-10-10 06:36:57 字數 1554 閱讀 4912

許多系統程式需要為動態資料結構(鍊錶和二叉樹)分配額外記憶體,此類資料結構的大小由執行時獲取的資訊決定。

程序可以通過增加堆的大小來分配記憶體,所謂堆是一段長度可變的連續虛擬記憶體,始於程序的未初始化資料段末尾,隨著記憶體的分配和釋放而增減,通常將堆的當前記憶體邊界稱為「program break」。

1、調整program break

#include int brk(void *addr);

void *sbrk(intptr_t increment);

改變堆的大小其實就像命令核心改變程序的program break位置一樣。program break位置抬高後,程式可以訪問新分配區域內的任何記憶體位址,而此時物理記憶體頁尚未分配。核心會在程序首次試圖訪問這些虛擬記憶體位址時自動分配新的物理記憶體頁。

brk:系統呼叫會將program break設定為引數addr所指定的位置,由於虛擬記憶體是以頁為單位進行分配,addr實際會四捨五入到下乙個記憶體頁的邊界。如果addr值低於初始值&end時會導致無法預知的行為。

2、malloc()和free()

#include void *malloc(size_t size);

void free(void *ptr);

free:ptr引數指向記憶體塊,一般為malloc呼叫返回值。

3、calloc()和realloc()

void *calloc(size_t nmemb, size_t size);

void *realloc(void *ptr, size_t size);

calloc:nmemb指定分配物件的數量,size指定每個物件的大小。返回值為指向該記憶體的指標,如果分配失敗則返回null,calloc分配的記憶體已經被初始化為0。

realloc:在已有記憶體的基礎上調整記憶體的大小。

上面兩個記憶體請求呼叫均由free()來釋放。

4、分配對齊的記憶體:memalign()和posix_memalign()

#include int posix_memalign(void **memptr, size_t alignment, size_t size);

#include void *memalign(size_t alignment, size_t size);

#include void *alloca(size_t size);
alloca()呼叫也是可以動態分配記憶體,不過不是從堆上分配記憶體,而是通過增加棧幀的大小從堆疊上分配。不能使用free來釋放,會隨著棧幀的移除自動釋放。

Linux環境應用程式設計(九) Camera

1 概念 可以支援多種裝置,它可以有以下幾種介面 5 收音機介面 radio inte ce 可用來處理從am或fm高頻頭裝置接收來的音訊流.v4l2在linux系統中的結構圖 2 程式設計模式 v4l2是針對uvc免驅usb裝置的程式設計框架,主要用於採集usb攝像頭等,程式設計模式如下 2 申請...

Linux串列埠應用程式設計

常見的資料通訊的基本方式可分為並行通訊與序列通訊兩種。1.並行通訊是指利用多條資料傳輸線將乙個字資料的各位元位同時傳送。它的特點是傳輸速度快,適用於傳輸距離短且傳輸速度較高的通訊。2.序列通訊是指利用一條傳輸線將資料以位元位為單位順序傳送。特點是通訊 線路簡單,利用簡單的線纜就可實現通訊,降低成本,...

Linux應用程式設計 mmap

二話不說,上來就問下那個man name mmap,munmap map or unmap files or devices into memory synopsis include void mmap void addr,size t length,int prot,int flags,int f...