Unit 13 Study Guide
- Explain the definitions and the differences between strong scaling and weak scaling. Describe scenarios in which one is preferred over the other.
 - Explain Amdahl's Law and its repercussions for concurrent programs.
 - Describe the history of concurrent programming, including special-purpose processors, vector processors, clusters, and GPUs.
 - Enumerate the different levels of computing that can benefit from concurrency.
 - Explain the difference between SIMD and MIMD architectures and give examples of each.
 - Define physical and logical concurrency and which groups of people care about the difference.
 - Explain the difference between synchronous and asynchronous tasks, giving examples of each.
 - Explain the common differences between heavyweight and lightweight tasks and their usual mappings to processes and threads.
 - Describe the job of a scheduler and briefly sketch the life cycle of a thread.
 - Explain and give examples of various problems that arise in concurrent programs, including deadlock and race conditions. Describe the classic dining philosopher and producer-consumer problems.
 - Define synchronization, including the difference between cooperative and competitive synchronization.
 - Explain and give examples of synchronization mechanisms, such as locks, semaphores, monitors, and message passing.
 - Analyze and discuss the implementation of synchronization mechanisms in popular languages.
 - Briefly summarize the rise and fall of High-Performance Fortran, and discuss its industrial and social legacy.