In the very early days of programming there were no operating systems (OS).
In the 1940s, the 1950s, and through at least part of the 1960s, each programmer not only had to write the application program which performed a specific function, he or she also had to write all of the very low level instructions which moved the data between the components of the computer. In addition, the programmer had to write those same instructions for managing data flow in the computer every time a new application program was written. This duplication of effort was very time consuming and wasteful.
Finally, some smart programmer said “Aren’t computers supposed to save people time in repetitive tasks? Why don’t we apply that to us programmers as well?”. In 1956, programmers at General Motors Research Labs, in cooperation with North American Aviation, did exactly that; they wrote a program which they called Input/Output System, which simplified the application programmers’ task.
This I/O System incorporated all of the common groups of instructions which were routinely used to move data from one place in the computer to another into libraries of common functions to which each programmer would have access. These libraries, once having been developed, were then used many times by many different programmers in many different applications. In 1957, IBM announced its Input/Output Control System (IOCS) which provided the same type of functionality. IOCS provided programmers with standard instruction groups which could be used repeatedly for input and output operations.
These control programs allowed for the execution of one program at a time. The computer operator ran the payroll program. When the payroll program was finished, the operator could run an inventory program or accounts receivable, or whatever job was next in line. This is a single tasking environment, like DOS on personal computers.
To run an application program under IOCS, an operator would place a special card (this was in the days of eighty column punched cards) called a bootstrap loader into the read hopper of the card reader attached to the system. Behind this card was placed the application program, and then behind the program, the operator placed the deck of data cards. After the cards were loaded into the reader, the operator pressed the LOAD button on the computer. The computer was just smart enough to read one card from the hopper of the card reader; this was the bootstrap loader. At this point, the computer turned control over to the bootstrap loader which was just smart enough to be able to load the rest of the application program and turn control of the computer over to it. If more than one application needed to be run, the operator would wait until the first application had finished. Then, he or she would place the bootstrap loader into the input hopper of the card reader, place the application and data decks in behind, and press the LOAD button again.
In 1962, IBM developed IBSYS, which provided not only for standard I/O instruction groups, but also supervised the operation of the computer. IBSYS supervised the loading and operation of application programs by allowing automatic sequential execution of multiple programs. It allowed multiple programs and their data to be placed in the input hopper of the card reader and it automatically executed each of those programs, one after the other. No more bootstrap loader was required in front of every application program. IBSYS also provided messages to the system operator to mount or dismount tapes and disk packs, as well as to change the paper in the printer so that checks could now be printed, for example, instead of invoices. This capability is very much like the batch files of DOS, Windows and OS/2 which can be used to execute a sequence of commands and programs.
Shell scripts in Unix and Linux perform a similar function to batch files, allowing sequential execution of a long series of commands. But shell scripts are far more advanced and can provide very complex program control and management functions.
IBM introduced the IBM System/360 in 1964, and with it, a new operating system, OS/360. OS/360 was a multitasking operating system, which now allowed systems to process a continuous flow of many different types of jobs with minimal intervention from the operators. Multitasking meant that multiple programs could be loaded into the computer and executed simultaneously. The multitasking capability of OS/360 was initially limited to a maximum of three programs, however. Later operating systems provided the capability to multitask as many programs as the computer had the resources to allow.
Even when the original IBM PC was released in 1981, some applications were written with their own very basic operating system so that they would be ready on the same day that the PC was announced. This was because neither DOS nor any other OS was ready when those application companies had to start creating their programs.