thumb|Przykład graficznego interfejsu systemu operacyjnego wraz z uruchomionym oprogramowaniem System operacyjny (, skrót ) – oprogramowanie zarządzające systemem komputerowym, tworzące środowisko do uruchamiania i kontroli zadań, najczęściej w formie programów.
W celu uruchamiania i kontroli zadań użytkownika system operacyjny zajmuje się: planowaniem oraz przydziałem czasu procesora poszczególnym zadaniom, kontrolą i przydziałem pamięci operacyjnej dla uruchomionych zadań, dostarczaniem mechanizmów do synchronizacji zadań i komunikacji pomiędzy zadaniami, obsługą sprzętu oraz zapewnieniem równolegle wykonywanym zadaniom jednolitego, wolnego od interferencji dostępu do sprzętu.
Dodatkowe przykładowe zadania, którymi może, ale nie musi, zajmować się system operacyjny to: ustalanie połączeń sieciowych, zarządzanie plikami. Większość współczesnych systemów operacyjnych posiada interfejs graficzny ułatwiający komunikację maszyny z użytkownikiem.
Geneza
Praca z pierwszymi maszynami cyfrowymi polegała na bezpośrednim programowaniu wszystkich operacji w języku maszynowym. Maszyny te nie posiadały żadnego systemu operacyjnego, wszystkie operacje musiały zostać bezpośrednio ręcznie zakodowane. Była to tzw. zerowa generacja systemów operacyjnych lat 40. XX wieku.
Wczesne komputery były urządzeniami bardzo kosztownymi, wobec czego właścicielom tych urządzeń zależało na maksymalnym wykorzystaniu ich możliwości, czyli najczęściej wykonania możliwie jak największej liczby prac. Miało to efektywniej wykorzystać nakłady poniesione na zakup komputera. Komputer zainstalowany w ośrodku obliczeniowym pracował niekiedy nie tylko na potrzeby swojego właściciela, ale realizował usługi dla innych podmiotów gospodarczych. Rozpoczęto poszukiwania możliwości zwiększenia wydajności komputera oraz ułatwienie jego programowania, a ponieważ proste rozwiązania w postaci zmiany CPU na szybszą itp. nie wchodziły w grę (ze względu na koszt), zaczęto szukać innych możliwości polepszenia sytuacji.
W latach 50. pojawiła się pierwsza generacja systemów operacyjnych, które pozwoliły usprawnić wprowadzanie i uruchamianie zadań tak by możliwie w pełni wykorzystać czas procesora. Były to systemy wsadowe (ang. batch), które pozwalały na grupowanie zadań i uruchamianie ich po kolei, przy czym system operacyjny dbał o środowisko wykonania i przekazywanie sterowania pomiędzy kolejnymi zadaniami, natomiast w czasie wykonania zadania miały pełną kontrolę nad komputerem.
Szybko dostrzeżono fakt, że szybkość działania interfejsów wejścia/wyjścia jest niewspółmiernie mniejsza niż jednostki centralnej (zresztą ta zależność utrzymuje się dzisiaj i zdaje się pogłębiać). Wprowadzanie programu i danych z kart perforowanych, a nawet taśm magnetycznych czy drukowanie wyników trwało dużo dłużej niż same obliczenia.
Pierwszą drogą, jaką znaleziono, było umieszczenie na stałe w pamięci komputera oprogramowania realizującego obsługę sprzętu oraz komunikację sprzętu z użytkownikiem. Dzięki temu nie było już konieczne każdorazowe ładowanie kodu obsługi sprzętu i komunikacji z użytkownikiem przy ładowaniu programu użytkowego. Uzyskano w ten sposób pewną oszczędność czasu oraz zwiększono efektywność.
Dalsze ulepszenia polegały na dostrzeżeniu faktu, że podczas samego wprowadzania programu lub wyprowadzania danych na drukarkę procesor komputera jest niewspółmiernie mniej obciążony pracą niż podczas wykonywania obliczeń. Zrodził się więc pomysł aby w tym czasie procesor był zajęty przetwarzaniem innego programu. Taka funkcjonalność, w której komputer wykonuje kilka zadań w tym samym czasie nazywa się wielozadaniowością i jest jedną z podstawowych cech nowoczesnych systemów operacyjnych. Pierwsze wielozadaniowe systemy z podziałem czasu umożliwiające pracę interaktywną pojawiły się w latach 60. XX wieku.
W 1964 roku pojawił się IBM System/360, który umożliwiał pracę w wielu trybach - wsadowym, konwersacyjnym (interaktywnym), oraz umożliwiał przetwarzanie w czasie rzeczywistym z użyciem wielu procesorów. Oprogramowanie systemowe izolowało użytkownika od sprzętu i zapewniało elastyczność, lecz było to kosztem wydajności oraz trudności w wykorzystaniu pełni możliwości komputera.
Na przełomie lat 60. i 70. powstał system UNIX mający być również wielodostępnym i wielozadaniowym systemem z podziałem czasu, lecz prostszym od skomplikowanych systemów (takich jak MULTICS) dla maszyn klasy mainframe. System ten, pierwotnie napisany w asemblerze dla minikomputerów PDP-7, został przepisany w języku C co umożliwiło łatwe przeniesienie go na inne platformy. Wpływ Uniksa widać w większości współczesnych systemów operacyjnychktóre albo należą do odmian samego UNIXa (rodzina BSD), systemów uniksopodobnych (GNU, Linux) albo zawierają możliwości, które pochodzą z odmian systemu UNIX, jak np. interfejs programowania I/O, sieci komputerowej (sockets) i inne.
W latach 70. pojawienie się mikroprocesora oraz mikrokomputerów a w konsekwencji, komputerów osobistych, wiązało się z pojawieniem się początkowo bardzo prostych systemów operacyjnych zorientowanych na pracę interaktywną jednego użytkownika i łatwość programowania. Wiele systemów z tego okresu wykorzystywało interpreter BASIC umieszczany w ROM jako powłokę do pracy interaktywnej. Początkowo proste, jednozadaniowe systemy (CP/M, DOS) były wzbogacane o możliwości znane z systemów dla "większych" komputerów i wraz ze wzrostem możliwości mikrokomputerów systemy te stały się również wielozadaniowe (MP/M, Concurrent DOS), a rozwój grafiki pozwolił na zmianę interfejsu użytkownika z tekstowego na graficzny (MacOS, GEM, AmigaOS, Microsoft Windows, OS/2, X-Window).
Dalszy rozwój możliwości mikrokomputerów a także równoległy rozwój sieci sprawił, że z wyjątkiem prostych systemów wbudowanych większość stosowanych obecnie systemów operacyjnych to systemy wielodostępne, wielozadaniowe z podziałem czasu, umożliwiające korzystanie z wielu procesorów (i koprocesorów).
Istnieją także rozproszone systemy operacyjne, które pracując na wielu komputerach z punktu widzenia użytkownika stanowią jeden spójny system. Do wczesnych systemów tego typu należał HeliOS stworzony dla maszyn opartych na transputerach, współczesnym przykładem jest Amoeba.
System operacyjny jako interfejs pomiędzy maszyną a człowiekiem thumb|Schemat warstw logicznych obrazujący relacje pomiędzy elementami systemu komputerowego|alt=ZdjęciePrezentujaceJakDzialaSystem Aby można było mówić, że system operacyjny tworzy środowisko niezbędne do uruchamiania oraz kontroli zadań, musi on udostępniać interfejs pozwalający na wykonanie pewnych operacji. Przykładowo musi dostarczać metody pozwalające na uruchomienie lub zatrzymanie wskazanego zadania. Zazwyczaj system operacyjny udostępnia w tym celu zestaw funkcji zwanych API (Application Programming Interface) lub wywołań systemowych. Programista aplikacyjny może skorzystać z tych funkcji w celu uzyskania żądanego efektu, przykładowo odczytu danych z pliku dyskowego (o ile system operacyjny posiada system plików).
Jakąkolwiek czynność zadania użytkownika chcą wykonać na sprzęcie, korzystają zawsze z interfejsu systemu. Ma to tę zaletę, że o szczegółach obsługi sprzętu jest poinformowany tylko i wyłącznie system operacyjny, a same zadania nie muszą znać specyfiki obsługi urządzeń. Ułatwia to zadanie programistom aplikacyjnym oraz rozwiązuje potencjalne problemy.
Innym rodzajem interfejsu jest interfejs użytkownika. Dzięki niemu możliwa jest bezpośrednia interakcja użytkownika z komputerem, choćby tak trywialna jak bezpieczne wyłączenie maszyny. Należy przy tym zwrócić uwagę, że o ile interfejs programowy (API lub wywołania systemowe) jest elementem koniecznym, o tyle interfejs użytkownika jest elementem opcjonalnym.
Budowa systemu operacyjnego thumb|Schematyczna budowa systemu komputerowego Przyjęto, że system operacyjny dzieli się na trzy główne elementy:. jądro systemu wykonujące i kontrolujące zadania: planisty czasu procesora, ustalającego które zadanie i jak długo będzie wykonywane, przełącznika zadań, odpowiedzialnego za przełączanie pomiędzy uruchomionymi zadaniami, i dodatkowo: modułu zapewniającego synchronizację i komunikację pomiędzy zadaniami, modułu obsługi przerwań i zarządzania urządzeniami, modułu obsługi pamięci, zapewniającego przydział i ochronę pamięci, innych modułów zależnie od funkcji i przeznaczenia systemu. powłoka – specjalny program komunikujący użytkownika z systemem operacyjnym, system plików – sposób ustrukturyzowanego zapisu danych na nośniku.
Podział systemów operacyjnych Najszerszym, ale najbardziej podstawowym kryterium podziału systemów operacyjnych jest podział na: system operacyjny czasu rzeczywistego (RTOS) systemy operacyjne czasowo niedeterministyczne. Podział ten odnosi się do najbardziej podstawowej funkcjonalności systemu operacyjnego jakim jest planowanie i przydział czasu procesora poszczególnym zadaniom.
Ze względu na sposób realizacji przełączania zadań systemy operacyjne można podzielić na: systemy z wywłaszczaniem zadań systemy bez wywłaszczania.
Inny rodzaj podziału to podział na: otwarte systemy operacyjne wbudowane systemy operacyjne. Systemy otwarte można uruchomić na dowolnej maszynie wskazanego rodzaju np. PC i w określonym stopniu modyfikować. Systemy wbudowane jak sama nazwa wskazuje są zaszyte (wbudowane) wewnątrz urządzeń użytkowych, maszyn pojazdów itp. Aby uzyskać wysoką niezawodność pracy, minimalizuje się w takich przypadkach możliwość dokonywania zmian w konfiguracji systemu operacyjnego.
Pod względem środowiska użytego do implementacji systemu można wprowadzić podział na: programowe sprzętowe. Sprzętowe systemy operacyjne to: sprzętowo programowe rozwiązania integrowane z wybraną architekturą procesora. W takim przypadku sprzętowa część systemu przyśpiesza wybrany zakres czynności wykonywanych przez system (przykładowo przełączania zadań i zachowywanie ich kontekstu).
Można ustalić pewną relację pomiędzy wymienionymi kryteriami podziału. Zazwyczaj jako otwarte systemy operacyjne spotyka się systemy w pełni programowe, czasowo niedeterministyczne stosujące wywłaszczenie przy przełączaniu zadań. Wbudowane systemy operacyjne są najczęściej czasowo deterministyczne, zazwyczaj nie stosują wywłaszczenia zadań, bywa, że są realizowane również w sprzęcie.
Zasoby sprzętowe Zasoby sprzętowe zarządzane przez system operacyjny: procesor – przydział czasu procesora, pamięć alokacja przestrzeni adresowej dla procesów, transformacja adresów, urządzenia zewnętrzne udostępnianie i sterowanie urządzeniami pamięci masowej np. dysk twardy, alokacja przestrzeni dyskowej, udostępnianie i sterowanie drukarkami, skanerami, aparatami itp., informacja (system plików), organizacja i udostępnianie informacji, ochrona i autoryzacja dostępu do informacji.
Zarządzanie zasobami W przypadku środowiska wielozadaniowego, w którym wiele zadań wykonywanych jest w tym samym czasie, może dojść do interferencji procesów. Aby zapobiec temu niekorzystnemu zjawisku, organizuje się dostęp do sprzętu, plików, pamięci itp. poprzez ustanowienie zasobów systemowych. W takim przypadku zadania (procesy) użytkownika nie sięgają samodzielnie do sprzętu lub pliku, ale używają systemu operacyjnego jako strażnika zarządcy zasobów. Dzięki takiej organizacji dostępu do zasobów zadania „mają wrażenie”, że każde z nich pracuje na własnym komputerze. O realny porządek dostępu do rzeczywistego urządzenia, pamięci lub pliku dba system operacyjny.
Główne zadania systemu operacyjnego podczas zarządzania zasobami systemu komputerowego: tworzenie deskryptora zasobu, usuwanie deskryptora zasobu, realizacja żądania przydziału, zwolnienie i odzyskiwanie zasobu.
Zarządzanie zasobami systemu komputerowego:
przydział zasobów, synchronizacja dostępu do zasobów (zapobieganie interferencji), ochrona i autoryzacja dostępu do zasobów, odzyskiwanie zasobów, rozliczanie – gromadzenie danych o wykorzystaniu zasobów.