此條目介紹的是操作系统里存储器管理的一种技术。关于浏览器的分页,请见「
分页 (GUI)」。
分頁(英語:Paging),是一種作業系統裡記憶體管理的一種技術,可以使電腦的主記憶體可以使用儲存在輔助記憶體中的資料。作業系統會將輔助記憶體(通常是磁盘)中的資料分割成固定大小的區塊,稱為「頁」(pages)。當不需要時,將分頁由主記憶體(通常是内存)移到輔助記憶體;當需要時,再將資料取回,載入主記憶體中。相對於分段,分頁允許記憶體儲存於不連續的區塊以維持檔案系統的整齊。[1]分页是磁盘和内存间传输数据块的最小单位。
分頁/虛擬記憶體能有助“大大地”降低整體及額外非必要的 I/O 次數,提高系統整體運作效能。因為這能有助提高 RAM 的讀取命中率,也透過其內部的高效率算法來達到 I/O 數據流的預緩存工作,通過與之相關的等等手段也能很好地提高了 CPU 的使用效率,而擁有大實體記憶體的用戶更可能考慮利用如Ramdisk、Supercache、SoftPerfect RAM Disk等模擬出硬碟分區來同時將虛擬記憶體/系統临时檔案等設置其上以進一步加強系統效能,及達至保障硬碟的措施。分頁是虛擬記憶體技術中的重要部份。
概覽
分頁就是當資料並沒有映射在隨機存取記憶體上時,作業系統必需控制使程式繼續運行所會做的動作。一般來說,作業系統會將運行中程序的資料放至隨機存取記憶體上空的幀中,將不需要的資料從幀上清除,但如果隨機存取記憶體沒有空的幀可用,作業系統會把一部分的資料存回輔助記憶體然後釋放。輔助記憶體會用分頁的方式將檔案存在經過平均分配大小的頁上,等到隨機存取記憶體需要使用時再寫回。如果在隨機存取記憶體釋放資料過後還需要更新資料,系統必須將資料先寫回後更新,再存入輔助記憶體中。高效能的系統需要在替換隨機存取記憶體上的資料時消耗較少的時間,所以一般的系統會採取最近最少使用演算法(LFU)來達到較高的效果。
命中和缺页
由于更早地被发明(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的位置,超過的部分將不能被電腦進行分頁使用記憶體。
參考資料
參見