Zum Inhalt springen

Lock

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 26. Januar 2005 um 22:55 Uhr durch Duesentrieb (Diskussion | Beiträge) (Erster Entwurf, Ergänzung folgt.). Sie kann sich erheblich von der aktuellen Version unterscheiden.
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Ein Lock (engl. Schloss) ist in der Informatik ein Konzept zur Prozesssynchronisation bzw. zur Realisierung von Mutex (gegenseitigem Ausschluss) bei nebenläufigen Prozessen (bzw. Threads). Ein Lock kann zum selben Zeitpunkt immer nur von einem Prozess besessen werden - versuch ein anderer Prozess das Lock in Besitz zu nehmen während es schon "vergeben" ist, so muss er warten bis das Lock wieder frei wird.

Einfache Locks kennen nur Zwei zustände, "frei" und "vergeben", und sind somit das gleiche wie Semaphoren der Größe 1.


Neben den einfachen Locks werden vor allem so genannte Read-Write-Locks verwendet, um den Lese- und Schreibzugriff auf Daten zu regeln.

Read-Write-Locks

Ein Read-Write-Lock verwaltet intern einen Zähler für den Lesezugriff und eine Flagge für den Schreibzugriff. Das Lock sorgt nun dafür, dass beliebig viele Prozesse gleichzeitig lesen können, aber niemals zwei Prozesse gleichzeitig schreiben, und auch kein Prozess ließt währen ein anderer schreibt und umgekert. Will also ein Prozess lesen, muß er warten, falls gerade geschrieben wird. Will ein Prozess schreiben, muss er warten falls gerade gelesen oder geschrieben wird. Read-Write-Locks können mit hilfe einfacher Locks oder mit Semaphoren implmentiert werden.


Implemetation von Locks

Der zentrale Aspekt von Locks ist die Fähigkeit, einen Prozess der gerade nicht "bedient" werden kann so lange warten zu lassen bis das Lock frei ist. Dies ist grundsätzlich auf zwei Arten möglich:

  • Mit Hilfe des Schedulers (also des Betriebssystems bzw. der Laufzeitumgebung, siehe Time Sharing): Der Scheduler kennt das Lock und weist dem Prozess solange keine Rechenzeit zu, bis das Lock frei ist. Das ist im Allgemeinen nur dann möglich, wenn der Lock-Mechanismus vom Betriebssystem (bzw. der Laufzeitumgebung) bereitgestellt wird, denn nur dann kann der Scheduler das Lock und seinen aktuellen Zustand kennen.
  • durch Implementation als Spinlock: der Prozess prüft in einer Schleife ständig, ob das Lock frei ist, und erst dann fort. Dies ist auch ohne unterstützung des Schedulers möglich, hat aber den Nachteil dass der Prozess Rechenzeit verbraucht während er wartet (Busy Waiting). Wenn das Betriebssystem (bzw. die Laufzeitumgebung) eine Möglichkeit bieten einen Prozess für eine vorgegebene Zeit "schlafen" zu lassen, so ist das nicht ganz so schlimm da nur in regelmässigen Abständen etwas rechenzeit gebraucht wird um das Lock zu prüfen. Bietet das Betriebssystem diese Möglichkeit aber nicht, so beansprucht der Prozess während des Wartens die volle Rechenleistung das Systems und kann dadurch andere Prozesse ausbremsen.