GoConqr hat ein neues Design! Sag uns, wie es dir gefällt.

Notizen

mutex_lock vs enter_region

Ahmad Abdelwahed Operating Systems 0 Englisch 1 Seite

Inhalt der Notizen (1)

Seite 1

enter_region:

TSL REGISTER, LOCK

CMP REGISTER, #0

JNE enter_region

RET

leave_region:

MOVE LOCK, #0

RET

mutex_lock:

TSL REGISTER, MUTEX

CMP REGISTER, #0

JZE ok

CALL thread_yield

JMP mutex_lock

ok: RET

mutex_unlock:

MOVE MUTEX, #0

RET

The code of mutex_lock is similar to the code of enter_region but with a critical difference. When enter_region fails to enter the critical region, it keeps testing the lock repeatedly (busy waiting). Eventually, the clock runs out and some other process is scheduled to run. Sooner or later the process holding the lock gets to run and releases it.

With (user) thread, the situation is different because there is no clock that stops threads that have run too long. Consequently, a thread that tries to acquire a lock by busy waiting will loop forever and never acquire the lock because it never allows any other thread to run and release the lock.

That is where the difference between enter_region and mutex_lock comes in. When the later fails to acquire a lock, it calls thread_yield to give up the CPU to another thread. Consequently, there is no busy waiting. When the thread runs the next time, it tests the lock again.

Since thread_yield is just a call to the thread scheduler in user space, it is very fast. As a consequence, neither mutex_lock nor mutex_unlock requires any kernel calls.

Informationen

Beschreibung
The key difference between mutex_lock and enter_region, even though there code look similar.
Erstellt von
Ahmad Abdelwahed · Mai 2015
Aktualisiert
19 Feb 2016
Aufrufe
89
Bewertung

Feedback

Worum geht es?

Wie gefällt dir das neue Design?

Dein Eindruck