自旋鎖原理分析

来源:https://www.cnblogs.com/jiau/archive/2020/06/23/13182019.html
-Advertisement-
Play Games

1. 概念 自旋鎖的目的是在短期間內進行輕量級的鎖定,解決對某項共用資源的互斥使用,在等待鎖重新可用期間進行自旋,所以自旋鎖不應該被持有時間過長,如果需要長時間鎖定的話,推薦使用信號量。實際操作的數據結構如下: 2. 獲取鎖 最終執行的代碼是體繫結構相關的自旋鎖實現:arch_spin_lock。 ...


1. 概念

自旋鎖的目的是在短期間內進行輕量級的鎖定,解決對某項共用資源的互斥使用,在等待鎖重新可用期間進行自旋,所以自旋鎖不應該被持有時間過長,如果需要長時間鎖定的話,推薦使用信號量。實際操作的數據結構如下:

2. 獲取鎖

最終執行的代碼是體繫結構相關的自旋鎖實現:arch_spin_lock。

3. 代碼分析

static inline void arch_spin_lock(arch_spinlock_t *lock)
{
  unsigned long tmp;
  u32 newval;
  arch_spinlock_t lockval;
  // 處理器通知記憶體系統將對某個地址的記憶體進行讀寫
  prefetchw(&lock->slock);
  // 以獨占的方式對 lock->tickets.next 執行 +1 操作
  __asm__ __volatile__(
"1:  ldrex  %0, [%3]\n"
"  add  %1, %0, %4\n"
"  strex  %2, %1, [%3]\n"
"  teq  %2, #0\n"
"  bne  1b"
  : "=&r" (lockval), "=&r" (newval), "=&r" (tmp)
  : "r" (&lock->slock), "I" (1 << TICKET_SHIFT)
  : "cc");
  // 判斷是否輪到自己擁有自旋鎖
  while (lockval.tickets.next != lockval.tickets.owner) {
    // 將當前核心掛起等待其他核心發送信號,也就是等 SEV 指令
    wfe();
    // 讀取自旋鎖中的 lock->tickets.owner
    lockval.tickets.owner = ACCESS_ONCE(lock->tickets.owner);
  }
  // 數據同步
  smp_mb();
}

4. 釋放鎖

最終執行的代碼是體繫結構相關的自旋鎖實現:arch_spin_unlock。

5. 代碼分析

static inline void arch_spin_unlock(arch_spinlock_t *lock)
{
  // 數據同步
  smp_mb();
  // 將自旋鎖交給下一個使用者
  lock->tickets.owner++;
  // 先進行數據同步,然後給其他核心發信號
  dsb_sev();
}

6. 總結

自旋鎖底層實現依賴於體繫結構相關的彙編指令,在進行自旋鎖操作時,使用獨占指令LDREX/STREX;在自旋時使用指令WFE將當前核心掛起,等待被喚醒;當核心在釋放自旋鎖時,使用SEV指令通知其他所有核心。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景 Read the fucking source code! --By 魯迅 A picture is worth a thousand words. --By 高爾基 說明: Kernel版本:4.14 ARM64處理器,Contex-A53,雙核 使用工具:Source Insight 3. ...
  • 使用win10 專業版 + frp + RDPwrap + 阿裡雲伺服器 的組合實現win10 多用戶同時遠程登錄內網機。使用frp 做內網穿透,將內網機的指定埠暴露在外網,通過ip+port 來實現遠程登陸。再使用rdpwrap 來破解win10 不能同時多用戶登陸的問題。 ...
  • 大概的簡述一下,及cpu讀取記憶體里的東西時,並不會直接去記憶體去讀取,這樣會導致讀取的數據很慢。cpu會到一級緩存讀取所需要的數據,而一級緩存則會去記憶體裡面讀取數據,讀取的方式是通過緩存行(cache line)的形式來進行讀取。當一級緩存內的數據需要置換時,則會將緩存內的數據置換到二級緩存內,然後依 ...
  • ls list(列表) 列表目錄文件 例子:ls / 列根/目錄下文件與內容 -l(long)長格式 ll是個別名alias ll='ls -l --color=auto' -a顯示所有文件和文件夾,(包含隱藏文件).預設點開頭的文件都是隱藏的。 -h 要與1一起用,顯示文件大小(k,M,G)單位 ...
  • 前言 最近項目上需要用到搜索引擎,由於之前自己沒有瞭解過,所以整理了一下搜索引擎的相關概念知識。 正文 想查數據就免不了搜索,搜索就離不開搜索引擎,百度、谷歌都是一個非常龐大複雜的搜索引擎,他們幾乎索引了互聯網上開放的所有網頁和數據。然而對於我們自己的業務數據來說,肯定就沒必要用這麼複雜的技術了,如 ...
  • Linux下有三個命令:ls、grep、wc。通過這三個命令的組合可以統計目錄下文件及文件夾的個數。 統計當前目錄下文件的個數(不包括目錄) $ ls -l | grep "^-" | wc -l 統計當前目錄下文件的個數(包括子目錄) $ ls -lR| grep "^-" | wc -l 查看某 ...
  • 實操題 網路管理 1、在eNSP中使用S5700交換機進行配置,通過一條命令劃分vlan2、vlan3、vlan1004,通過埠組的方式配置埠1-5為access模式,並添加至vlan2中。配置埠10為trunk模式,並放行vlan3。創建三層vlan2,配置IP地址為:172.16.2.1/ ...
  • 在我們將U盤插入裝有CentOS的系統時,經常會出現如圖所示的錯誤提示。這是因為linux系統並不能相容NTFS的文件系統。其解決方法如下(建議先進入root模式): **1、首先下載“ntfs-3g”**(NTFS-3G 是一個開源的軟體,可以實現 Linux、Free BSD、Mac OSX、N ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...