工作集合(working set)
看看你實際怎麼用一座大廚房:在任一段烹飪時間裡,你只會一再伸手去拿少數幾樣工具與食材,即使櫥櫃裡放著數百樣。那一小撮當下正熱門的東西就是你的工作集合,而它會隨著你從切菜轉到煎炒、再轉到擺盤而移動。對執行中的程式而言,工作集合(working set)就是它在目前這個執行階段正在積極使用的分頁集合——是其整個位址空間中一個小而緩慢漂移的子集。
具體來說,工作集合是在最近一段時間視窗上定義的:程式在譬如最近幾十萬條指令裡碰過的那些分頁。程式具有區域性,所以這個集合通常遠小於程式的總記憶體,並會穩定一陣子,然後在程式進入新階段(不同的迴圈、新的資料結構)時移動。關鍵的經驗法則很簡單:若作業系統讓每個行程的工作集合常駐在實體頁框中,分頁錯誤就稀少,程式跑得順暢。若所有執行中行程的工作集合加起來超過可用頁框,系統就無法讓它們常駐,開始輾轉——不斷逐出它馬上又要用的分頁。
為何重要:工作集合這個概念既解釋了需求分頁為何有效(你只需要讓熱門分頁常駐,而非整支程式),也指出它在哪裡崩潰(輾轉,當工作集合溢出記憶體時)。它引導作業系統決定要給每個行程多少頁框、要逐出哪些(像最近最少使用這類替換策略,就是在近似「保住工作集合」)。誠實的說法:虛擬記憶體良好的效能並非魔法——它完全建立在「真實程式具有工作集合」這個經驗事實上。一旦破壞那份區域性,這個錯覺很快就變得昂貴。
一支處理串流的程式,某一刻可能只讓 50 頁保持熱門,儘管它的位址空間橫跨百萬頁。給它那 50 個頁框,它就從不引發錯誤;讓它低於 50,錯誤就爆增。
讓工作集合常駐,分頁就隱形;讓它挨餓,系統就輾轉。
輾轉就是工作集合概念失效之時:當所有工作集合的總和超過 RAM,作業系統逐出它立刻又要用回來的分頁,於是大半時間都花在分頁而非計算上。解方是加 RAM 或降低並行度——而不是更快的 CPU。