-uniprocessor scheduler. In this model, one of the threads with the highest priority
-always runs. When a thread's priority changes, or when threads block or unblock,
-a scheduling decision must be triggered to ensure this invariant. Students learn about
-the different ways in which such situations occur.
-Project 1 also introduces synchronization primitives such as semaphores, locks,
-and condition variables. The project explores the interaction between such primitives,
-thread states, and the scheduler.
-
-Based on the priority scheduler, students implement two additional tasks: priority
-inheritance and a multi-level feedback queue scheduler. Priority inheritance is a way
-to avoid priority inversion, a phenonemon that most famously led to an almost-failure
-of the Mars Pathfinder Mission. We use this example to motivate
-the problem. Implementing priority inheritance correctly requires a deep understanding of the
-interaction of threads and locks.
+uniprocessor scheduler; students learn about the different ways in which
+such a scheduler must react to thread state changes.
+% cut for length
+%Project 1 also introduces synchronization primitives such as semaphores, locks,
+%and condition variables and explores the interaction between such primitives,
+%thread states, and the scheduler.
+
+Based on the priority scheduler, students implement priority inheritance,
+which deepens their understanding of the interaction of threads and locks.
+We use the example of the near-failure of the Mars PathFinder mission to motivate
+the need for priority inheritance.