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