1. 程式人生 > >linux與rt-linux關於spinlock的差異以及使用註意事項

linux與rt-linux關於spinlock的差異以及使用註意事項

cpu 阻塞 占用 不同 spi 上下文 要求 由來 操作

1、spinlock由來

自旋鎖:對共享資源的訪問保護鎖,使用“自旋”方式循環查詢等待獲取互斥鎖。

在Linux中,有多套spinlock操作接口。但是,實現機制並不相同。
根據使用場景,實現機制可能是“自旋“,也可能不是”自旋”方式。
這些實現機制的共通特點是:以不產生調度的方式,獲取互斥鎖。
但是,在實時Linux(RtLinux)中,spinlock卻是產生調度的。

2、spinlock用途

spinlock的不產生調度機制決定了用途:
1、對共享數據的訪問操作時間一定要短。不同系統對實時性要求不同,這個時間要求有差異,應該控制在5us以內。
2、spinlock接口性能較高,適用在高頻繁使用,但是沖突又少的場景。
3、spinlock一般作為系統基礎接口,保護共享資源。例如,mutex中含有的基礎變量的保護,需要使用spinlock接口。
與mutex的差異: 
mutex是以可產生調度的方式保護共享資源。當一方占用資源時,另一方可掛起等待,能夠釋放CPU資源。
mutex在單核、多核、普通Linux,RtLinux中,都能對共享資源保護,沒有差異,接口統一。
mutex只能在線程上下文中,在允許調度的環境中才能使用。
spinlock可在中斷、線程、單核、多核等場景中使用。在不同的配置下,實現方式不同,不同的場景需要選擇不同的接口,在Linux中使用最為廣泛。Spinlock使用場景寬泛,接口數量和使用限制多,容易導致錯誤,一定要註意。

3、spinlock在不同linux環境下的差異

接口 linux單核 linux多核 rt-linux
spin_lock 鎖搶占 鎖搶占+自旋方式鎖變量 互斥量
spin_lock_irq 鎖中斷+鎖搶占 鎖中斷+鎖搶占+自旋方式鎖變量 互斥量
spin_lock_irqsave 鎖中斷+鎖搶占 鎖中斷+鎖搶占+自旋方式鎖變量 互斥量
spin_lock_bh 鎖軟中斷 鎖軟中斷+自旋方式鎖變量 鎖軟中斷+互斥量
raw_spin_lock 鎖搶占 鎖搶占+自旋方式鎖變量 同linux單核或多核
raw_spin_lock_irq 鎖中斷+鎖搶占 鎖中斷+鎖搶占+自旋方式鎖變量 同linux單核或多核
raw_spin_lock_irqsave 鎖中斷+鎖搶占 鎖中斷+鎖搶占+自旋方式鎖變量 同linux單核或多核
raw_spin_lock_bh 鎖軟中斷 鎖軟中斷+自旋方式鎖變量 同linux單核或多核

3、spinlock使用規範

普通linux:
spin_lock:在線程間保持互斥保護
spin_lock_irq:  在線程間、以及線程、中斷、軟中斷間保持互斥同步
Spin_lock_bh:  在線程間、以及線程和軟中斷間保持互斥同步
實時linux:
spin_lock: 在線程間保持互斥同步
spin_lock_irq:在線程間、以及線程、中斷線程、軟中斷線程保持互斥同步
spin_lock_bh: 在線程間、以及線程和軟中斷線程保持互斥同步
raw_spin_lock_irq:在線程間、以及線程、中斷、中斷線程、軟中斷線程間保持互斥同步

`在spinlock的保護區內,不允許調用阻塞函數 ★★★★★``

linux與rt-linux關於spinlock的差異以及使用註意事項