MIPS處理器中原子交換是如何實現的?
關於MIPS處理器並行處理中原子交換的實現,希望能具體解釋,並附上具體例子。謝謝!
Linux 的 Spinlock 在 MIPS 多核處理器中的設計與實現
LL 指令的功能是從內存中讀取一個字,以實現接下來的 RMW(Read-Modify-Write) 操作;SC 指令的功能是向內存中寫入一個字,以完成前面的 RMW 操作。LL/SC 指令的獨特之處在於,它們不是一個簡單的內存讀取/寫入的函數,當使用 LL 指令從內存中讀取一個字之後,比如 LL d, off(b),處理器會記住 LL 指令的這次操作(會在 CPU 的寄存器中設置一個不可見的 bit 位),同時 LL 指令讀取的地址 off(b) 也會保存在處理器的寄存器中。接下來的 SC 指令,比如 SC t, off(b),會檢查上次 LL 指令執行後的 RMW 操作是否是原子操作(即不存在其它對這個地址的操作),如果是原子操作,則 t 的值將會被更新至內存中,同時 t 的值也會變為1,表示操作成功;反之,如果 RMW 的操作不是原子操作(即存在其它對這個地址的訪問衝突),則 t 的值不會被更新至內存中,且 t 的值也會變為0,表示操作失敗。
硬體上是和cache相關的。一種可能的實現是ll/sc之間,如果相應的cache line失效,sc就失敗。
MIPS 的 Spin_Lock
對於 MIPS 的 Spin_Lock 操作,可以用如下的方式實現:
表1. Spin_Lock
1 Spin_Lock(lockkey)
2 1:
3 ll t0, lockkey
4 bnez t0, 1b
5 li t0, 1
6 sc t0, lockkey
7 beqz t0, 1b
8 sync
Line 1:
lockKey 是共享資源鎖,這是塊能被多核所共享的內存地址,該值為0表示鎖處於空閑狀態,為1表示鎖已經被某個核所獲取,其餘核若想獲取它只能等待,以下對於 lockKey 的定義相同。
Line 3:
將 lockKey 讀入t0寄存器中。
Line 4:
比較 lockKey 是否空閑,如果該鎖不可用的話則跳轉到 Line 1。
Line 5:
給 t0 寄存器賦值為1。
Line 6:
將 t0 寄存器的值保存入 lockKey 中,並返回操作結果於 t0 寄存器中。
Line 7:
判斷 t0 寄存器的值是否為0,如果為0表示 Line 5 中的操作失敗,則返回 Line 1 重新開始;如果為1表示 Line 5 中的操作成功。
Line 8:
Sync 是內存操作同步指令,用來保證 sync 之前對於內存的操作能夠在 sync 之後的指令開始之前完成。
http://courses.engr.illinois.edu/cs232/sp2009/lectures/x24.pdf
本質上來講,任何需要同步操作都是需要Protocal介入的。現代處理器中,這一同步過程一般都放在Cache中。推薦閱讀:
※龍芯為什麼採用了mips指令集,而沒有使用arm指令集?
※未來是屬於 Xcode 的還是 Visual Studio?屬於 Obj-C 還是屬於 C#、VC?
※造電腦需要什麼?
※為什麼大學要開設計算機專業?
※應該如何體驗商場里的蘋果電腦?