Concurrency and Asynchronous Programming: a Detailed Overview 8 Figure 1. 1-Multitasking two tasks First, we need to agree on some definitions: Resource : This is something we need to be able to progress a task. Our resources are limited. This could be CPU time or memory. Task : This is a set of operations that requires some kind of resource to progress. A task must consist of several sub-operations. Parallel : This is something happening independently at the exact same time. Concurrent : These are tasks that are in progress at the same time, but not necessarily progressing simultaneously. This is an important distinction. If two tasks are running concurrently, but are not running in parallel, they must be able to stop and resume their progress. We say that a task is interruptible if it allows for this kind of concurrency. The mental model I use I firmly believe the main reason we find parallel and concurrent programming hard to differentiate stems from how we model events in our everyday life. We tend to define these terms loosely, so our intuition is often wrong. 