Es gibt eine rohe Variante jedes Spin-Locks, die im Linux-Kernel verfügbar ist. Ich möchte wissen, wie es funktioniert. zB:
raw_spin_lock (), raw_spin_lock_irqsave () usw.
spin_lock*
-Funktionen machen dasselbe wie raw_spin_lock*
eins plus, wenn Sperrdebugging aktiviert ist (CONFIG_DEBUG_LOCK_ALLOC), führen Sie zusätzliche Laufzeitprüfungen für Sperroperationen durch, z. B. Prüfungen auf Deadlock . Diese Prüfungen werden von lockdep
subsystem durchgeführt.
In der Regel sollten spin_lock*
-Funktionen verwendet werden, wann immer es möglich ist .
Nur in seltenen Fällen einer sehr kniffligen Sperrrichtlinie können lockdep
-Funktionen verwendet werden, wenn raw_spin_lock*
falsche Warnungen ausgeben kann.
Außerdem können raw_*
-Funktionen den üblichen Funktionen vorgezogen werden, um Speicherauslastung oder Performance-Gründe zu reduzieren. Aber es sollte tatsächliche Zeit / Raum Messungen, reflektierte signifikante Gewinne von diesen Optimierungen verwendet werden.
Der Hauptunterschied besteht darin, dass spin_lock
variants auf raw_spin_lock
variants für nicht-RT abgebildet werden, während wenn CONFIG_PREEMPT_RT
gesetzt ist, dann werden sie auf rt_spin_lock abgebildet, die schlafen können.
Durch die Entkopplung der spin_lock von schlafenden vs nicht-schlafenden Variationen, abhängig davon, ob wir RT sind oder nicht, kann die spin_lock API über den Kernel-Code hinweg konsistent gehalten werden.
Tags und Links linux synchronization linux-kernel locking