分頁與位址轉換

位址空間識別碼(address-space identifier)

/ abbr. ASID, say "AY-sid" or "A-S-I-D" /

假設一塊共用白板上寫著許多人的備忘,但每個人的備忘都標上自己的名字。你看板子時只信任標著「你」名字的那幾行;其餘是別人的,你略過。位址空間識別碼對 TLB 做的事一模一樣:它替每筆快取的轉譯標上它屬於哪個行程(哪個位址空間),使不同行程的轉譯能在 TLB 裡共存,而誰也不會讀到不屬於自己的那一筆。

它解決的問題是這樣。每個行程都有自己的分頁表,所以「相同的頁號」在不同行程裡代表不同的頁框。一個普通的 TLB 只存(頁 → 頁框)配對,所以環境切換之後,它快取的項目仍屬於「舊」行程,對新行程而言會是危險地錯誤。最簡單的修法是在每次環境切換時把整個 TLB「清空」——正確,但連新行程那些有用的轉譯也一併丟掉,逼出一陣失誤。更聰明的修法是 ASID:每筆 TLB 項目也存一個位址空間識別碼,而要算命中,得「同時」頁號相符「且」ASID 與當前執行行程的 ASID 相符。如今許多行程的項目能同時住在 TLB 裡;環境切換只要改變當前的 ASID、無須清空,而每個行程只會找到屬於自己的轉譯。

ASID 之所以重要,是因為它讓環境切換更便宜,尤其在頻繁切換的系統上,避開了昂貴的 TLB 清空與隨之而來的失誤風暴。在 x86 上同樣的概念叫 PCID。誠實的提醒是:ASID 欄位很小(常只有寥寥幾個位元,故可區分的 ASID 數目有限),所以行程一多,作業系統就得回收 ASID,而當它重用某個值時,必須清空標著那個被回收值的項目以維持正確。因此 ASID 大幅減少清空,但並未完全消除。

TLB 項目:(ASID 3, 頁 0 → 頁框 9)與(ASID 7, 頁 0 → 頁框 73)。當 ASID 為 3 的行程執行時,查頁 0 只比對到第一筆、得到頁框 9。切換到 ASID 7,同樣的頁 0 此刻比對到第二筆、得到頁框 73——兩者之間無須清空。

用 ASID 替 TLB 項目加標籤,讓多個行程的轉譯共存,於是環境切換不必清空 TLB。

ASID 讓大多數環境切換不必清空 TLB,但 ASID 欄位很小,所以作業系統得回收 ASID,並在重用某值時清空相關項目。它們減少清空,並非完全消除。

又稱
ASIDprocess-context identifierPCID (on x86)位址空間 ID行程內容識別碼