Modern computer programs do not exist in isolation, splendid or otherwise. Even on personal computers, there is an operating system which is a program for doing input and output, handling devices at a low level and providing common service routines. On larger computers, minicomputers, mainframes and even workstations, many programs may be running at the same time, belonging to different users. All of these must peacefully coexist in order for people to get their work done efficiently and quickly.
Up to this point, we have imagined that our programs were running on the bare machine, that we controlled all of memory and all devices. We will continue this illusion when it suits us, such as when we investigate input and output. But in the real world, when several programs exist in memory at the same time, many problems can arise. For example, one program's loop may have a logical flaw, causing it to loop endlessly. If this loop's purpose is to set all elements of an array to 0, and it goes out of bounds of the array, even out of bounds of the program, it may clobber someone else's program, setting it all to 0s.
Another possibility is that a malicious person in the computing community may try to destroy others' programs or to gain unauthorized entry. If there is no protection on memory, then there is no hope of stopping such people.
Closely related to the issue of protection is that of relocation. Programs are usually written so that they start at location 0 in memory but in reality only one program can do this at any given moment. In fact, the operating system often occupies low memory, words having low numbered addresses such as 0, 1, 2, ... Thus, some way has to exist for either rewriting programs or transparently moving them from one location to another.