天天看點

《現代體系結構上的UNIX系統:核心程式員的對稱多處理和緩存技術(修訂版)》——2.8 高速緩存沖洗

本節書摘來自異步社群《現代體系結構上的unix系統:核心程式員的對稱多處理和緩存技術(修訂版)》一書中的第2章,第2.8節,作者:【美】curt schimmel著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

所有的高速緩存實作都為作業系統提供了從高速緩存中删除資料的能力,這種功能一般稱為高速緩存沖洗(cache flushing)。根據高速緩存組織結構的不同,這對于防止意外引用過時資料、保持高速緩存一緻性來說可能是必不可少的功能(高速緩存一緻性在多處理器系統上有更廣泛的含義,這将在第三部分讨論)。一個高速緩存需要沖洗的準确時機則取決于它的組織結構,這是接下來的幾章要讨論的主題。高速緩存沖洗有兩種形式:使主存儲器有效(validating main memory)和使高速緩存無效(invalidating cache)。

使主存儲器有效的形式是指在采用寫回政策的高速緩存中将修改過的資料寫回到主存儲器内的做法。正如2.2.5節所讨論的那樣,這是由高速緩存在替換一個修改過的行期間自動完成的,但是它也可以由作業系統明确地進行控制。一次顯式的使有效操作(validation operation)将把行内的資料寫入主存儲器,然後将高速緩存内資料的修改位關閉(因為相對于主存儲系統内的副本而言不再是修改過的了)。使主存儲器有效的方法還可以讓作業系統随時更新主存儲器到最新。這可以防止主存儲器内資料的過時副本被系統中不使用高速緩存的其他部分所引用。如果作業系統指定将一個高速緩存行寫回主存儲器,而這一行要麼不在高速緩存中,要麼目前并沒有被修改過,那麼這個使有效操作對高速緩存什麼也不做。這種類型的緩存沖洗從不需要在采用寫直通政策的高速緩存上進行,因為存儲器始終和高速緩存中的内容保持同步。

使高速緩存無效的形式是指,如果高速緩存中的資料被修改過,那麼無需先将它寫回主存儲器就把它丢棄的做法。這種功能既可以用于寫直通高速緩存,也可以用于寫回高速緩存。作業系統使用它來丢棄高速緩存中的過時資料。如果資料在主存儲器中的副本的更新與高速緩存無關,進而導緻被緩存的資料副本過時,就會需要這種操作。讓該資料在高速緩存中無效會造成下一次引用該資料時出現一次缺失,是以要從主存儲器中重新讀取該資料的正确副本。

一般而言,采用寫回政策的高速緩存允許将獨立的使主存儲器有效和使高速緩存無效操作組合成單個操作,因為它們是一種常用的序列。在這種情況下,如果高速緩存中出現了該行,而且被修改過,那麼就首先完成主存儲器有效操作,于是該資料就不會丢失。在此之後往往會跟着進行一次使高速緩存無效操作。

兩種高速緩存沖洗形式中的任何一種通常都能夠以單行為基礎來使用。大多數實作允許作業系統指定要被沖洗的資料的位址。随後在高速緩存中查找這個位址,如果命中則被沖洗掉。如果沒有命中,則保持高速緩存不變。mips處理器就是以這種方式工作的。有些實作可以允許一次沖洗一組位址,例如一頁甚至整個高速緩存。ti microsparc和supersparc就允許後一種方式,它們稱之為“洗淨”功能。motorola 68040和88200支援一次按行、按頁面或者整個高速緩存的沖洗。

繼續閱讀