一個進程當前使用的頁的集合叫做它的工作集(working set)。如果整個工作集都在記憶體中,在進入下一個運行階段之前進程的運行不會引起很多頁面故障。如果記憶體太小無法容納整個工作集,進程運行將引起大量的頁面故障並且速度十分緩慢。一個每隔幾條指令就發生一次頁面故障的程式被稱為是在顛簸。
現代電腦系統中記憶體的訪問速度遠遠高於外存的訪問速度。如果系統中不產生缺頁中斷,則訪問資料的時間約等於記憶體訪問時間。但是如果發生缺頁中斷,則需要從外存中將該頁調入,因此會大大降低系統效能。通過對缺頁率的長期研究,Denning提出了工作集理論。由於程式在運行時對頁面的訪問是不均勻的(即局部性),如果能夠預知程式在某段時間內要訪問那些頁面,並將它們提前調入記憶體,這將降低缺頁率,提高CPU利用率。
進程工作集
因為頻繁的調頁操作引起的磁碟I/O會大大降低程式的運行效率,因此對每一個進程,虛擬記憶體管理器都會將其一定量的記憶體頁駐留在實體記憶體中。並跟蹤其執行的效能指標,動態調整這個數量。Win32中駐留在實體記憶體中的記憶體頁稱為進程的"工作集"(workingset),進程的工作集可以通過"工作管理員"查看,其中"記憶體使用量"列即為工作集大小。
工作集是會動態變化的,進程初始時只有很少的字碼頁和資料頁被調入記憶體。當執行到未被調入記憶體的代碼或者訪問到尚未調入記憶體的資料時,這些字碼頁或者資料頁會被調入實體記憶體,工作集也隨之增長。但工作集不能無限增長,系統為每個進程都定義了一個預設的最小工作集(根據系統實體記憶體大小,此值可能為20~50 MB)和最大工作集(根據系統實體記憶體大小,此值可能為45~345 MB)。當工作集到達最大工作集,即進程需要再次調入新頁到實體記憶體中時,虛擬記憶體管理器會將其原來的工作集中的某些頁先置換出記憶體,然後將需要調入的新頁調入記憶體。
因為工作集的頁駐留在實體記憶體中,因此對這些頁的訪問不涉及磁碟I/O,相對而言非常快;反之,如果執行的代碼或者訪問的資料不在工作集中,則會引發額外的磁碟I/O,從而降低程式的運行效率。一個極端的情況就是所謂的顛簸或抖動(thrashing),即程式的大部分的執行時間都花在了調頁操作上,而不是代碼執行上。
如前所述,虛擬記憶體管理器在調頁時,不僅僅只是調入需要的頁,同時還將其附近的頁也一起調入記憶體中。綜合這些知識,對開發人員來說,如果想提高程式的運行效率,應該考慮以下兩個因素。
(1)對代碼來說,盡量編寫緊湊代碼,這樣最理想的情形就是工作集從不會到達最大閥值。在每次調入新頁時,也就不需要置換已經載入記憶體的頁。因為根據locality特性,以前執行的代碼和訪問的資料在後面有很大可能會被再次執行或訪問。這樣程式執行時,發生的缺頁錯誤數就會大大降低,即減少了磁碟I/O,在圖5-6中也可以看到一個程式執行時截至當時共發生的缺頁錯誤次數。即使不能達到這種理想情形,緊湊的代碼也往往意味著接下來執行的代碼更大可能就在相同的頁或相鄰頁。根據時間locality特性,程式80%的時間花在了20%的代碼上。如果能將這20%的代碼盡量緊湊且排在一起,無疑會大大提高程式的整體運行效能。
(2)對資料來說,盡量將那些會一起訪問的資料(比如鏈表)放在一起。這樣當訪問這些資料時,因為它們在同一頁或相鄰頁,只需要一次調頁操作即可完成;反之,如果這些資料分散在多個頁(更糟的情況是這些頁還不相鄰),那麼每次對這些資料的整體訪問都會引發大量的缺頁錯誤,從而降低效能。利用Win32提供的預留和提交兩步機制,可以為這些會一同訪問的資料預留出一大塊空間。此時並沒有分配實際儲存空間,然後在後續執行過程中產生這些資料時隨需為它們提交記憶體。這樣既不浪費真正的實體儲存體(包括調頁檔案的磁碟空間和實體記憶體空間),又能利用locality特性。另外記憶體池機制也是基於類似的考慮。
此外,工作集和駐留集不同,駐留集指當前在主存中的頁面集,而工作集指不久後所需要的頁面集。
resident set, In a virtual memory system, a process' resident set is that
part of a process' address space which is currently in main memory. If this
does not include all of the process' working set, the system may thrash.
working set, The working set of a program or system is that memory or set
of addresses which it will use in the near future.This term is generally used
when discussing miss rates at some storage level; the time scale of "near
future" depends upon the cost of a miss. The working set should fit in the
storage level; otherwise the system may thrash.
http://book.51cto.com/art/201006/203597.htm