|
|
Read-Copy Update
Traditional operating-system locking designs tend to either be very
complex, result in poor concurrency, or both. These traditional locking
designs fail to take advantage of the event-driven nature of operating
systems, which process many small, quickly completed units of work (in
contrast to CPU-bound software such as scientific applications). This
event-driven nature can often be exploited by splitting updates into the
two phases: 1) carrying out enough of each update for new requests to see
the new state, while still allowing existing requests to proceed on the old
state, then: 2) completing the update after all active requests have
completed. Common-case code can then proceed without disabling interrupts
or acquiring any locks to protect against the exceptional code, which
simplifies locking protocols, improves uniprocessor performance, and
increases scalability. Examples of the application of these techniques
include maintaining read-mostly data structures, such as routing tables,
avoiding the need for existence locks (and hence avoiding locking
hierarchies with the attendant deadlock issues), and dealing with unusual
situations like module unloading.
|
|