volatile關鍵字能否解決cache一致性的問題

2021-04-21 20:57:52 字數 3941 閱讀 7508

1樓:_鈊_煩_薏亂

volatile只是讓每次操作之後都必須放回記憶體罷了。

2樓:

不可以解決cache一致性的問題。volatile只能保證cpu能發出定址訊號,至於地址訊號是命中cache還是命中記憶體,看當時的cache設定。

3樓:匿名使用者

volatile操作是讓cpu讀取時每次都從記憶體空間中取資料,而不是取儲存在暫存器中的資料,這樣做顯然比從cache中讀取資料效率低。

微控制器裸機程式設計怎麼解決cache一致性問題

4樓:匿名使用者

cache原理

cpu快取(cache memory)是位於cpu與記憶體之間的臨時儲存器,它的容量比記憶體小的多但是交換速度卻比記憶體要快得多。快取的出現主要是為了解決cpu運算速度與記憶體 讀寫速度不匹配的矛盾,因為cpu運算速度要比記憶體讀寫速度快很多,這樣會使cpu花費很長時間等待資料到來或把資料寫入記憶體。在快取中的資料是記憶體中的 一小部分,但這一小部分是短時間內cpu即將訪問的,當cpu呼叫大量資料時,就可避開記憶體直接從快取中呼叫,從而加快讀取速度。

只要cache的空間與主存空間在一定範圍內保持適當比例的對映關係,cache的命中率還是相當高的。一般規定cache與記憶體的空間比為4:1000,即128kb cache可對映32mb記憶體;256kb cache可對映64mb記憶體。

在這種情況下。命中率都在90%以上。至於沒有命中的資料,cpu只好直接從記憶體獲取。

獲取的同時,也把它拷進cache。

cache一致性問題

由於快取存在於cpu與記憶體中間,所以任何外設對記憶體的修改並不能保證cache中也得到同樣的更新,同樣處理器對快取中內容的修改也不能保證記憶體中的資料 得到更新。這種快取中資料與記憶體中資料的不同步和不一致現象將可能導致使用dma 傳輸資料時 或 處理器執行自修改**時產生錯誤。

cache的一致性就是直cache中的資料,與對應的記憶體中的資料是一致的。

cache的基本結構

cache通常由相聯儲存器實現。相聯儲存器的每一個儲存塊都具有額外的儲存資訊,稱為標籤(tag)。當訪問相聯儲存器時,將地址和每一個標籤同時進行比較,從而對標籤相同的儲存塊進行訪問。

cache的3種基本結構如下:

全相聯cache

在全相聯cache中,儲存的塊與塊之間。以及儲存順序或儲存的儲存器地址之間沒有直接的關係。程式可以訪問很多的子程式、堆疊和段,而它們是位於主儲存器的不同部位上。

因此。cache儲存著很多互不相關的資料塊。

cache必須對每個塊和塊自身的地址加以儲存。當請求資料時,cache控制器要把請求地址同所有地址加以比較進行確認。

這種cache結構的主要優點是。

它能夠在給定的時間內去儲存主存器中的不同的塊,命中率高;缺點是每一次請求資料同cache中的地址進行比較需要相當的時間,速度較慢。

直接映像cache

直接映像cache不同於全相聯cache。地址僅需比較一次。

在直接映像cache中。由於每個主儲存器的塊在cache中僅存在一個位置,因而把地址的比較次數減少為一次。其做法是,為cache中的每個塊位置分配一個索引欄位,用tag欄位區分存放在cache位置上的不同的塊。

單路直接映像把主儲存器分成若干頁。主儲存器的每一頁與cache儲存器的大小相同。匹配的主儲存器的偏移量可以直接映像為cache偏移量。

cache的tag儲存器(偏移量)儲存著主儲存器的頁地址(頁號)。

以上可以看出。直接映像cache優於全相聯cache,能進行快速查詢,其缺點是當主儲存器的組之間做頻繁呼叫時,cache控制器必須做多次轉換。

組相聯cache

組相聯cache是介於全相聯cache和直接映像cache之間的一種結構。這種型別的cache使用了幾組直接映像的塊。對於某一個給定的索引號,可以允許有幾個塊位置。

因而可以增加命中率和系統效率。

cache與dram存取的一致性

在cpu與主存之間增加了cache之後,便存在資料在cpu和cache及主存之間如何存取的問題。讀寫各有2種方式。

貫穿讀出式(look through)

該方式將cache隔在cpu與主存之間,cpu對主存的所有資料請求都首先送到cache,由cache自行在自身查詢。如果命中。 則切斷cpu對主存的請求,並將資料送出;不命中。

則將資料請求傳給主存。

該方法的優點是降低了cpu對主存的請求次數,缺點是延遲了cpu對主存的訪問時間。

旁路讀出式(look aside)

