Unix系統程式設計()brk,sbrk

2021-09-08 13:59:58 字數 857 閱讀 7552

在堆上分配記憶體

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

下面也會學習一族函式brk,sbrk和malloc。

調整program break:brk和sbrk

改變堆的大小(即分配或釋放記憶體),其實就像命令核心改變程序的program break位置一樣簡單。最初,program break正好位於未初始化資料段末尾之後(和&end位置相同)。

在program break的位置抬公升後,程式可以訪問新分配區域內的任何記憶體位址,而此時物理記憶體頁尚未分配。核心會在程序首次試圖訪問這些虛擬記憶體位址時自動分配新的物理記憶體頁。

傳統的unix系統雖然提供了兩個操縱program break的系統呼叫:brk和sbrk,在linux中依然可以用。雖然**很少直接使用這些系統呼叫,但了解它們有助於弄清記憶體分配的工作過程。

int brk(void *end_data_segment);

void *sbrk(intptr_t increment);

系統呼叫brk會將program break設定為引數end_data_segment所指定的位置。由於虛擬記憶體頁以頁為單位進行分配,end_data_segment實際會四捨五入到下乙個記憶體頁的邊界處。

當試圖將program break設定為乙個低於其初始值(即低於&end)的位置時,有可能會導致無法預知的行為,例如,當程式試圖訪問的資料位於初始化或未初始化資料段中當前尚不存在的部分時,就會引發段記憶體訪問錯誤(segmentation default)(sigse**訊號)。

program break可以設定的精確上限取決於一系列因素。

unix系統程式設計

popen pclose popen介面定義 include file popen const char command,const char type int pclose file stream popen函式會建立乙個管道,並且建立乙個子程序來執行shell,shell會建立乙個子程序來執行c...

UNIX系統程式設計1

man 你想查詢的內容 如果man你也不會用也不要緊,那你就 man man 一下,呵呵。只可惜好像還沒有翻譯成中文,對於像我這樣英文水平還有待提高的朋友來說讀起來有點麻煩。最後還有乙個好工具就是網路,有什麼不會的google一下好多問題都能解決。好,囉嗦的半天,說歸正傳,免得給大家造成光說不練的印...

Unix系統程式設計()lseek系統呼叫

之前知道lseek這個系統呼叫可以改變檔案的偏移量,或者叫偏移量或指標。檔案偏移量是指執行下乙個read或者write操作的檔案起始位置,會以相對於檔案頭部起始點的檔案當前位置來表示。檔案第乙個位元組的偏移量為0。檔案開啟時,會將檔案偏移量設定為指向檔案的開始,以後每次read或write呼叫將自動...