在許多高效能處理器中,還提出了一些新的概念,以加速外設到儲存器的
dma寫過程。如
freescale
的i/o stashing
和intel
的ioat
技術。
如圖3?8
所示,當裝置進行儲存器寫時,如果可以對
cache
直接進行寫操作時,即便這個儲存器寫命中了乙個狀態為m的
cache
行,可以不將該
cache
行的資料回寫到儲存器中,而是直接將資料寫入
cache
,之後該
cache
行的狀態依然為
m。採用這種方法可以有效提高裝置對儲存器進行寫操作的效率。採用直接向
cache
行寫的方法,
pci裝置對儲存器寫命中乙個狀態為m的
cache
行時,將執行以下操作。
(1)host
主橋將對儲存器的寫請求傳送到
fsb匯流排上。
(2)cpu
通過對fsb
監聽,發現該寫請求在某個
cache
行中命中,而且該
cache
行的狀態為m。
(3)host
主橋將資料直接寫入到
cache
行中,並保持
cache
行的狀態為
m。注意此時裝置不需要將資料寫入儲存器中。
從原理上看,這種方法並沒有奇特之處,僅需
cache
能夠提供乙個介面,使外部裝置能夠直接寫入即可。但是從具體實現上看,裝置直接將資料寫入
cache
中,還是有相當大的難度。特別是考慮在乙個處理器中,可能存在多級
cache
,當cpu
進行匯流排監聽時,可能是在l1、
l2或者
l3 cache
中命中,此時的情況較為複雜,多級
cache
間的協議狀態機遠比
fsb匯流排協議複雜的多。
在乙個處理器系統中,如果
fsb匯流排事務在「與
fsb直接相連的
cache
」中命中時,這種情況相對容易處理;但是在與
bsb(back-side bus)
直接相連的
cache
命中時,這種情況較難處理。下文分別對這兩種情況進行討論,在乙個處理器中,採用
fsb和
bsb連線
cache
的拓撲如圖3
?9所示。
當採用fsb
匯流排連線
l2 cache
時,l2 cache
直接連線到
fsb匯流排上,裝置通過
fsb匯流排向
l2 cache
進行寫操作並不難實現,
mpc8548
處理器就是採用了這種結構將
l2 cache
直接連線到
fsb匯流排上。
但是由於
fsb匯流排的頻率遠低於
bsb匯流排頻率,因此採用這種結構將影響
l2 cache
的訪問速度,為此高階處理器多採用
bsb匯流排連線
l2 cache
,x86
處理器在
pentium pro
之後的高效能處理器都使用
bsb匯流排連線
l2 cache
,freescale的g4
系列處理器和最新的
p4080
處理器也使用
bsb匯流排連線
l2 cache。
當l2 cache
沒有直接連線到
fsb上時,來自外部裝置的資料並不容易到達
bsb匯流排。除了需要考慮
cache
連線在bsb
匯流排的情況外,在外部裝置進行
dma操作時,還需要考慮多處理器系統的
cache
共享一致性協議。設計乙個專用通道,將資料從外部裝置直接寫入到處理器的
cache
中並不容易實現。
intel
的ioat
和freescale
的i/o stashing
可能使用了這種專用通道技術,直接對l1和
l2 cache
進行寫操作,並在極大增加了設計複雜度的前提下,提高了處理器系統的整體效率。
以上對cache
進行直接寫操作,僅是
intel
的ioat
和freescale
的i/o stashing
技術的乙個子集。目前
intel
和freescale
沒有公開這些技術的具體實現細節。在乙個處理器系統中,可能存在多級
cache
,這些cache
的層次組成結構和狀態機模型異常複雜,本章對這些內容不做進一步說明。
c 寫時拷貝
在c 中乙個類有六個預設成員函式,其中拷貝建構函式分為淺拷貝和深拷貝 淺拷貝是一種值拷貝,深拷貝不僅是值拷貝,還要做其他處理 深淺拷貝的區別 由上圖可知當乙個拷貝構造乙個需動態開闢空間的物件時,用淺拷貝時會出現同一塊空間被釋放兩次,這樣顯然有問題,用深拷貝的話可以解決此問題,但當拷貝構造出來的物件,...
c 寫時拷貝1
class string string const string s ptr new char strlen s.ptr 1 另外開闢空間 string private char ptr void test int end gettickcount 記錄此時毫秒數 string const stri...
C 寫時拷貝技術
寫時拷貝 就是在寫的時候 修改字串的時 才會進行真正的空間分配,在唯讀的情況下,資料進行淺拷貝。寫時拷貝技術就是引用計數器的淺拷貝,是通過 引用計數 實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向這塊空間。當有新的指標指向這塊空間時,引用計數加1 當要釋放這塊空間時,僅引用計數減...