Content deleted Content added
InedibleHulk (talk | contribs) m →Caveat: Hyphen, comma, negative. |
Poignancy, explanation of underlying mechanisms |
||
Line 1:
In [[computer
[[mutual exclusion]] in [[multiprocessor]] environments. Although a correct [[lock (computer science)|lock]] can be implemented with test-and-set,
Given a lock:
''boolean'' locked := false ''// shared lock variable''
'''procedure''' EnterCritical() {
'''do''' {
'''while''' ( locked == true )
'''skip''' ''// spin using normal instructions until the lock } '''while''' ( ''TestAndSet''(locked) == true ) ''// attempt actual atomic locking using the [[test-and-set]] instruction''
}
'''procedure''' ExitCritical() {
locked := false
}
The difference to the simple test-and-set protocol is the additional spin-loop (the ''test'' in ''test and test-and-set'') at the start of the entry protocol, which utilizes ordinary load instructions. The load in this loop executes with less overhead compared to an atomic operation (resp. a [[Load-link/store-conditional | load-exclusive]] instruction). E.g., on a system utilizing the [[MESI]] cache coherency protocol, the cache line being loaded is moved to the Shared state, whereas a test-and-set instruction or a load-exclusive instruction moves it into the Exclusive state.
This is particularly advantageous if multiple processors are contending for the same lock: whereas an atomic instruction or load-exclusive instruction requires a coherency-protocol transaction to give that processor exclusive access to the cache line (causing that line to ping-pong between the involved processors), ordinary loads on a line in Shared state require no protocol transactions at all: processors spinning in the inner loop operate purely locally.
Cache-coherency protocol transactions are used only in the outer loop, after the initial check has ascertained that they have a reasonable likelihood of success.
If the [[programming language]] used supports [[short-circuit evaluation]], the entry protocol could be implemented as:
Line 29 ⟶ 32:
==Caveat==
Although this [[Optimization (computer science)|optimization]] is useful in [[system programming]],
the knowledge of who is blocking on what. Consequently, the scheduler will have to guess on how to allocate CPU time among the threads -- typically just allowing the threads to use up their timing quota. Threads will end up burning CPU cycles spinning, waiting for threads that are not scheduled.
By using operating-system provided lock objects, such as mutexes, the OS can schedule exactly those threads ready to run.
==See also==
|