The differences between multi-process and multi-threading have to do
with how the O/S treats the process itself. When a single process is
created the O/S allocates a chunk of memory and a "process" structure;
the process structure allows the O/S to manage the process state. The
process memory is only accessible by that process itself; otherwise
all kinds of chaos would ensue. So if you are creating multiple
processes then each process gets these things. If you wanted to create
an app that performed multiple tasks concurrently, you would spawn new
processes via fork or use some other mechanism like shared memory or
pipes to cooperate/coordinate with each other.
NOTE: Shared memory is a mechanism that creates a chunk of memory that
is managed separately from the process; think of it as a file that has
some data in it that each process can access independently. Just
wanted to clarify that shared memory is *NOT* something that is added
to the existing process' memory already allocated by the Kernel.
A multi-threaded process is still just a single process, so you get
the same aforementioned things from the O/S, but the multiple threads
that are created within that single process can access all of the
process' memory space. The concept of multiple threads allows a single
process to execute multiple tasks concurrently, whereas a single
process has a single thread of execution that occurs. The O/S still
manages the process as if it is a single process, with the MT
libraries provide the controls for the internal task management.
Typically, multi-threaded processes are managed by a library, such as
pthreads in the Unix world.
Hope this helps.