當系統建立乙個程序同時為其建立它位址空間時,此位址空間中大部分都是閒置的。為了使用這部分位址空間,我們必須呼叫virtualalloc來分配其中的區域。分配區域的操作被稱為預定。
當應用程式預定位址空間區域時,系統會確保預定的區域的起始位址正好是分配粒度的整數倍。分配粒度根據不同的平台而有所不同。現在所有的平台都是用相同的分配粒度。大小為64kb。
而對於預定的位址空間的大小,系統會確保區域的大小正好是系統頁面大小的整數倍。x86和x64系統使用的頁面大小為4kb。
如果應用程式預定一塊大小為10kb的位址空間區域。那麼系統會將該請求取整到頁面大小的整數倍。在x86和x64系統中系統會預定一塊大小為12kb的區域。
當程式不再需要訪問所預定的位址空間區域時,應該釋放該區域可以呼叫virtualfree函式來完成。
調撥物理儲存區
前面預定的位址空間僅僅是標記此塊空間已有人使用,其他程式不能再次預定此塊區域。為了使用所預定的位址空間區域,我們還必須分配物理儲存器,並將儲存器對映到所預定的區域。這個過程叫做調撥物理儲存器。
可以通過呼叫virtualalloc來調撥物理儲存器。物理儲存器的調撥是以頁面為單位來調撥的。並不需要為所有預定的區域都調撥物理空間。可以僅調撥需要使用的區域。調撥後程式就可以訪問記憶體空間了。
當程式不需要訪問所預定的區域中已調撥的物理儲存器,應該釋放物理儲存器。這個過程被稱為撤銷調撥物理儲存器。這是通過呼叫virtualfreee函式來完成。
物理儲存器和頁交換檔案
如今的作業系統可以對磁碟進行虛化,來擴充套件記憶體,這部分區域被稱為分頁檔案或頁交換檔案,其中包含虛擬記憶體,可用程式使用。
記憶體和磁分頁檔案共同構成了總記憶體。
頁交換檔案增大了應用程式可用記憶體的總量。實際上,這時作業系統與cpu分工協作,把記憶體中的一部分儲存到頁交換檔案,並在應用程式的時候再將頁交換檔案中的對應部分載入記憶體。
當應用程式呼叫virtualalloc函式來把物理儲存器調撥給位址空間區域時,該空間實際上是從硬碟的頁交換檔案中得到的。
為了能夠使用虛擬記憶體,當執行緒試圖訪問儲存器中的乙個位元組中,cpu必須知道該位元組是在記憶體中還是在磁碟上。
二:不在記憶體中,而是位於頁交換檔案中。這次不成功的訪問將會觸發缺頁中斷。發生缺頁中斷時中斷處理程式會在記憶體中找到乙個閒置的頁面,然後將資料從頁交換檔案複製到記憶體中。
當使用者執行乙個程式時,系統會開啟應用程式對應的exe檔案。計算出應用程式的**和資料的大小。然後系統會預定一塊位址空間,並註明與該區域相關聯的物理儲存器就是exe檔案本身。系統並沒有從頁交換檔案中分配空間,而是將exe檔案作為程式預定空間的後備儲存器。這樣一來,程式載入很快,頁交換檔案也可以保持在乙個合理的大小。
當乙個程式位於硬碟上的檔案映像作為位址空間區域對應的物理儲存器時,我們稱這個檔案映像為記憶體對映檔案。當載入乙個dll或exe時,系統會自動預定位址空間並把檔案映像對映到該區域。除此之外系統還允許我們手動將資料檔案對映到位址空間。
windows可以使用多個頁交換檔案。如果多個頁交換檔案位於不同的物理硬碟上,那麼系統就可以執行得更快。我們可以在設定頁交換檔案大小。
windows 位址空間分配
當系統建立乙個程序同時為其建立它位址空間時,此位址空間中大部分都是閒置的。為了使用這部分位址空間,我們必須呼叫virtualalloc來分配其中的區域。分配區域的操作被稱為預定。當應用程式預定位址空間區域時,系統會確保預定的區域的起始位址正好是分配粒度的整數倍。分配粒度根據不同的平台而有所不同。現在...
空間與位址分配
我們知道,可執行檔案中的 段和資料段都是由輸入的目標檔案中合併而來的。那麼鏈結器是如何將它們的各個段合併到輸出檔案?或者說,輸出檔案中的空間如何分配給輸入檔案的。最簡單的方案就是直接將各個目標檔案依次合併,但是這樣做輸出檔案將會有很多零散的段。這種做法非常浪費空間,因為每個段都需要有一定的位址和空間...
記憶體位址空間與分配
在32計算機中,它的最大記憶體容量是2 32次方 4個gb大小 它是由無符號整形從0 4gb順序構成。0位址對應乙個儲存單元 8bit 1位址也對應乙個儲存單元 8bit 以此類推。如果乙個資料對應的位址是0 3位址,那麼它佔3個儲存單元,也就是3個位元組。由於32位微機的位址匯流排寬度為32位,所...