1.對於變量的定義,局部變量確實放在棧中,但是靜態變量或者全局變量放在程序數據段中;動態內存請求的內存是從堆中分配的。堆棧和數據段由程序管理和使用,而堆中內存的分配和回收必須由系統管理。
2.當程序動態申請內存時,程序通過API向系統中堆管理器的前端分配器申請。如果堆段中有合適的內存,就將它分配給程序。如果沒有,堆管理器通過後端分配器應用到系統虛擬內存管理器。
3.初始堆段、堆棧、代碼段和數據段占用的內存是在創建進程時由系統虛擬內存管理器分配的。
4.在創建進程的時候,會進行很多復雜的操作,比如從系統內存池申請內存來創建進程的關鍵結構,比如頁表和內核對象,創建進程的虛擬內存空間,從虛擬內存空間分配內存加載器,從虛擬內存空間分配內存初始化堆和棧。
5.虛擬內存管理器只管理虛擬內存,虛擬內存地址需要經過兩次分段和分頁的轉換,才成為虛擬內存的物理內存地址。當妳訪問虛擬內存時,它可能與物理內存不對應,也可能被切換到硬盤,所以確保妳能訪問正確的物理內存也是系統的任務。
6.要分配內存,虛擬內存管理器必須首先在虛擬地址空間中找到壹個合適的地址,然後從頁框數據庫中找到壹個合適的物理內存,通過分段和分頁機制將這個物理內存映射到這個虛擬地址,然後將這個地址返回給申請人。
7.除了動態內存的應用,其他的內存都是在進程初始化中應用的,所以使用時不需要再次應用,效率當然高。申請動態內存的時候,流程可能很簡單。程序調用API向堆管理器申請,堆管理器從初始化的堆段中為妳找壹塊內存。有時這個過程可能很復雜。程序詢問堆管理器,堆管理器詢問虛擬內存管理器,虛擬內存管理器詢問物理內存管理器。
8.總之,這是壹個非常復雜的過程,也說明了壹個操作系統在資源管理方面的強大功能。