Introduction to Embedded Systems

advertisement
More on Synchronization and Deadlocks
Lecture 16
Introduction to Embedded Systems
Summary of Previous Lecture
• Critical sections
– the atomicity requirement
• Techniques to enforce critical sections
–
–
–
–
–
–
Solution 1: too hard-wired
Solution 2: does not work!
Solution 3: deadlock!
Solution 4: starvation!
Solution 5: Dekker’s algorithm
Semaphores: good…
• Implementing Semaphores
– test-and-set instructions
– ARM instructions
Introduction to Embedded Systems
Quote of the Day
Conceit is bragging about yourself.
Confidence means you believe you can get the job done.
– Johnny Unitas
Introduction to Embedded Systems
Outline of This Lecture
• Types of Synchronization
• Deadlocks
• Some classical synchronization problems
Introduction to Embedded Systems
Types of Synchronization
• There are 2 basic types of synchronization:
P1::
P(s1)
...
V(s1)
P2::
P(s1)
...
V(s1)
Mutex
P1::
P(s1)
...
V(s2)
P2::
P(s2)
...
V(s1)
Barrier
Synchronization
Introduction to Embedded Systems
Deadlocks
• When a program is written carelessly, it may cause a... deadlock!!!
• Each process will wait for the other process indefinitely
– How can we deal with these abnormalities?
– Avoidance, prevention, or detection and resolution
• Which one is more efficient?
P1::
P(s1);
P(s2);
...
V(s2);
V(s1);
P2::
P(s2);
P(s1);
...
V(s1);
V(s2);
Introduction to Embedded Systems
Dining Philosophers
• There were some hungry philosophers, and some angry philosophers
– Each needed two forks, each shared both his/her forks
– Possible deadlock situation! HOW?
• Is it possible to have a (literally) starvation situation?
• What is the best solution?
– Roundrobin? FIFO? How good are FIFO and RR?
• Important: what is the metric to judge a solution by?
– Least overhead? Minimum starvation?
– How to evaluate fairness?
Introduction to Embedded Systems
Deadlocks
• Several processes “executing” at the same time, and one is waiting
(blocked) for (by) another, which in turn is waiting for another, which in
turn... which in turn is waiting for the first.
– No process can finish, since they are all waiting for something
• The difference between deadlock and starvation of a process is that
– In deadlock, a process must be able to acquire a resource at first, and then go
into deadlock.
– In starvation, the request may be deferred infinitely
• the resource may be in use for an infinite amount of time
Introduction to Embedded Systems
Necessary Conditions for a Deadlock
• Formally: (these conditions must hold for deadlock to occur)
• mutual exclusion: some resource is nonsharable, (eg, a printer)
• hold and wait: there must exist a process holding for a resource (eg, a
printer) and waiting for another resource (eg, a plotter)
• no preemption: the system will not preempt the resources in contention
• circular wait: there must exist a circular chain of processes.
– One is holding a resource and waiting for the next process
Introduction to Embedded Systems
Deadlock Handling
• Prevention: structure the system is such a way as to avoid deadlocks (ie,
in a way to avoid one of the conditions above).
– This is done in the design phase: design a system and ensure that there is no
deadlock in the system.
• Avoidance: does not make deadlock impossible (as in prevention)
– Instead, it rejects requests that cause deadlocks by examining the requests
before granting the resources. If there will be a deadlock, reject the request.
• Detection and Recovery: after the deadlock has been detected, break
one of the 4 conditions above. The mechanisms of deadlock detection
and deadlock recovery are very much tied to each other.
• deadlock detection varies from a centralized to a distributed system
• deadlock recovery can be optimistic or pessimistic, depending on system
design (which depends on the probability of deadlock occurrence)
Introduction to Embedded Systems
Deadlock Avoidance Special Case:
Banker's Algorithm
• It is based on how a bank would work with several clients that borrow
and invest money
– It differentiates between safe (deadlock is impossible, because there are
enough resources) and unsafe states (the opposite)
– The OS will refuse requests for resources from processes if the request will
take the system to an unsafe state.
– If the system is always in a safe state, there will never be a deadlock.
– When a request arrives, the Banker's algorithm checks whether there will be
enough resources (money) to cover all the money to be returned to the
clients in case they decide to withdraw.
– Since withdrawal can only occur sequentially, the Bank does not need to
have all the money in escrow.
Introduction to Embedded Systems
Banker's Algorithm
If there is a process that can be satisfied with the currently available
resources, that process will eventually relinquish the other resources it
holds. If all the resources held by a process are sufficient to cover the
needs of another process, that will be second in line, and so on:
safe = T; available = #_available_res;
L = list of all active processes;
repeat {
if there is a process P in L such that
available >= #_unclaimed_res[P]
then {
delete P from L;
available += #_held_res[P];
}
else safe = F;
} until (L is empty) or (safe = False)
Introduction to Embedded Systems
Deadlock Prevention
• The most usual prevention methods rely on a certain ordering on
resource acquiring
– e.g., a numbering scheme
• The resources are numbered with unique identifiers and the processes
request resources in increasing id (number)
– Another method forces processes to acquire all resources that will be needed
at once
• success or failure in getting resources
– Another method will force the processes to release all resources acquired (it
is currently holding) whenever it blocks on the next resource request
Introduction to Embedded Systems
Graph Models for Deadlock Detection
• If each resource has a single instance in a system, a graph model can
directly tell you if there is a deadlock in the system.
• A WFG (wait-for graph) is a graph in which if a process (depicted by a
node) is waiting for a resource being held by another process, there is an
edge between those nodes
• If there is a cycle in the WFG, then there is a deadlock present
– The deadlock will consist of the processes involved in the cycle
– One can generalize this concept, for systems in which more than a single
instance of a resource is present.
– In this new model, there will be two types of nodes
• processes depicted by squares
• resources, depicted by circles
– smaller circles inside are instances
– Resources can be of two types:
• reusable or consumable
Introduction to Embedded Systems
Modeling Processes/Resources
• Reusable resources: can be used over and over again
– serially reusable: can only be used by one process at a time (printer)
– sharable: usage can be interleaved by several processes at a time (cpu)
• Consumable resources: disappears after use by a process (message)
• Resource/process graphs are bipartite, partitioned into P and R sets, and
there can be more than 1 instance of a resource (e.g., memory)
– The resource graph (also called waitfor graph WFG) denotes whether there is a
deadlock in the system
– If there is a cycle in WFG after graph reduction, then a deadlock is present
• If it is possible to eliminate all edges from WFG, then there is no deadlock
P2
consumable
R1
request
P1
assign
R2
Introduction to Embedded Systems
Graph Model
• A graph is called completely reducible if a sequence of reductions
eliminates all edges of the graph
• A reduction can be done as follows:
– If R is a reusable resource, delete all (P,R) and (R,P) and increment the
number of units of R by 1.
– If R is a consumable resource, delete all (P,R) and (R,P) edges, decrement
the number of units of R by number of edges (P,R) and (R,P), and if P is a
producer, set the number of units of R to infty
• A graph is in an expedient state if all processes with unfulfilled requests
are blocked.
• A knot is a set of nodes in the graph from which you can only get to
nodes in that set.
– In the case of a graph in an expedient state, a knot is a sufficient condition
for deadlock.
Introduction to Embedded Systems
Producers/Consumers
• 1+ processes produce data, other 1+ processes consume data
• Producing means the data is put in a buffer; consuming means the data is
removed from the buffer (and therefore no other process should be able
to read/remove that item)
– The buffer has k positions, where k = 1, 2 … k < ., or k = .
• Problem definition:
Both producers and consumers operate concurrently, but data items are
consumed in the order they are produced (ie, FIFO)
• The solutions will differ, according to the size of the buffer
– If there is a single buffer (ie, k = 1), the solution is simple
– For the unbounded buffer problem, the solution is less than trivial, but still
simple
– For the bounded buffer problem, with multiple consumers and producers, the
problem is a bit more complex
Introduction to Embedded Systems
Readers / Writers
• Another classical concurrency problem, similar to producer/consumer
– The difference is that the consumers do not remove the data item being
“consumed”, they just read it.
– Therefore, many readers can potentially access the same data item at once,
since no common data structures are modified
• The writers can only act one at a time, due to the ME (mutual exclusion)
constraints;
–
–
–
–
What if there is a single writer and a single reader? concurrency?
What if there is a single writer and multiple readers?
What if there are multiple writer and multiple readers?
Should readers be given preference or writers? When?
• Define the problem carefully, then devise solution
Introduction to Embedded Systems
Summary of Lecture
• Types of Synchronization
• Deadlocks
– necessary conditions for deadlocks
– dealing with deadlocks
• Some classical synchronization problems
– producer/consumer problems
– reader/writer problems
– the “dining philosophers” problem
Introduction to Embedded Systems
Download