linux的使用者程序是如何使用記憶體的
linux程序使用記憶體的基本流程:
圖1從上圖中我們可以看出,程序的堆,並不是直接建立在linux的核心的記憶體分配策略上的,而是建立在glibc的堆管理策略上的(也就是glibc的動態記憶體分配策略上),堆的管理是由glibc進行的。
所以我們呼叫free對malloc得到的記憶體進行釋放的時候,並不是直接釋放給作業系統,而是還給了glibc的堆管理實體,而glibc會在把實際的物理記憶體歸還給系統的策略上做一些優化,以便優化使用者任務的動態記憶體分配過程。
那麼glibc的堆管理器在什麼時候才把物理記憶體歸還給系統呢?
它會從堆的最大線性位址開始,從後向前計算使用者任務當前有多少空閒的堆記憶體(直到碰到使用中的堆記憶體位址為止),比如在下圖中,
圖2它會認為有2048k的可釋放記憶體,只有在該值大於某個特定的threshhold時(2.3.6上為64k),它才會把這些記憶體歸還給系統。而在中間的「未使用」記憶體是不會歸還給系統的,所以系統也不可能再利用這塊物理記憶體頁(我們假設系統沒有swap區和swap檔案),也就是說系統的記憶體會為此減少,除非在它之前的堆記憶體都用free進行釋放以後,glibc的堆管理器才有可能(只是有可能)把該段記憶體歸還給系統。
由此,我們在使用malloc/free時應該小心,特別是在初始化時分配了好多記憶體,但是在這之後卻再也不需要這麼多的記憶體了,而這塊記憶體又沒有達到threshhold值或者在堆的最高線性位址處有某塊記憶體沒有釋放,但是它前面的所有堆記憶體都釋放了;這種情況下,使用者任務將會浪費一些物理記憶體,這在資源比較緊張的嵌入式系統中是不可容忍的。
Linux的使用者程序是如何使用記憶體的
linux 的使用者程序是如何使用記憶體的 linux 程序使用記憶體的基本流程 圖 1 從上圖中我們可以看出,程序的堆,並不是直接建立在 linux 的核心的記憶體分配策略上的,而是建立在 glibc 的堆管理策略上的 也就是 glibc 的動態記憶體分配策略上 堆的管理是由 glibc 進行的。...
Linux使用者程序是如何釋放記憶體的 zt
linux使用者程序是如何釋放記憶體的 linux程序使用記憶體的基本流程 見圖1從圖中我們可以看出,程序的堆,並不是直接建立在linux的核心的記憶體分配策略上的,而是建立在glibc的堆管理策略上的 也就是glibc的動態記憶體分配策略上 堆的管理是由glibc進行的。所以我們呼叫free對ma...
核心是如何管理程序的
程序管理負責控制程序對 cpu 的訪問,如任務的建立 排程和終止等。任務排程是程序管理最核心的工作,由 linux 核心排程器來完成。linux 核心排程器根據程序的優先順序選擇最值得執行的程序。乙個程序的可能狀態有如下幾種 1 執行態 已經獲得了資源,並且程序正在被 cpu 執行。程序既可執行在核...