Virtual memory is used to provide the illusion of either having more memory than you really do (by multiplexing multiple virtual addresses onto a smaller set of physical addresses) or having more processors than you really do (by time-slicing the processor and providing each time-sliced process with a separate address space).