Składnikami systemu operacyjnego są jądro systemu, powłoka systemu i programy użytkowe.
Jądro (ang. kernel) jest najważniejszą częścią SO, która działa zawsze. Jądro przyjmuje kierowane do niego zlecenia od programów użytkowych i użytkownika i wykonuje je przydzielając im zasoby komputera i urządzenia zewnętrzne. Jądro przydziela czas procesora poszczególnym programom, przydziela pamięć operacyjną i obsługuje pamięć masową.
Powłoka systemu (ang. shell) zwana też interpreterem, interpretuje polecenia przesyłane przez użytkownika do jądra systemu. Powłoki systemowe mogą być tekstowe (np. command.com w systemie DOS lub bash, sh csh w systemach linuksowych) lub graficzne (np. Eksplorator w Windows, GNOME i KDE w Linuksie).
Programami użytkowymi wchodzącymi w skład systemu są m. in. programy do obsługi plików, komunikacji w sieci, proste edytory tekstów, programy narzędziowe i diagnozujące prace urządzeń systemowych.
Wyróżniamy kilka podstawowych metod konstrukcji jąder:
Model funkcjonowania jądra monolitycznego.
1. jądro monolityczne - często stosowane w systemach typu Unix. Wszystkie zadania są wykonywane przez jądro, będące jednym, dużym programem działającym w trybie jądra. Przykładami takiego jądra mogą być: Linux, OpenBSD, FreeBSD, chociaż większość posiada umiejętność dołączania i odłączania modułów (najczęściej zawierających kod sterownika urządzenia lub obsługi potrzebnego w danej chwili systemu plików).
Zaletą tej techniki jest prostota, stabilność, łatwość komunikacji pomiędzy różnymi członami jądra (to przecież w tym wypadku jeden program!). Wadą jest, w późniejszym stadium rozwoju projektu, uciążliwość w rozwijaniu programu oraz w znajdywaniu błędów.
Model komunikacji mikrojądra z aplikacjami.
2. mikrojądro - w tej technice z monolitycznego jądra zostaje tylko jego podstawowa część, a części odpowiedzialne za bardziej wyrafinowane funkcje są wydzielone do funkcjonalnych bloków albo realizowane jako zwykłe procesy w trybie użytkownika.
3. jądro hybrydowe - kompromis między architekturą jądra monolitycznego i mikrojądra. W krytycznych usługach - np. stos sieci - usługi są na stałe wkompilowane w główny kod jądra, inne usługi pozostają oddzielone od głównego jądra i działają jako serwery (w przestrzeni jądra). Dzięki temu rozwiązaniu możliwe jest zachowanie wydajności jądra monolitycznego dla kluczowych usług. Klasyfikacja ta budzi kontrowersje niektórych programistów.