snoopy協定是用硬體方式解決多處理器中cache一致性的一種策略,適用於在小規模多處理器系統(如,對稱式共享存儲多處理器系統)中實現。
基本介紹
- 中文名:snoopy協定
- 正文:snoopy協定是用硬體方式
- 基本點:向所有的處理器傳送數據請求
- 關鍵點:處理器取得匯流排控制權
基本點,技術關鍵點,
基本點
1)向所有的處理器傳送數據請求;
2)處理器通過窺視匯流排發現請求,當它們有一個拷貝時回響請求;
3)因為緩衝信息在處理器中,需要進行廣播,;
4)在匯流排支持下可以良好的工作。適用於小規模系統。
技術關鍵點
1)使用匯流排完成無效操作:
處理器取得匯流排控制權,然後在匯流排上廣播無效數據的地址,所有處理器窺探匯流排來監測地址,檢查各自的cache中是否有匯流排上廣播的地址,若有,則將cache中相應的塊置為無效。
2)在cache失效時對數據項進行定位。
採用寫穿透方式時,寫穿透保證了主存中的信息總是最新的,讀失效時讀主存;
採用回寫方式時,需要窺視所有的緩衝區以獲得最新的備份,具體實現為——向匯流排發讀失效訊息,擁有該數最新值的cache發現自己是最新的,則回寫,要讀的處理器就可以讀到了。
3)通過每個節點的有限狀態控制器實現。
這個控制器對每個來自處理器和匯流排的請求做出回響,然後改變選定的cache的狀態,同時可以使用匯流排來訪問數據使之無效。
4)利用cache中標識為實現窺探過程。
5)為每個數據塊增加一個狀態位,跟蹤一個cache數據塊是否共享。執行寫操作時,根據該位判定是否需要傳送無效操作。
例子
下面給出一個採用寫無效和回寫策略的snoopy協定。
該協定中,每一個記憶體塊處於以下三種狀態之一:
1)Shared。記憶體中信息是最新的,所有Cache中信息也是有效的;
2)Exclusive。除了一個Cache中外其它的全部是無效的;
3)不在任何快取中。
每一個Cache塊處於以下三種狀態之一:
1)shared。其中的數據是有效的;
2)Exclusive。除了這個Cache中外其它的全部是無效的
3)invalid。塊中沒有數據。
當發生讀失效時,所有的cache塊窺視匯流排。
寫空塊時看作失效。
兩個簡化
1)該協定中,只有在匯流排上傳送寫失效才能從其他狀態轉換到獨占狀態,並且假定提出請求cache總是用返回的數據來修改該數據塊。
2)沒有區分下面兩種情況:真正被共享的cache塊、僅存在於一個cache中但又是乾淨狀態的塊。將它們都用share狀態來描述。
實際上存在4個狀態的協定,invalid、shared、exclusive(表示上面的第二種情況)、modified
(這兩段可不描述)任何一個cache塊要么處於share狀態,要么處於exclusive狀態,任何狀態要轉換到獨占狀態,必須要在匯流排上放置一個寫失效(write miss)信號,使所有cache把數據塊置為無效invalid。
若發生獨占狀態數據塊的讀缺失,擁有該數據塊的cache會使其狀態變為共享。
對稱式共享存儲多處理器系統性能
由處理器間通信引起的失效,通常稱為“一致性失效”,可分為兩種:
真共享失效:試圖讀一個已修改的字時,會產生一個失效並且傳送一個結果cache塊。
——>處理器間通信引起的失效。
假共享:對數據塊中的某些字進行寫操作導致該數據塊被置為無效,在對該塊中另一些字執行讀操作時,發生假共享。
假共享寫入的字和讀取的字不相同,無效並不會引發傳輸新數值,從而導致多餘的cache失效。
——>採用寫無效協定處理cache一致性,引起的失效。
對於基於匯流排的多處理器,瓶頸經常是有限的記憶體和匯流排頻寬。
Snoopy協定採用寫無效協定,會產生假共享。
——>cache更大的塊不好
1、更大的塊意味著,每次缺失時需要更多數據通過匯流排傳輸。
2、更大的塊,假共享出現幾率更高,使由於假共享而潛在的增加失效率。
由於更多的失效、不斷加劇匯流排競爭、通信增加,實際上導致性能下降。
幾種基本snoopy協定
1)寫無效協定。
針對多個讀數據者、一個寫數據者。當寫入一個共享的數據時,發一個無效信息給所有在窺視的緩衝區,將這些緩衝區中的所有的拷貝信息設為無效;
當發生讀失效時,有兩種處理方法:寫穿透和回寫。
採用寫穿透方式時,寫穿透保證了主存中的信息總是最新的,讀失效時讀主存;
採用回寫方式時,需要窺視所有的緩衝區以獲得最新的備份,具體實現為——向匯流排發讀失效訊息,擁有該數最新值的cache發現自己是最新的,則回寫,要讀的處理器就可以讀到了。
2)寫廣播協定(常用寫穿透)。
當寫一個共享數據時,在匯流排上廣播,處理器進行窺視並將所有的備份更新,當讀失效時,可以直接從主存中讀取;
3)寫序列化。
匯流排對所有的要求進行序列化,以保證一致性,這裡匯流排是唯一的仲裁點。
缺點
實現複雜,可能會產生寫競賽,另外還必須支持interventions和invalidations.
寫競賽產生的原因是:在沒有獲得匯流排之前不能更新一個Cache,而在等待匯流排的時候另一個處理器可能獲得了匯流排並向同一個塊中寫入數據,產生了寫競賽。