事務存儲結構的實現
(2) 讀00地址(十六進制地址)中的數據到寄存器r1中,00地址對應數據塊的讀(R)標志位置1表示此數據被讀。
本文引用地址:http://www.ex-cimer.com/article/202295.htm(3) 將寄存器r2中數據(這里假設為56)存入c0地址中,由于c0地址中存在原始數據34,將c0地址和該原始數據一起根據LogBase中的日志入口地址存入日志中,并將LogPtr指針后移,指向用于存放下個數據的地址位,同時將c0地址對應塊的寫(W)標志位置1,代表一次寫操作的完成,其他的狀態(tài)不變。
(4) 讀取40地址中數據到寄存器r3中,然后r3中數據加1,并將執(zhí)行后的r3數據存回40地址中,該操作對40地址對應塊執(zhí)行了一次讀操作和一次寫操作,將讀(R)和寫(W)標志位置1,然后將原始40地址對應塊中數據存入日志中,存入LogPtr指向的地址中,同時將LogPtr指針后移。
(5) 事務提交后狀態(tài)——將與本事務相關的各個數據塊對應讀寫標志位清0,將LogPtr置位到LogBase,TMcount置0。(本例僅針對單事務執(zhí)行,如果是嵌套事務的執(zhí)行,LogTM結構會更加復雜,具體支持嵌套事務的LogTM實現,請參考[2])
(6) 事務回滾后狀態(tài)——事務在執(zhí)行或提交過程中如果出錯需要回滾,則將日志中記錄的原始數據按照地址映射關系重新加載到對應cache數據塊中,同時將各個塊對應讀寫標志位清0,LogPtr重置并且TMcount置0。
圖 4 事務版本管理過程——成功提交和回滾
2.2 沖突管理(Contention Management)
LogTM采用積極的沖突管理模式,而沖突管理中的一個重要概念目錄,就是在內存中開辟的一片用來記錄共享數據索引和相關狀態(tài)信息的區(qū)域,也稱為目錄表。此沖突管理以目錄為橋梁,通過目錄的分析和消息轉發(fā)機制來完成多處理機間的沖突檢測。具體的實現步驟概括起來為:①請求操作的處理機發(fā)出一致性請求到目錄;②目錄響應請求并可能將請求轉發(fā)到其他一個或多個處理機上;③每個響應請求的處理機檢查自身狀態(tài)看是否發(fā)生沖突;④每個響應請求的處理機給出應答信號,包括沖突應答(nack)和非沖突應答(ack);⑤發(fā)出請求的處理機解決沖突。
事務發(fā)生沖突后的替換行為須依據目錄中有效的MOESI狀態(tài)(MOESI 狀態(tài):Modified(M),Owned(O), Exclusive(E),Shared(S) or Invalidate(I))而定。
下面結合圖5中的沖突檢測實例對沖突管理的具體行為進行說明。
圖 5 LogTM沖突檢測實例
(1)事務開始——處理機P開始執(zhí)行事務,TMcount增1;此時僅目錄中存放的cache塊信息有效。
(2)處理機P向目錄請求數據信息——步驟①:P在自身的cache中找不到某數據,馬上發(fā)送獨占請求(GETX)到目錄。步驟②:目錄收到請求后根據相應數據的索引找到“老”版本數據傳給處理機P,當“老”版本數據達到P時,P將此數據更為“新”版本數據同時將本機此數據塊對應讀/寫標志位置1。步驟③:P接受數據完畢后,發(fā)送應答信號給目錄表示已經成功接受數據。與此同時目錄中的狀態(tài)信息為M@P(Modified by P),表示此數據正在被處理機P更改。
(3)檢測到事務沖突——步驟①:處理機Q發(fā)出請求某共享數據的信號(GETS)給目錄。步驟②:由于目錄中此數據的狀態(tài)為M@P,目錄則根據請求轉發(fā)給處理機P。步驟③:P接受到請求后檢查自己的狀態(tài),由于P中相應數據塊的寫標志位已置,表明P正在修改此數據,不能滿足Q的請求,發(fā)生沖突。這時處理機P直接發(fā)送沖突信號給Q,當Q接受到沖突信號后進行沖突處理。步驟④:處理機Q同時將沖突信號發(fā)送給目錄,表明此次請求失敗。
(4)事務溢出的處理——處理機P通知目錄要將修改后的數據存到內存中(目前,內存中存在的是對應數據修改前的“臟”數據)。步驟①:P發(fā)出PUTX請求給目錄。步驟②:目錄認可后發(fā)送應答信號給P,通知P可以發(fā)送。步驟③:P接收到此信號后將數據寫回內存(WB_XACT)同時將溢出位置1(表明此數據已經不在cache中)。這樣在寫回操作完成后,P中相關數據塊信息已置為無效,但是目錄中仍然保持著原先P持有數據時的狀態(tài),內存中對應區(qū)域已為修改后的“干凈”數據,目錄中該數據相應的狀態(tài)也由“老”變成了“新”,表明內存中此數據已為更新后的數據。
(5)溢出數據的事務沖突檢測——步驟①:處理機Q重新發(fā)出請求數據信號給目錄,由于目錄中的狀態(tài)還沒有改變。步驟②:目錄根據當前狀態(tài)再次將請求轉發(fā)給處理機P,而此時Q請求的數據塊已經寫回內存中去了,并不在P的cache中,P收到請求信號后檢查到自身的溢出位已經置位,它認為此數據可能由于某種原因不在cache中,但是仍然與它相關。比如:由于此數據塊大小大于cache規(guī)定塊大小而不能放下,但仍需操作。步驟③:P發(fā)出沖突信號(NACK)給Q,但是這個沖突并不是真正意義上的沖突,而是P假設的沖突。步驟④:Q收到沖突信號后處理沖突同時發(fā)送信號給目錄,表明此次請求再次失敗。
(6)目錄中數據狀態(tài)的懶惰(Lazy)更新——處理機P提交事務后將TMcount減1,將對應cache塊的讀/寫標志位和溢出標志位清零,但此時目錄中的狀態(tài)仍然為M@P。步驟①:此時一旦處理機Q重新發(fā)出請求此數據信號。步驟②:該信號會再一次通過目錄轉發(fā)給處理機P,但此時P的溢出位已經被清空。步驟③:P通過發(fā)送清除信息(CLEAN)給目錄通知目錄不必再轉發(fā)請求信息,目錄中的數據信息有效可以直接發(fā)送給請求的處理機Q。步驟④:目錄根據索引關系找到相關數據發(fā)送給處理機Q。步驟⑤:Q收到數據后進行處理同時將應答信號發(fā)送給目錄,表明請求成功同時將目錄對應數據項狀態(tài)置E@Q,表示此時處理機Q獨占此數據資源。
評論