Beginnings of multiptogramming and compilations for it
The early multiprogramming systems ran two or three programs simultaneously in a single computer. They did so by partitioning the memory amongst


operating system
one user-program
another user-program
...


The user programs shared a single copy of the operating system, which provided input/output and other services through system calls, which switched the processor into a special privileged mode that can access the external hardware. Programs had to be relocatable - able to run wherever in the memory they happened to end up. 

Many advances were made in the Ferranti Atlas hardware and operating system:


virtual memory - both mapping and one-level store;
memory-addressed hardware;
three-level processing hierarchy: interrupt, supervisor, and user; 
SPOOLing - buffering of slow input/output devices.


Time-sharing - time-division multiplexing of processor and sometimes of computer memory - dragged behind, and proved difficult to make a success of. 

Multi-tasking within a single programming model is different and developed almost orthogonally.