---
# System prepended metadata

title: Paging

---

Paging 將Virtual memory和Physical memory都劃分為固定大小的區塊，稱為page和frames。

以下是各個組件的說明：

* Virtual Address Space：這是process使用的地址範圍。每個process都有自己的Virtual Address Space，它不一定直接對應到Physical memory。

* Physical Address Space：這是系統中實際可用的物理memory，被劃分為固定大小的框架。

* Address Mapping Function（MAP）：此函數將Virtual 地址映射到Physical Address 。如果Virtual 地址對應的數據存在於Physical memory中，則映射函數會返回對應的Physical Address 。如果數據不存在，則返回空值（∅）。

* Address Translation：當程序引用Virtual 地址時，作業系統使用Address Mapping Function將其轉換為Physical Address 。如果Virtual 地址對應的數據存在於Physical memory中，則轉換成功。如果不存在，則OS可能需要從二級存儲（例如磁盤）中將所需的page加載到Physical memory中，然後完成轉換。

* Page Faults：如果程序訪問了一個目前未映射到Physical memory中的Virtual 地址，則會發生Page Faults。然後，OS通過從二級存儲中（例如磁盤）將所需的page加載到Physical memory中來處理此錯誤。

Paging 使得Physical memory能夠被有效利用，同時允許不同的process共享同一塊Physical memory，同時保持它們的Virtual Address Space獨立。

這種隔離和共享的組合是多道程序設計的基礎，使得多個process可以同時運行，而彼此之間不會互相干擾或影響。

每個process都有自己的Virtual Address Space，通過分頁的方式，可以讓每個process擁有一個連續的地址空間，而不受Physical memory的限制。

這樣，每個process可以以為自己獨有的方式使用內存，同時操作系統通過內部機制，保證了這些process之間的隔離性和安全性。
## Page Tables
Page Tables是一種儲存分配資訊的結構：

* 它由一系列的 Page Table Entries 組成，透過Virtual page編號進行索引。
* 在 CPU 中有一個Page Tables暫存器，指向Physical memory中的Page Tables。
* 如果page存在於memory中，Page Tables項目儲存了Physical page編號，以及其他狀態位（如被參考過、被修改過等）。
* 如果page不存在於memory中，Page Tables項目可以參考到位於磁碟上交換空間的位置。

## Page Replacement and Writes
Page Replacement and Writes 是兩個重要的概念：

* 為了降低page錯誤率，傾向於使用最近最少使用（LRU）替換策略：
    * 在訪問page時，Page Table項目中的參考位（也稱為使用位）被設置為1。
    * 由OS定期將參考位清零，以確定該page是否最近被使用過。
    * 參考位為0表示該page最近未被使用。
* 磁碟寫入需要數百萬個週期：
    * 寫入操作通常以區塊為單位，而不是單個位置。
    * 寫通過（Write-through）方法不切實際，因為寫入操作太頻繁。
    * 採用寫回（Write-back）方式。
    * 當page被寫入時，Page Table項目中的髒位被設置。

## Problems of Page Table

Page Table存在以下問題：

* Page Table過於龐大：隨著系統中process數目的增加，Page Table的大小也會增加，可能會占用大量的memory空間。
* 存取Page Table速度太慢：獲取Page Table內容需要進行一次memory讀取操作，這會增加存取page映射信息的時間成本。

Page的影響之一是可能導致龐大的Page Table大小：

* 假設Virtual Address Space為32位元，page大小為4KB，每個Page Table項目（PTE）占用4位元組。這意味著每個Virtual Address Space可能需要2^20個PTE。因此，Page Table大小為4MB。
* 可能的解決方案包括：
    * 使用界限register來限制表的大小，如果超出限制，則可以添加更多的界限register。
    * 允許page在兩個方向上擴展，因此可能需要兩個表，兩個界限register（一個用於散列，一個用於堆棧）。
    * 使用哈希方法，這樣Page Table的大小就與物理page相同。
    * 使用多級Page Table。
    * 使用Page的Page Table（即Page Table位於virtual space中）。

對於具有Two-level Page Tables結構的32位元地址空間：

* 地址分為三個部分：
    * P1 索引（10位元）：用於索引第一級Page Table（PTE1）。
    * P2 索引（10位元）：用於索引第二級Page Table（PTE2）。
    * Page offset（12位元）：指示頁內的偏移量。
考慮到Virtual 地址空間為4 GB，假設每個Page Table項目（PTE）為4 KB：

PTE1 覆蓋 4 GB / （4 KB）= 1M 個項目。
PTE2 覆蓋 4 MB / （4 KB）= 1K 個項目。
現在，讓我們考慮一個更大的地址空間，例如48位元或64位元：

* 對於48位元地址空間，Page Table結構可能保持不變，但 PTE1 和 PTE2 的項目數量將相應增加，以覆蓋更大的地址空間。您需要根據新的地址空間大小重新計算。
* 對於64位元地址空間，Two-level Page Tables結構可能不足以有效地覆蓋整個地址空間。在這種情況下，可能需要具有更多級別的多級Page Table結構來有效管理較大的地址空間。每個額外的Page Table級別將提供更多的索引位元，從而允許覆蓋更大的地址空間。具體的細節將取決於系統的具體要求和限制。

Page Table的影響之一是增加了對memory的訪問次數：

* 每次memory操作（指令取出、加載、存儲）都需要訪問Page Table。
* 基本上，這意味著memory操作的數量翻倍：
    * 首先是訪問Page Table，然後才是實際的memory訪問。
* 這增加了系統的負擔，尤其是在訪問Page Table時，因為它需要兩次memory訪問。
 
儘管如此，需要指出的是，訪問Page Table具有良好的局部性，這意味著經常訪問相鄰的Page Table項目，這些項目通常位於相同的Page Table頁面中，從而減少了對Physical memory的訪問時間。

## Fast Translation Using a TLB
TLB（Translation Look-aside Buffer）是一種位於 CPU 內的cache，用於加速Page Table轉換的過程：

* Page Table訪問具有良好的局部性，意味著CPU經常訪問相鄰的Page Table項目。
* TLB將最近使用的Page Table項目暫存在CPU內，因此在進行地址轉換時，CPU可以直接從TLB中獲取所需的Page Table項目，而不必每次都訪問主記憶體中的Page Table。
* 這樣可以大大加速地址轉換的過程，因為TLB的訪問速度比訪問主記憶體快得多。

總之，TLB作為一種cache，幫助CPU加快了對Page Table的訪問，從而提高了系統的整體性能。

