分頁
分頁(英語:Paging),是一種作業系統裏記憶體管理的一種技術,可以使電腦的主記憶體可以使用儲存在輔助記憶體中的資料。作業系統會將輔助記憶體(通常是磁碟)中的資料分割成固定大小的區塊,稱為「頁」(pages)。當不需要時,將分頁由主記憶體(通常是主記憶體)移到輔助記憶體;當需要時,再將資料取回,載入主記憶體中。相對於分段,分頁允許記憶體儲存於不連續的區塊以維持檔案系統的整齊。[1]分頁是磁碟和主記憶體間傳輸數據塊的最小單位。
分頁/虛擬記憶體能有助「大大地」降低整體及額外非必要的 I/O 次數,提高系統整體運作效能。因為這能有助提高 RAM 的讀取命中率,也透過其內部的高效率演算法來達到 I/O 數據流的預快取工作,通過與之相關的等等手段也能很好地提高了 CPU 的使用效率,而擁有大實體記憶體的用戶更可能考慮利用如Ramdisk、Supercache、SoftPerfect RAM Disk等模擬出硬碟分區來同時將虛擬記憶體/系統臨時檔案等設置其上以進一步加強系統效能,及達至保障硬碟的措施。分頁是虛擬記憶體技術中的重要部份。
概覽
分頁就是當資料並沒有對映在隨機存取記憶體上時,作業系統必需控制使程式繼續運行所會做的動作。一般來說,作業系統會將運行中程式的資料放至隨機存取記憶體上空的幀中,將不需要的資料從幀上清除,但如果隨機存取記憶體沒有空的幀可用,作業系統會把一部分的資料存回輔助記憶體然後釋放。輔助記憶體會用分頁的方式將檔案存在經過平均分配大小的頁上,等到隨機存取記憶體需要使用時再寫回。如果在隨機存取記憶體釋放資料過後還需要更新資料,系統必須將資料先寫回後更新,再存入輔助記憶體中。高效能的系統需要在替換隨機存取記憶體上的資料時消耗較少的時間,所以一般的系統會採取最近最少使用演算法(LRU)來達到較高的效果。
命中和缺頁
由於更早地被發明(20世紀60年代早期),類似CPU-記憶體之間的SRAM快取,虛擬記憶體系統使用不同的術語。
- 虛擬記憶體系統中,DRAM快取命中,為稱讀取一個地址時,該地址在DRAM快取中的過程。命中過程不需要程式再從磁碟中緩慢讀取數據。[2]
- 相對地,DRAM不命中稱為缺頁(page fault)。由於頁幀由有效位和實際頁號(或磁碟地址)構成,當有效位標記為0時,即表明該地址未在快取中,呼叫該地址則會引發缺頁異常,從而從磁碟中拷貝需要的內容,覆蓋快取中的一個犧牲頁,從而能夠命中。過多的缺頁將導致反覆的磁碟讀取和寫入,非常耗費計算時間。
系統顛簸
儘管在整個執行過程中程式參照的不同頁面總數(也就是虛擬記憶體大小)可能超出物理記憶體(DRAM)總大小,但是程式常常在較小的活動頁面(active page)上活動,這個集合叫作工作集(working set)或常駐集(resident set)。在工作集被快取後,對它的反覆呼叫將使程式命中提高,從而提高效能。
大部分的程式都可以在記憶體獲取資料和讀取中達到穩定的狀態,當程式達到穩定狀態時,記憶體的使用量通常都不會太大。虛擬記憶體雖然可以有效率的去控制記憶體的使用,但解決大量的頁缺失還是造成系統遲緩的主要因素。當工作集的大小超過物理記憶體大小,程式將發生一種不幸的情況,這種情況被稱為「顛簸(Thrashing)」,頁面將不停地寫入、釋放、讀取,由於大量的遺失(而非命中)而損失極大效能。[3]使用者可以增加隨機存取記憶體的大小或是減少同時在系統裏執行程式的數量來降低系統顛簸的概率。
頁面排程
- 當需要用到資料時再向系統請求,使系統將資料由輔助記憶體傳入記憶體上,這就叫「需求分頁」。它使得系統不需要將全部的程式都放在記憶體上,減少了所需要的記憶體的數量。[4][5][6]所有現代系統都使用按需頁面排程(paging)的方式。
- 當系統檢視分頁表時認為某些資料可能需要用到,而先將資料傳到記憶體上的行為,就叫做「先行分頁」, 當記憶體夠大的話通常會採取這種方式。[6]
- Unix系統會定期使用sync程式來清理所有經過更動的幀,它會將所有被更動過的幀存到輔助記憶體中。Windows系統有時亦會進行類似功能的操作,它可以使新程式在開啟時更快速。
分享
在多任務處理或多用戶的環境下,經常遇到不同的程式需要用到相同的資料,如果採用個別處理的話,很多的記憶體會被浪費掉,分享的功用使不同的程式可以使用相同的記憶體。分享功能還需注意的是系統必須要分離經過修改過後的資料以防止其他程式需要用到修改前的資料。
實作
Ferranti Atlas
第一台支援分頁系統的電腦是Atlas,[7][8] 這台電腦有着分割成各250字的分頁的結合儲存。
Windows 3.X和Windows 9x
微軟為了要使1990年的Windows 3.x不像Windows 1.0或Windows 2.0一樣需要大量的硬件資源,因而把分頁系統加到Microsoft Windows內。系統會創造名為 386SPART.PAR 或 WIN386.SWP 的隱藏檔來跟記憶體交換檔案,通常可以在根目錄找到,有時候也會生成在 WINDOWS 資料夾中。此檔案的大小決定分頁檔的大小(可以在控制面板中調整),如果使用者移動或刪除這個檔案會在下次開機時出現藍屏死機。
Windows NT
在Windows NT的系統中(如Windows XP、Vista、7、8 等),分頁檔名為 pagefile.sys 並儲存在根目錄中。有時在開機磁區會出現系統崩潰並出現記憶體傾印的狀況,Windows系統會將分頁檔作為暫存用途,並在下次重起系統時釋放分頁檔的空間。
Unix及類Unix系統
在Unix及類Unix系統中,系統會定期更新隨機存取記憶體與虛擬記憶體間的資料,其中有些系統會在硬碟上劃一塊專門的區塊作為分頁檔交換檔案用,稱為交換分區(swap partitions),有些系統還可以把這個區塊用檔案的形式出現。
Linux
在Linux核心2.6以上中,因為系統可以直接繞過其他程式直接跟檔案形式的分區交換,分區檔的速度已經可以跟交換分區一樣快了,[9]且分區檔可以自動被存放在硬碟讀取最頻繁的地方,不過紅帽公司還是建議將硬碟劃專門區塊做使用。不過使用檔案形式的分區的靈活度較高,可以自由存放在任一個磁碟,更改成任一大小,在硬碟劃專門區塊後除非使用特殊的工具,否則無法更動位置及大小。Linux可以建立無數個分區,並將檔案排優先順序,硬碟讀取越頻繁的地方通常越是系統優先使用該分區,因此要謹慎的排好優先順序,否則會大大的降低系統的效能。
OS X
OS X使用多重的分區檔案,雖然它可以存到其他的地方,但預設就會將檔案存到硬碟的根目錄中。
32位元硬件限制
由於32位元的硬件地址匯流排最高只能定址到4GB的位置,超過的部分將不能被電腦進行分頁使用記憶體。
參考資料
- ^ RAM, virtual memory, pagefile, and memory management in Windows. Microsoft. [2012-11-26]. (原始內容存檔於2015-03-03).
- ^ 《深入理解電腦系統》(美)Randal E.Bryant, David R. O'Hallaron 著.機械工業出版社(2010).第九章 虛擬記憶體. 9.3. Page538.
- ^ 《深入理解電腦系統》(美)Randal E.Bryant, David R. O'Hallaron 著.機械工業出版社(2010).第九章 虛擬記憶體. 9.3. Page540.
- ^ 请求分页技术. 2008-03-06 [2012-11-27].[永久失效連結]
- ^ 需求分頁 - 台灣科技大學. [2012-11-27]. (原始內容存檔於2016-03-04).
- ^ 6.0 6.1 虛擬記憶體管理 - 和春技術學院. [2012-11-27]. (原始內容 (PPT)存檔於2013-12-03).
- ^ Atlas. Computer50. [2012-11-27]. (原始內容存檔於2012-07-28).
- ^ Atlas Architecture. Chilton-computing.org.uk. [2012-11-27]. (原始內容存檔於2012-12-10).
- ^ Andrew Morton: Re: Swap partition vs swap file. LKML.ORG. [2012-11-27]. (原始內容存檔於2010-11-24).