1:什麼時候windows 會快取檔案資料
當檔案沒有使用file_flag_no_buffering標誌並且不是做為對映檔案開啟的時候,windows會對檔案資料進行快取。自然那些直接訪問磁碟的方法是無法快取資料
2:快取的大小和位置
可以看出快取位於系統位址空間的兩個位置,c1000000-e0ffffff,a4000000-bfffffff 一共960m的空間,這是快取的最大值,而快取的實際大小是和系統的物理記憶體相關的,具體的計算方法是:
128 mb + (x mb - 16 mb) / 4 mb * 64 mb,其中的x是系統安裝的物理記憶體的大小。也就是說如果系統有
1g的物理記憶體,那麼快取的實際大小是16256m,這已經遠遠大於系統所能提供的最大值,那麼系統的快取值如何確定呢?如果largesystemcache登錄檔項為1,那麼快取的大小是960m,如果其為0,則快取的實際大小為512m,使用windbg可以檢視當前系統的快取的大小:
從圖中可以看出當前系統的快取大小是1332m,很顯然這不符合上面的公式了,這很可能
是sp3做的乙個修正。
3:快取的資料格式
快取被劃分為最小定址單位為256k的乙個個檢視,每個檢視使用乙個虛擬位址描述塊來描述,
快取管理器初始化的時候從非分頁記憶體中分配一塊記憶體用於存放描述整個快取的vacb塊。
4:快取的使用
我們通過windwos api來操作檔案的時候需要指定乙個檔案控制代碼,乙個檔案控制代碼對應於乙個
檔案物件,我們可以對同乙個檔案開啟多個控制代碼,也就是說乙個檔案擁有多個檔案物件,但乙個
檔案只有乙個記憶體區物件,對系統來說乙個檔案就是意味著乙個記憶體區物件。快取的使用正是
從這裡展開的。
通過控制代碼-->檔案物件-->檔案記憶體區物件-->共享的檔案快取表。在共享的檔案快取表
中存在vacb的索引陣列,陣列第乙個元素標識檔案第乙個256k在vacb陣列中的索引,依次
類推。如此就可以知道需要的檔案內容是否被快取,已經被快取在快取的什麼地方了。可以通過
windbg來驗證一下:
1:首先先獲取乙個檔案控制代碼,這裡我們通過開啟乙個檔案的方式來獲取:
測試的時候得到的檔案控制代碼是0x00000fdc, 所在的程序id是 d70, 控制代碼都是位於程序的控制代碼表中的。
2:通過windbg的!handle命令獲取物件的檔案物件資訊
從上可以看出檔案物件位於 0x86c93b30.
3:通過windbg的dt命令獲取檔案記憶體區物件的資訊
從上圖可以看出記憶體區物件(sectionobjectpointer)位於0x873f0a9c
4:通過記憶體區物件獲取檔案共享快取表
從圖中看共享快取表為空,這是因為上面只是開啟了檔案而還沒有進行讀寫,而檔案快取是發生在讀寫的時候,
下面我們修改程式,讀取檔案實驗一下:
可以看出共享快取表已經不為空了。通過講sharedcachemap結構dump出來即可知道檔案在快取中的
分配情況了。
其中的initialvacbs是乙個四個vacb元素的陣列,存放檔案前1m的vacb塊,vacbs用來存放檔案後面的vacb塊。
Windows的記憶體管理
一位址空間 1.位址空間 乙個程式最大的定址範圍。對於win32作業系統,最大的定址範圍為2的32次方。2.位址空間的劃分 通常情況下 2.1使用者空間 執行應用程式的 資料等。2.1.1 空指標區 null區 位址範圍 0 0x0000ffff 2.1.2 使用者區 位址範圍 0x0001000 ...
ArcGlobe 快取管理
arcglobe擁有快取機制,因此可以應對大量3d資料的視覺化,下面就總結下有關快取的知識點。首先,需要了解,arcglobe具有兩種快取機制 記憶體快取,硬碟快取。記憶體快取指的是分配可供 arcglobe 使用的物理記憶體 ram 大小。要獲得最佳效能,可設定對每個所使用的資料型別所分配的記憶體...
PHP快取管理
快取管理 param mixed name 快取名稱,如果為陣列表示進行快取設定 param mixed value 快取值 param mixed options 快取引數 return mixed function s name,value options null elseif is arra...