My take on explaining this would be through a bit organic metaphor:
In multi-threading computing happens at the same time, but all the threads come out of the main()/spawn/listen-accept function. Threads diverge like a tree, and so is memory allocation. When the exception unwinds the stack, it goes in a reverse direction and can be passed to parent. One thread can breach other thread’s resources/memory easily.
In BEAM, processes are more like separate cells - each has a small stack, small memory space (small isolated state easy to debug!). It is linked in a supervision tree , instead of an execution tree - which means that if some part of the program cells die, they can be rejuvenated. The execution chains can run in all directions via synchronous or asynchronous calls between cells-processes, and an exception in a process can but doesn’t have to be propagated to caller or parent - depending on many ways you can link and monitor processes between each other.






















