The kernel's scheduler takes care of dividing processes in time. Your operating system also has to divide them in space, so that processes don't step on each others' working memory. The things your operating system does to solve this problem are called memory management . Each process in your zoo needs its own area of core memory, as a place to run its code from and keep variables and results in. The data segment is truly unique to each process, but if two processes are running the same code Unix automatically arranges for them to share a single code segment as an efficiency measure.
Efficiency is important, because core memory is expensive.
Sometimes you don't have enough to hold the entirety of all the programs the machine is running, especially if you are using a large program like an X server. To get around this, Unix uses a strategy called virtual memory . It doesn't try to hold all the code and data for a process in core. As the process runs, Unix tries to anticipate how the working set will change and have only the pieces that are needed in core. Memory is far less expensive nowadays and even low-end machines have quite a lot of it.