In modern operating systems, applications do not directly access the physical memory. Instead, they use so-called virtual memory, where each virtual address is translated to a physical address. Why would one do this? Here are some of the reasons that virtual memory is useful:
To isolate and protect processes from each other,
To manage the limited physical memory ef?ciently,
To give each process the illusion of having the whole address space for itself.
Since each program thinks it has the whole memory to itself, programs can use a lot of virtual memory. In fact, a computer might use huge amounts of virtual memory, much more than the amount of actual physical memory available. Most of the time this works fairly well, since processes typically only need to use a small amount of their virtual memory at once, and often a lot can be shared among processes (such as with shared libraries). But if the system gets into a situation where the active virtual memory demands exceed the available physical memory, we will need to use another mechanism, such as "swapping" memory pages to disk.
Virtual memory uses one level of indirection in the translation from virtual addresses to physical addresses.