在這種方式中,cpu發出資料請求時,並不是單通道地穿過cache。而是向cache和主存同時發出請求。由於cache速度更快,如果命中,則cache在將資料回送給cpu的同時,還來得及中斷cpu對主存的請求;不命中。

則cache不做任何動作。由cpu直接訪問主存。它的優點是沒有時間延遲,缺點是每次cpu對主存的訪問都存在,這樣。

就佔用了一部分匯流排時間。

寫穿式(write through)

任一從cpu發出的寫訊號送到cache的同時,也寫入主存,以保證主存的資料能同步地更新。它的優點是操作簡單,但由於主存的慢速,降低了系統的寫速度並佔用了匯流排的時間。

回寫式(copy back)

為了克服貫穿式中每次資料寫入時都要訪問主存。從而導致系統寫速度降低並佔用匯流排時間的弊病,儘量減少對主存的訪問次數,又有了回寫式。

它是這樣工作的:資料一般只寫到cache,這樣有可能出現cache中的資料得到更新而主存中的資料不變(資料陳舊)的情況。但此時可在cache 中設一標誌地址及資料陳舊的資訊。

只有當cache中的資料被再次更改時。才將原更新的資料寫入主存相應的單元中,然後再接受再次更新的資料。這樣保證了cache和主存中的資料不致產生衝突。

cache與dma的一致性問題

在進行dma 操作時,如果沒有對cache 進行適當的操作,將可能產生以下兩種錯誤:

1.dma 從外設讀取資料到供處理器使用。dma 將外部資料直接傳到記憶體中,但cache 中仍然保留的是舊資料,這樣處理器在訪問資料時直接訪問快取將得到錯誤的資料。

2.dma 向外設寫入由處理器提供的資料。處理器在處理資料時資料會先存放到cache 中,此時cache 中的資料有可能還沒來得及寫回到記憶體中的資料。

如果這時dma 直接從記憶體中取出資料傳送到外設,外設將可能得到錯誤的資料。

為了正確進行dma 傳輸,必須進行必要的cache 操作。 cache 操作主要分為 invalidate (作廢) 和writeback (寫回) ,有時也將兩著放在一起使用。

dma如果使用cache,那麼一定要考慮cache的一致性。解決dma導致的一致性的方法最簡單的就是禁止dma目標地址範圍內的cache功能。但是這樣就會犧牲效能。

因此在dma是否使用cache的問題上,可以根據dma緩衝區期望保留的的時間長短來決策。dam的對映就分為:一致性dma對映和流式dma對映。

一致性dma對映申請的快取區能夠使用cache,並且保持cache一致性。一致性對映具有很長的生命週期,在這段時間內佔用的對映暫存器,即使不使用也不會釋放。生命週期為該驅動的生命週期。

流式dma對映實現比較複雜。只知道種方式的生命週期比較短,而且禁用cache。一些硬體對流式對映有優化。建立流式dma對映,需要告訴核心資料的流動方向。

1. dma 從外設讀取資料到供處理器使用時,可先進性invalidate 操作。這樣將迫使處理器在讀取cache中的資料時,先從記憶體中讀取資料到快取,保證快取和記憶體中資料的一致性。

2.dma 向外設寫入由處理器提供的資料時,可先進性writeback 操作。這樣可以dma傳輸資料之前先將快取中的資料寫回到記憶體中。

如果不清楚dma 操作的方向,也可先同時進行invalidate 和writeback 操作。操作的結果等同於invalidate 和 writeback 操作效果的和。

wince 作業系統也有一套cache 操作介面:

void oemcacherangeflush( lpvoidpaddr, dword dwlength, dword dwflags );

資料庫中的關鍵字,主關鍵字,外關鍵字

因為學號和課copy號 組成了一個唯一標識 哪個學生的成績啊!在s中學號是主關鍵字 sc是s和c表延伸的表 在sc中學號和課號是關鍵字 但是不是主關鍵字 因為並不能只通過學號或課號能唯一確定哪個個學生的成績 同一個學生可以選多個課程 而同樣 同一個課程可以有很多同學選擇 所以必須要兩個關鍵字 才能確...

c中的const何readonly關鍵字含義和作用有什麼區

常數表示式是在編譯時可被完全計算的表示式。因此不能從一個變數中提取的值來初始化常量。如果const int a b 1 b是一個變數,顯然不能再編譯時就計算出結果,所以常量是不可以用變數來初始化的。readonly 允許把一個欄位設定成常量,但可以執行一些運算,可以確定它的初始值。因為readonl...

c中explicit關鍵字是什麼意思

關鍵字explicit可以禁止bai 單引數構造du函式 被用於自動類zhi型dao轉換 class stack 沒有explicit的話 內stack s 40 能編譯通過 而有explicit則不能,必需 容stack s 40 c 中的建構函式.前加上explicit有什麼用?c 提供了關鍵字...