A **sequential algorithm** is the formal description of the behavior of an *abstract* state machine. A **program** is a sequential algorithm written in a programming language. A **process** is a program executed on a *concrete* machine, characterized by its *state* (values of the registers). If the process follows one single control flow (i.e. one program counter) then it is a **sequential process**, or thread. A set of sequential state machines that run simultaneously and interact through shared memory through a *shared medium* is called **concurrency**. In a concurrent system there must be something shared. ##### Advantages of concurrent systems: - efficiency: run in parallel different stuff - simplification of the logic by dividing the task in simpler tasks, running them in different processes and combining the results together. ### Features of a concurrent system We can assume many features: - Reliable vs Unreliable - Synchronous vs Asynchronous - Shared memory vs Channel-based communication **Reliable** system: every process correctly executes its program **Async**