Ein Seqlock (Sequential Lock) ist ein Synchronisationsmechanismus des Linux-Kernels, der für Daten optimiert ist, die von vielen Lesern, aber seltenen Schreibern zugreifen werden. Die Grundidee: Leser sperren gar nicht, sondern erkennen anhand einer Sequenznummer, ob sich während des Lesens etwas geändert hat.

Wie ein Seqlock funktioniert

Der Zustand eines Seqlocks ist eine Sequenznummer (englisch sequence counter):

  • Leser merken sich den aktuellen Zählerstand (read_seqbegin), lesen die Daten und prüfen danach erneut den Zählerstand (read_seqretry). Ist er ungerade oder hat sich geändert, war ein Schreiber aktiv — der Lesevorgang wird wiederholt.
  • Schreiber erhöhen den Zähler auf einen ungeraden Wert, schreiben die Daten und setzen ihn am Ende wieder auf einen geraden Wert. Während des Schreibens schützt ein internes Spinlock gegen gleichzeitige Schreiber.
seq = read_seqbegin(&seqlock);
/* Daten lesen (mehrere Felder konsistent) */
if (read_seqretry(&seqlock, seq))
    goto nochmal;  /* Schreiber war dazwischen */

Einsatzgebiete

Seqlocks werden im Kernel dort verwendet, wo Werte sich selten ändern, aber laufend gelesen werden — klassisch die Systemzeit (jiffies, TSC), die gettimeofday-Routinen und Teile der Netzwerk-Statistiken. Auch in der Speicherverwaltung und bei stat-Aufrufen finden sie sich.

Abgrenzung zu anderen Sperren

Eine Lese-Schreib-Sperre blockiert Leser, sobald ein Schreiber aktiv ist — ein Seqlock nicht: Leser arbeiten immer weiter und wiederholen nur. Das macht Seqlocks schnell, hat aber einen Preis:

  • Bei vielen Schreibern können Leser verhungern (Starvation) — der Zähler ändert sich ständig, jeder Leseversuch scheitert und muss neu starten. In Extremfällen kann das an einen Livelock grenzen.
  • Seqlocks eignen sich nicht für Zeiger auf freigegebene Datenstrukturen — der gelesene Zeiger kann ungültig werden, bevor der Leser fertig ist.

Für leseintensive Daten mit seltenen Updates ist das Seqlock-Design eine gute Alternative zu klassischen Sperren. Einen anderen Weg, Leser komplett sperrfrei zu machen, geht RCU: Dort wird nicht gewartet, sondern die Datenstruktur selbst ausgetauscht. Beide Mechanismen hängen eng mit der Nebenläufigkeit und atomaren Operationen zusammen.