第二十四天 Virtual Memory(虛擬記憶體)--(四)
Trashing現象會發生在page分配到的frame不夠多時,會很頻繁的發生page fault,會使CPU的使用效率突然急速下降。
Trashing產生:
Memory-mapped files(記憶體映射檔):
Memory-mapped file會讓一段虛擬記憶體對應於一個檔案,將檔案I/O視為經常性記憶體,不同於open()等標準系統存取。藉由memory-mapped file相關程式,直接從virtual memory讀取檔案內容,加速I/O效能。
特性:
以下是例圖:
在Windows API內shared memory步驟:
以下是例圖:
Allocating kernel memory(核心記憶體分配):
不同於user memory,多用free-memory pool分配,因為kernel需要的memory會因架構而不同,像是I/O裝置就需要連續的記憶體。
Buddy system(夥伴系統):
可以讓固定大小的區段組成更大的連續page,他的分配大小通常為2的次方。他的優點是可以快速合併成更大的chunk,但他也容易造成fragmentation,像是33KB的就只能使用64KB的page,浪費了31KB的空間。
Slab allocator(平板分配):
他是個替代策略,slab是由一或多個physically contiguous page組成,而cache由一或多個slab組成,object會去使用cache。這個方法就沒有fragmentation的問題,以下有例圖:
其他的考慮因素有:
Prepaging(預先分頁):
在pure demand paging剛開始執行時,一定會發生很多page fault,會影響CPU的效能,所以Prepaging就是要減少這種大量page fault的process startup。
Page size:
有些OS designer可以選擇page size,而要產生一個最佳大小的page需要考慮:fragmentation、page table size、resolution、I/O overhead、page fault數量、locality、TLB size。平均來說,page size大一點比較好。
TLB Reach:
TLB(translation look-aside buffer),TLB Reach代表TLB可存取的記憶體大小,他的大小由TLB size x page size決定。理想中,process的working set存放在TLB中。如果不是,那可能要花很多精力處理page fault。
Program Structure
I/O interlock:
有些page需要被鎖在記憶體內,像是用來處理I/O的page。
到這裡我們就說完虛擬記憶體啦!寫的不是很好,請多包涵~~
想問應用程式最大可使用記憶體量是多少?
是 Virtual Memory 最大量 - OS kernel 已經佔去的記憶體,
還是 user mode 也能限制應用程式的記憶體使用量,
或 max (Virtual Memory 最大量 - OS kernel 已經佔去的記憶體, user space) ?