Komputerowe systemy operacyjne (ang. operating systems, skrót OSes) dostarczają zestawu funkcji wymaganych i używanych przez większość aplikacji uruchamianych na komputerze, a także tych pozwalających kontrolować i synchronizować pracę sprzętu komputerowego. Pierwsze komputery nie były wyposażone w systemy operacyjne, przez co każdy program uruchamiany na nich potrzebował pełnej specyfikacji sprzętu, żeby poprawnie pracować i wykonywać podstawowe zadania. Dodatkowo każdy taki program musiał być wyposażony we własne sterowniki do urządzeń peryferyjnych, takich jak drukarki, czy czytniki kart perforowanych. Wzrost złożoności komputerów oraz programów pracujących na nich sprawił, że systemy operacyjne stały się niezbędne do codziennego użytku.
Tło historyczne Pierwsze komputery były mainframe’ami bez jakiegokolwiek systemu operacyjnego. Użytkownicy rezerwowali całą maszynę na pewien okres i przychodzili z gotowym programem i danymi wejściowymi, zwykle zapisanymi na karcie perforowanej, taśmie magnetycznej lub taśmie papierowej. Następnie program był ładowany do pamięci komputera i pracował do momentu zakończenia lub do pojawienia się błędu. Programy mogły być debugowane w panelu sterowania poprzez przełączniki i kontrolki.
Początkowo programista musiał zapisać program w kodzie maszynowym. Później powstały języki symboliczne, asemblery oraz kompilatory, które tłumaczyły kod źródłowy programu na kod maszynowy komputera. Późniejsze maszyny były tworzone wraz z bibliotekami, które zawierały ułatwiający pracę gotowy kod zapisany na kartach perforowanych lub taśmach magnetycznych. Takie biblioteki były następnie łączone z programem użytkownika i pomagały w typowych operacjach, np. wejścia i wyjścia. Z nich wywodzą się nowoczesne systemy operacyjne.
Wraz ze wzrostem mocy obliczeniowej komputerów czas pracy poszczególnych programów malał, przez co stosunek czasu, w którym jeden użytkownik kończył pracę i przekazywał sprzęt następnemu, do czasu pracy programów rósł bardzo szybko. Rozliczanie pracy użytkowników na maszynach ewoluowało z ręcznego sprawdzania zegara do automatycznego logowania przez sam komputer. Kolejki zmieniły się z dosłownej kolejki ludzi czekających przy drzwiach na stos nośników leżących na stole z oczekującymi zadaniami albo stos kart perforowanych leżących na czytniku, z którego komputery same potrafiły wybierać następne karty. Wyznaczeni operatorzy przejęli obowiązki programistów uruchamiania programów na komputerze, a także utrzymywania maszyny w dobrym stanie technicznym. Gdy komercyjne centra obliczeniowe stanęły przed problemami wynikającymi z utraty danych przez fałszowanie lub błędy obliczeniowe, dostawcy sprzętu zostali zmuszeni do rozwinięcia bibliotek uruchomieniowych w celu zapobiegania nadużywania zasobów. Automatyczne monitorowanie nie było już potrzebne wyłącznie do rejestrowania czasu użycia procesora, ale także do liczenia wydrukowanych stron, kart perforowanych, odczytanych kart, używanej pamięci dyskowej oraz interwencji operatora przy zadaniach takich jak zmiana taśmy magnetycznej. Następnie dodane zostały funkcje poprawiające bezpieczeństwo, na przykład zapisywanie, który program odczytywał jakie pliki, czy ograniczenie dostępu do pliku z listą płac.
Wszystkie te funkcje łącznie tworzyły coraz bardziej kompletny system operacyjny. Biblioteki uruchomieniowe zostały połączone w jeden program, który uruchamiał się przed pierwszym programem klienta, kontrolował pracę programów klientów, zapisywał zużycie zasobów systemowych, a po skończonej pracy natychmiast uruchamiał następny program w kolejce. Takie programy działające w tle były zwykle nazywane monitorami lub programami monitorującymi, zanim powstał termin system operacyjny.
Podstawowy program oferujący zarządzanie sprzętem, harmonogramowanie programów i monitorowanie zasobów może wydawać się odległym przodkiem systemów operacyjnych zorientowanych na użytkownika z ery komputerów osobistych. W pewnym momencie nastąpiła jednak zmiana w znaczeniu terminu system operacyjny. Coraz więcej programów, które kiedyś były opcjonalne, stało się standardem w każdym systemie operacyjnym. Doprowadziło to do postrzegania systemu operacyjnego jako kompletnego systemu dla użytkownika, zawierającego zintegrowany graficzny interfejs, podstawowe narzędzia oraz aplikacje takie jak edytory tekstowe, menedżery plików, czy narzędzia konfiguracyjne.
Prawdziwym potomkiem wczesnych systemów operacyjnych jest to, co dzisiaj nazywamy „jądrem”.
Mainframe’y Pierwszym systemem operacyjnym był Director Tape pracujący na komputerze Whirlwind. System ten powstał w 1954 roku, a został zaprezentowany przez Douga Rossa 8 maja 1955 roku. W 1955 roku General Motors stworzyło system General Motors OS dla komputera IBM 704. W 1956 General Motors współpracując z North American Aviation stworzyło pierwszy system operacyjny, który był użyty w praktyce do prawdziwej pracy, GM-NAA I/0, znów dla maszyny IBM 704.
Wszystkie powyższe systemy były uzupełnieniem bibliotek uruchomieniowych. Ich podstawowym zadaniem było zainicjalizowanie programu użytkownika, uruchomienie go, monitorowanie programu i zasobów, zwolnienie zasobów po zakończeniu pracy programu i automatyczne uruchomienie następnego programu. Dzięki nim zminimalizowano czas bezczynności komputerów, zmniejszono ilość potrzebnego personelu, a także uproszczono sposób uruchamiania programów.
Wczesne systemy operacyjne były bardzo zróżnicowane. Każdy dostawca i każdy klient tworzyli jeden lub więcej systemów operacyjnych odnoszących się do konkretnego mainframe’a. Każdy system operacyjny, nawet od tego samego dostawcy, mógł mieć zupełnie różne modele poleceń, procedur operacyjnych i pomocy przy takich czynnościach jak debugowanie. Zwykle za każdym razem gdy dostawca tworzył nową maszynę, powstawał nowy system operacyjny, a większość aplikacji musiała być ręcznie poprawiona, zrekompilowana oraz ponownie testowana.
Systemy dla komputerów IBMu Sytuacja ta trwała do 1960 roku, gdy IBM, który był już wtedy wiodącym dostawcą sprzętu, przerwał pracę nad istniejącymi systemami i skoncentrował wszystkie swoje wysiłki w rozwijaniu maszyn z serii System/360, z których wszystkie używały takich samych poleceń wejścia/wyjścia oraz architektury. IBM miał na celu stworzenie jednolitego systemu operacyjnego dla nowego sprzętu, OS/360. Problemy napotykane podczas rozwoju OS/360 są legendarne. Zostały opisane przez Freda Brooksa w książce The Mythical Man-Month, która stała się klasykiem inżynierii oprogramowania. Ze względu na różnice w wydajności sprzętu i opóźnienia w rozwoju oprogramowania, wprowadzona została cała rodzina systemów operacyjnych, zamiast pojedynczego OS/360.Chuck Boyer, The 360 Revolution.
Ostatecznie IBM wypuścił serię tymczasowych rozwiązań przed wydaniem dwóch dłużej działających systemów operacyjnych: OS/360 dla systemów średniej wielkości oraz dużych. Dostępny był w trzech generacjach: PCP dla wczesnych użytkowników oraz dla tych, którzy nie mieli zasobów na wprowadzenie wieloprogramowania. MFG dla średniej wielkości systemów, zastąpiony przez MFT-II w OS/360 w wydaniu 15/16. Miał jednego następcę, OS/VS1, nad którym pracę przerwano w latach 80. MVT dla dużych systemów. Był bardzo podobny do PCP i MFT (większość programów mogła być przenoszona pomiędzy tymi systemami bez rekompilowania), ale miał bardziej zaawansowane zarządzanie pamięci oraz współdzielenie czasu. MVT miał wielu następców, w tym aktualny z/OS. DOS/360 dla małych maszyn z serii System/360. Miał wielu następników, w tym aktualny z/VSE. Znacząco różnił się od OS/360.
IBM zachowało pełną kompatybilność wstecz, więc programy napisane w latach 60. wciąż można uruchomić na systemie z/VSE (jeśli były napisane na DOS/360) lub z/OS (jeśli były napisane na MFT lub MVT) nie wprowadzając żadnych zmian.
Systemy operacyjne innych mainframe’ów Control Data Corporation w latach 60. stworzyło system operacyjny SCOPECDC użyło nazwy SCOPE dla różnych systemów operacyjnych z serii 3000, serii 6000 oraz dla 7600., który miał zaimplementowane przetwarzanie wsadowe, a później system MACE ze współdzieleniem czasu, który był podstawą dla systemu Kronos. CDC razem z Uniwersytetem Minnesota stworzyli system Kronos, a w latach 70. system NOS, który wspierał symultaniczne przetwarzanie wsadowe oraz współdzielenie czasu. Podobnie jak w przypadku wielu innych komercyjnych systemów obsługujących współdzielenie czasu, jego interfejs był rozszerzeniem systemu DTSS.
W późnych latach 70., Control Data i Uniwersytet Illinois stworzyły system PLATO, który miał plazmowe ekrany oraz długodystansowe sieci współdzielenia czasu. PLATO był niezwykle innowacyjny jak na swoje czasy. Model współdzielenia pamięci języka programowania TUTOR umożliwił stworzenie takich aplikacji jak czat w czasie rzeczywistym i graficzne gry wieloosobowe.
Dla maszyny UNIVAC 1107, UNIVAC, pierwszy komercyjny dostawca komputerów, wyprodukował system operacyjny EXEC I, a Computer Sciences Corporation stworzyło system EXEC II i dostarczyło go do firmy UNIVAC. System ten został później przeniesiony na komputer UNIVAC 1108. Następnie UNIVAC stworzyło system EXEC 8 dla komputera 1108, który był podstawą późniejszych systemów operacyjnych tej rodziny. Podobnie do innych wczesnych mainframe’owych systemów, EXEC I i EXEC II były systemami zorientowanymi wsadowo, zarządzającymi pamięciami bębnowymi, dyskami, czytnikami kart i drukarkami. System EXEC 8, oprócz trybu wsadowego, wspierał również przetwarzanie transakcji online. W latach 70. UNIVAC stworzył system Real-Time Basic (RTB) do wspierania współdzielenia czasu na dużą skalę, wzorowany na systemie Dartmouth BASIC.
Burroughs Corporation wprowadziła w 1961 roku komputer B5000 z systemem operacyjnym Master Control Program (MCP). Komputer B5000 wspierał jedynie języki wysokiego poziomu i nie posiadał żadnego oprogramowania, nawet najniższych warstw jądra, napisanego w języku maszynowym lub asemblerze. MCP zaprezentował wiele przełomowych innowacji, np. miał jednąKomputer B5000 powstał w czasach komputera ATLAS. z pierwszych implementacji pamięci wirtualnej. Wersja systemu MCP dla komputera B6500 wciąż jest w użyciu w serii komputerów ClearPath/MCP firmy Unisys.
Na początku lat 60. naukowcy z MIT zauważyli, że następuje kolejny krok milowy w sposobie pracy na komputerach. Na początku lat 50. skupiano się przede wszystkim na rozwoju sprzętu. Następnie, w połowie lat 50., powstawały pierwsze języki programowania, co uprościło tworzenie programów. Trzecim krokiem miało być uproszczenie interakcji między człowiekiem a komputerem. W tym celu stworzyli eksperymentalny system operacyjny ze współdzieleniem czasu na komputer IBM 709, który następnie przenieśli na komputer IBM 7090. System ten pozwolił na jednoczesną pracę 3 użytkowników aktywnych i jednego użytkownika w tle.
W 1962 roku firma General Electric wprowadziła serię komputerów GE-600 z systemem operacyjnym General Electric Comprehensive Operating Supervisor (GECOS). Po przejęciu przez firmę Honeywell biznesu komputerowego GE, została zmieniona nazwa tego systemu na General Comprehensive Operating System (GCOS). W latach 70. Honeywell rozszerzył użycie nazwy GCOS na swoje wszystkie systemy operacyjne, mimo że wiele jego komputerów nie miało nic wspólnego z wcześniejszą serią GE 600, a ich systemy operacyjne nie pochodziły z oryginalnego GECOS.
Projekt MAC na MIT, przy współpracy z GE i Bell Labs, stworzył system operacyjny Multics, który jako pierwszy wprowadził koncepcję kręgów bezpieczeństwa z poziomami uprawnień.