UNIX進階環境編程(15)進程和記憶體配置 < 故宮角樓 >,故宮角樓

來源:互聯網
上載者:User

UNIX進階環境編程(15)進程和記憶體配置 < 故宮角樓 >,故宮角樓

故宮角樓是很多攝影愛好者常去的地方,夕陽餘輝下的故宮角樓平靜而安詳。

 

首先,瞭解一下進程的基本概念,進程在記憶體中布局和內容。

此外,還需要知道運行時是如何為動態資料結構(如鏈表和二叉樹)分配額外記憶體的。

一 進程1 進程和程式

進程:是一個可執行程式的執行個體。

程式:包含一系列資訊的檔案,這些資訊描述了如何在運行時建立一個進程。包含如下資訊:

進程的再定義:進程是由核心定義的抽象的實體,並為該實體分配用以執行程式的各項系統資源。

從核心的角度看,進程由使用者記憶體空間和一系列核心資料結構組成,其中使用者記憶體空間包含了程式碼及代碼所使用的變數,而核心資料結構則用於維護進程狀態資訊。

2 典型的進程記憶體布局

每個進程所分配的記憶體由很多部分組成,通常稱之為“段(segment)”。如所示:

將經過初始化的全域變數和靜態變數與未經過初始化的全域變數和靜態變數分開存放,其主要原因在於程式在磁碟上儲存時,沒有必要為未經過初始化的變數分配儲存空間。相反,可執行檔只需記錄未初始化資料區段的位置及所需要大小,直到運行時再由程式載入器來分配這一空間。

需要注意一點時,該記憶體布局的討論是在虛擬記憶體中的,並不是實體記憶體中的布局。

在後面會專門討論虛擬記憶體的一些細節。

 

二 記憶體配置1 在堆上分配記憶體

堆:一段長度可變的連續虛擬記憶體,始於進程的未初始化資料區段末尾,隨著記憶體的分配和釋放而增減。將堆的當前記憶體頂部邊界稱為“程式中斷(program break)”

program break是一個非常重要的概念,因為分配和釋放記憶體的實際動作就是改變進程的program break位置。

program break的起始位置(堆的大小為0)位於未初始化資料區段末尾之後。

細節:在分配新的記憶體後,program break位置升高,程式可以訪問新分配地區內的任何記憶體位址,而此時實體記憶體頁尚未分配。記憶體會在進程首次試圖訪問這些虛擬記憶體地址時自動分配新的實體記憶體頁。

函數malloc和free

malloc函式宣告

#includevoid *malloc(size_t size); 

作用:在堆上分配參數size位元組大小的記憶體。

傳回值:成功返回指向新分配記憶體起始地址的指標,失敗返回NULL

free函式宣告 

#includevoid free(void *ptr);


作用:釋放ptr參數所指向的記憶體塊,該參數應該是之前由malloc或者其他記憶體配置函數之一所返回的地址。

需要注意的是:一般情況下,free並不降低program break的位置,而是將這塊記憶體增加到空閑記憶體列表中,供後續的malloc函數迴圈使用。因為:

  • 被釋放的記憶體塊通常位於堆的中間,而非堆的頂部,因而降低program break是不可能的。
  • 它最大限度地減少了核心調用調整program break系統調用的次數。
  • 通常程式會持有分配的記憶體或者反覆釋放和重新分配,而不是釋放所有記憶體再運行一段時間。

僅當堆頂空閑記憶體“足夠”大的時候,free函數的glibc實現會調用sbrk()來降低program break的地址,至於“足夠”與否則取決於malloc函數包行為的控制參數(128KB為典型值)。這減少了必須對sbrk()發起的調用次數。

malloc和free的實現

malloc()的實現

free()的實現

首先先瞭解兩點:malloc返回的記憶體塊和空閑列表中的記憶體塊的結構

為了知道每一個記憶體塊的大小,當malloc分配記憶體塊時,會額外分配幾個位元組來存放記錄這塊記憶體大小的整數值。該整數位於記憶體塊的起始處,而實際返回給調用者的記憶體位址恰好位於這一長度記錄位元組之後。如所示:

為了管理空閑記憶體列表,free()會使用記憶體塊本身的空間來存放鏈表指標,將自身添加到列表中。如所示:

所以,在頻繁地分配和釋放記憶體之後,堆中的鏈表可能會變成的樣子,空閑鏈表中的空閑記憶體會和已指派的在用記憶體混雜在一起。

 

三 編程需要注意的事項

通過對記憶體相關知識更多的瞭解,在平時編程的時候,應更清楚為什麼我們需要遵守下面的規則。

 
雖然在我們平時的工作當中,可能涉及不到這麼底層的原理,但是通過對這些基本原理的瞭解,可以讓我們更加清除,我們寫代碼究竟在寫些什麼 :)

 

參考資料:

《Linux/Unix系統編程手冊(上冊)》 第6章,第7章 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.