System Operacyjny (SO) – Architektura i Komponenty





System operacyjny (SO) tworzy środowisko do pracy i uruchamiania aplikacji.


I. Wprowadzenie i Klasyfikacja Oprogramowania


Oprogramowanie dzieli się w zależności od celu, funkcji i interakcji z użytkownikiem na: użytkowe, systemowe i narzędziowe. Bez oprogramowania systemowego komputer jest jedynie zestawem elektronicznych komponentów. Oprogramowanie systemowe tworzy środowisko do uruchamiania innych programów. Na przykład sterowniki to oprogramowanie umożliwiające komunikację komputera m.in. z myszką, klawiaturą lub drukarką.


Oprogramowanie użytkowe (aplikacyjne) umożliwia użytkownikowi wykonywanie określonych zadań. Przykłady to przeglądarka internetowa, edytor tekstu, gry czy przeglądarki zdjęć. Oprogramowanie użytkowe można porównać do mebli i sprzętów w biurowcu, które sprawiają, że staje się on użyteczny.


Oprogramowanie narzędziowe (utility software) wspomaga analizę, optymalizację i konserwację systemu komputerowego. Jest skierowane do zaawansowanych użytkowników i administratorów, mając na celu utrzymanie i poprawę działania systemu operacyjnego, w tym konfigurację i zabezpieczenie komputera. Przykłady to oprogramowanie antywirusowe, firewall (zapora sieciowa), programy do tworzenia kopii zapasowych, narzędzia do zarządzania dyskami, kompresji plików i narzędzia diagnostyczne. Można je porównać do skrzynki z narzędziami dla właściciela budynku.


II. Podstawowe Funkcje Systemu Operacyjnego


System operacyjny administruje zasobami komputera, planując przydział czasu procesora, oraz kontrolując i przydzielając pamięć operacyjną, a także urządzenia zewnętrzne i wewnętrzne.


Dyski wewnętrzne nie wykorzystują protokołów sieciowych. Komunikują się z resztą komputera za pomocą wyspecjalizowanych magistral (szyn). Zadaniem systemu operacyjnego jest również ochrona danych i pamięci.


Istnieją systemy tekstowe (nieposiadające środowiska graficznego, np. DOS) oraz graficzne, w których komunikacja odbywa się za pomocą grafiki, tekstu i symboli.


III. Warstwy Systemu: Sprzęt, Firmware i Uruchamianie (Boot)


Maszyna fizyczna stanowi absolutną podstawę, w skład której wchodzą wszystkie komponenty komputera, takie jak mysz, klawiatura i pamięć RAM. Warstwą pośredniczącą między sprzętem a systemem operacyjnym jest firmware (np. BIOS/UEFI) oraz sterowniki. Każde urządzenie sprzętowe wymaga dedykowanego sterownika. W pierwszej kolejności BIOS testuje podzespoły w ramach tzw. procedury POST (Power-On Self-Test), która polega na sprawdzeniu podstawowych komponentów, takich jak procesor, karta graficzna i pamięć RAM. Jeśli testy zakończą się pomyślnie, system operacyjny jest ładowany za pomocą programu rozruchowego (bootloadera).


IV. Jądro Systemu Operacyjnego (Kernel)


Jądro systemu jest sercem i mózgiem całego systemu. Stanowi główny program zarządzający zasobami komputera. Decyduje o tym, który program i kiedy może użyć procesora, przydziela pamięć RAM oraz tworzy środowisko dla oprogramowania, udostępniając interfejsy API.


Aplikacje to wszystkie programy, z których użytkownik korzysta na co dzień lub które zostały zainstalowane. Działają one na systemie operacyjnym. Na szczycie hierarchii znajduje się użytkownik (osoba korzystająca z komputera), który komunikuje się z maszyną w celu osiągnięcia swoich celów.


Każda wyższa warstwa korzysta z usług warstwy niższej w celu realizacji celów użytkownika, jednocześnie ukrywając swoją złożoność. Przykładowo, gdy użytkownik klika "Zapisz" w aplikacji:

  1. Aplikacja wysyła polecenie zapisu do systemu operacyjnego.

  2. System operacyjny, za pośrednictwem jądra, używa sterownika sprzętowego dysku twardego, wysyłając do niego zrozumiałą informację.

  3. Sterownik dysku twardego przesyła do sprzętu (dysku) polecenie zapisania pliku w kodzie maszynowym.

V. Powłoka (Shell) i Mechanizm Wywołań Systemowych

Jądro wykonuje podstawowe zadania systemu operacyjnego. Powłoka (Shell) jest specjalnym programem służącym do komunikacji między użytkownikiem a systemem. System alokacji plików odpowiada za organizację i zapis danych na nośniku. Jądro systemu przydziela czas procesora, zarządza obszarami pamięci oraz ogólnie administruje zasobami komputera (wszystkimi komponentami sprzętowymi i programowymi), takimi jak procesor, pamięć operacyjna, pamięć masowa, urządzenia wejścia/wyjścia (I/O) i karta graficzna. Aplikacje rywalizują o te zasoby.


Jądro obsługuje urządzenia (np. drukarkę, wykorzystując dedykowany sterownik sprzętowy) oraz ich przerwania (interrupts). Przerwania to sygnały wysyłane przez sprzęt lub oprogramowanie do procesora, aby powiadomić go o zdarzeniu wymagającym natychmiastowej uwagi. Przykłady przerwań, które musi obsłużyć procesor, to naciśnięcie klawisza na klawiaturze, kliknięcie lub ruch myszką, odebranie danych przez kartę sieciową lub zakończenie odczytu pliku z dysku. Jądro systemu zajmuje się również obsługą sieci.


Powłoka to inaczej interpreter poleceń. Zgłasza gotowość systemu do pracy, wyświetlając znak zachęty (prompt), co oznacza, że jest gotowa na wykonanie kolejnego polecenia. Powłoka pośredniczy między jądrem a użytkownikiem: tłumaczy polecenia (analiza poleceń) na zadania dla systemu operacyjnego i prosi jądro o ich wykonanie.


Programy takie jak Bash czy PowerShell (powłoki) dzielą tekst poleceń na części (tokeny), używając separatora (np. spacji), gdzie pierwsze słowo zazwyczaj odpowiada za program, który ma zostać uruchomiony. Powłoka nie ma uprawnień do zarządzania zasobami komputera (ma je jądro systemu), dlatego zleca uruchomienie programu za pomocą wywołań systemowych. Proces uruchamiania polega na:

  1. Wysyłaniu żądania utworzenia nowego (początkowo pustego) procesu. Jest to realizowane przez funkcję fork(), która tworzy nowy proces potomny (kopię procesu macierzystego).

  2. Prośbie o wykonanie właściwego programu w nowym procesie potomnym za pomocą funkcji exec(). Funkcja exec() zastępuje obraz procesu potomnego nowym programem.

Funkcje fork() i exec() pochodzą ze standardowej biblioteki C/C++. Funkcja fork() służy do powielania procesów, co umożliwia systemowi zarządzanie wieloma zadaniami jednocześnie (wielozadaniowość). Powłoka ma również za zadanie wyświetlać odpowiedzi jądra, które wykonuje operacje i generuje odpowiedź lub błąd.


VI. Zarządzanie Zasobami, Wielozadaniowość i Przestrzenie Pamięci

Warto dodać, że dawniej, aby uruchomić kolejny program, często konieczne było zresetowanie komputera. Obecnie systemy operacyjne umożliwiają wielozadaniowość (multitasking), co pozwala na przełączanie się między programami i utrzymywanie wielu z nich w pamięci operacyjnej jednocześnie. Był to jeden z głównych powodów rozwoju współczesnych systemów operacyjnych.


System operacyjny jest nadzorcą koordynującym pracę innych programów. Zgodnie z zasadami współczesnej informatyki, jądro nadzoruje również pracę sprzętu. Jednym z jego zadań jest nadzorowanie oprogramowania, o którego szczegółach nic nie wie, a także ochrona oprogramowania przed ingerencją ze strony innych programów.


Oprogramowanie może działać w przestrzeni jądra (Kernel Space) lub w przestrzeni użytkownika (User Space). Oprogramowanie działające w przestrzeni jądra ma wyższe uprawnienia: może np. monitorować działanie oprogramowania w przestrzeni użytkownika, a także wpływać na działanie innych programów lub samego jądra.


Cechą jądra systemu operacyjnego jest możliwość zarządzania wieloma procesami, czyli wielozadaniowość (multitasking). Natomiast w ramach jednego procesu istnieje wielowątkowość (multithreading), co oznacza, że jeden program może działać jednocześnie na wielu wątkach. System operacyjny jest również skalowalny, co oznacza, że może się rozwijać, a także umożliwia miniaturyzację sprzętu, na którym działa.


W modelu kooperacyjnym to program decyduje o tym, kiedy przestaje używać procesora i oddaje go innym programom. Jeśli program nie przekaże tej "pałeczki", istnieje niebezpieczeństwo, że system operacyjny ulegnie zawieszeniu (zamrożeniu).


W modelu z wywłaszczeniem (preemptive multitasking) system operacyjny sprawuje ścisłą kontrolę nad działaniem programów i każdemu z nich przydziela określony czas na wykonanie zadania. Jeśli program się zawiesi, system operacyjny odbierze mu kontrolę. Takie systemy są responsywne i stabilne. Ten rodzaj sterowania czasem procesora jest stosowany we wszystkich nowoczesnych systemach operacyjnych.


VII. Rodzaje Architektury Jądra: Jądro Monolityczne

Jądro monolityczne (monolithic kernel) charakteryzuje się stabilnością, prostotą i łatwością komunikacji między różnymi modułami. Moduły jądra monolitycznego są dynamicznie dołączanymi fragmentami kodu, rozszerzającymi jego działanie bez konieczności restartu. Moduły te działają na tym samym poziomie uprawnień co jądro, mając bezpośredni dostęp do sprzętu i zasobów systemowych. Można to porównać do zamontowania turbosprężarki, która rozszerza możliwości silnika bez konieczności jego demontowania.


Wadą tego podejścia jest trudność w rozwijaniu i wykrywaniu błędów, co jest typowe dla jąder monolitycznych, takich jak w systemach Linux czy Unix (np. BSD). Wynika to z faktu, że sterowniki, systemy zarządzania siecią i systemy plików działają w jednej, wspólnej przestrzeni nazywanej przestrzenią jądra. Oznacza to, że nawet drobny błąd, np. w sterowniku rzadko używanej karty dźwiękowej, może nadpisać krytyczne dane w innej części jądra, prowadząc do awarii systemu. Jądro monolityczne jest często stosowane w systemach uniksowych.


Jądro systemu operacyjnego działa na najwyższym poziomie uprawnień (tryb jądra), mając nieograniczony dostęp do wszystkich komponentów sprzętowych. Program działający w tym trybie (w tym sterowniki, obsługa sieci i systemy plików) może wykonać każdą, nawet najbardziej niebezpieczną, instrukcję procesora, dlatego błąd w jednym elemencie (np. sterowniku karty graficznej) może spowodować awarię całego systemu. Jądro monolityczne jest pojedynczym, dużym programem wykonującym te funkcje. Zaletą jest tu stabilność, prostota i łatwość komunikacji wewnętrznej (ponieważ jest to jeden program). W systemach z małą liczbą procesorów (CPU) jądra monolityczne mogą działać szybciej niż mikrojądra, ponieważ komunikacja między komponentami (np. gdy system plików potrzebuje informacji od sterownika dysku) odbywa się za pomocą bezpośredniego wywołania funkcji (Function Call).


VIII. API, Abstrakcje i Biblioteki

Wskaźniki funkcji opisują prototypy funkcji, na które wskazują. Funkcja musi zwracać poprawny typ; zaniechanie tego wygeneruje przynajmniej ostrzeżenie kompilatora. Często funkcje implementujące API są jedynie opakowaniem (wrapperami) innych funkcji. Argumenty funkcji, stanowiące mniejsze części API, mogą służyć do gromadzenia lub sprawdzania danych. Powinny być one oddzielone od bardziej złożonej implementacji, co ułatwia wprowadzanie znaczących zmian w implementacji wewnętrznej, przy zachowaniu stałego interfejsu. W projektach linuksowych prefiksy w nazwach funkcji często oznaczają, że dana funkcja nie powinna być wywoływana spoza interfejsu API. Należy wypełnić wskaźniki funkcji (czyli nadać im adresy), natomiast sama nazwa funkcji jest już wskaźnikiem na jej adres, dlatego nie ma potrzeby jej dodatkowego wypełniania. Funkcje API są zazwyczaj wywoływane poprzez strukturę w funkcji main.


Struktury mogą opisywać na przykład wirtualne wejścia/wyjścia, odpowiadając za działanie sterowników. Sterowniki udostępniają szereg funkcji odpowiedzialnych za operacje na urządzeniu, takie jak sondowanie czy usuwanie. API dla takiego sterownika z pewnością zawiera szereg danych i inne struktury, które należy wypełnić osobno danymi. W kontekście API termin "interfejs" jest czasem używany w sensie abstrakcyjnym jako "deskryptor" — zestaw funkcji i kontraktu — co różni się od pojedynczej liczby, jaką jest deskryptor pliku.


Kolejnym zagadnieniem są biblioteki, które pełnią dwojaką rolę, ilustrując koncepcję abstrakcji. Implementują one funkcjonalności dla programów na zasadzie czarnej skrzynki oraz stanowią dostęp do powszechnego, napisanego już kodu, co eliminuje konieczność "wynajdowania koła na nowo". Biblioteki mogą mieć różnorodne zadania, np. umożliwiać dostęp do surowych danych przechowywanych w plikach obrazów lub dźwięku. Dzięki tej warstwie abstrakcji, programy graficzne lub dźwiękowe mogą odczytać zawartość pliku, aby użytkownik mógł widzieć obrazy na monitorze lub słyszeć dźwięki w głośnikach.


Standardowa biblioteka C na platformach UNIX jest ogólnie nazywana libc. Podstawowymi interfejsami są m.in. read(), write() i printf(). Całość API opisuje specyfikacja POSIX. Funkcje biblioteczne standardu POSIX stanowią rozszerzenie standardu ISO C i określają dodatkowe funkcje, w tym m.in. prymitywny interfejs systemu plików. Standard ten wspiera funkcje niższego poziomu niż typowe wsparcie dla języków programowania. Większość platform uniksowych jest zgodna z tym standardem, choć mogą istnieć niewielkie, ale istotne różnice. Aplikacja napisana z wykorzystaniem interfejsów specyficznych wyłącznie dla systemu Linux będzie prawdopodobnie nieprzenośna. Biblioteka jest fundamentalną abstrakcją.


IX. Strumienie Wejścia/Wyjścia (I/O) i Deskryptory Plików

Każdy uruchomiony program domyślnie startuje z trzema otwartymi strumieniami wejścia/wyjścia:

  • Standardowe wejście (stdin): Wejście z klawiatury. Numer deskryptora: 0.

  • Standardowe wyjście (stdout): Wyjście na konsolę. Numer deskryptora: 1.

  • Standardowe wyjście błędów (stderr): Wyjście dla błędów na konsolę. Numer deskryptora: 2.

Deskryptor pliku (file descriptor) to mała liczba całkowita zwracana przez system operacyjny po otwarciu pliku lub innego obiektu. W istocie jest to indeks w tablicy otwartych plików przechowywanych przez jądro, który identyfikuje kanał wejścia/wyjścia dla danego procesu. Deskryptor odpowiada za mechanizm dostępu do plików i strumieni. Deskryptor jest skojarzony z abstrakcją obiektu podobnego do pliku, którym może być rzeczywiste urządzenie sprzętowe, element systemu plików, a nawet gniazdo sieciowe. Operacje zapisu lub odczytu odnoszą się do tego deskryptora, a jądro kieruje je do właściwego miejsca w celu wykonania żądanej operacji. Deskryptor stanowi prosty interfejs, który ujednolica komunikację między programami użytkownika a specyficznymi dla sprzętu strukturami jądra.


X. Rola i Działanie Sterowników Urządzeń

Na niskim poziomie system operacyjny wymaga sterowników urządzeń, aby móc się skutecznie komunikować. Sterowniki są pisane zgodnie z interfejsem API dostarczonym przez jądro. Dzięki sterownikom system operacyjny wie, jak obsługiwać konkretne urządzenie i co należy zrobić (operacje sterownika są gotowymi instrukcjami wywoływanymi przez jądro w zależności od potrzeby). Przykładowo:

  • Sterownik klawiatury określa, jak odbierać konkretne klawisze.

  • Sterownik dysku SSD tłumaczy polecenia (np. zapisz plik) na operacje sprzętowe.

  • Sterownik karty sieciowej umożliwia odbieranie i wysyłanie danych w sieci.

Gdy jądro potrzebuje wykonać operację na sprzęcie, wywołuje odpowiednią funkcję sterownika. Przykładowa kolejność operacji:

  1. Program żąda odczytu pliku.

  2. Jądro interpretuje to jako "funkcję odczytu" w sterowniku dysku.

  3. Sterownik pobiera dane i przekazuje je dalej (z powrotem do jądra).

Sterownik urządzenia wie, jak przekonwertować ogólne żądania jądra na konkretne działania sprzętowe. To sterownik musi znać najniższy poziom szczegółów technicznych urządzenia (np. kod bit po bicie do wysyłania danych do drukarki). System operacyjny sam z siebie nie wie, jak obsłużyć nowe urządzenia; wymaga to pracy programisty (stworzenia sterownika). Sterownik nie działa samodzielnie, lecz reaguje na żądania jądra. Dzięki API sterowniki komunikują się w uporządkowany sposób, a samo API zapewnia warstwę abstrakcji nad sprzętem.Luźne Notatki dotyczące Linuksa


XI. Sieciowe Systemy Plików i Dystrybucje Linuxa

Luźne Notatki dotyczące Linuksa

Sieciowy system plików (Network File System) udostępnia przez sieć zasoby lokalnego systemu plików, który z kolei korzysta z urządzenia blokowego (urządzenia pamięci masowej). Sieciowe systemy plików są określane jako udziały lub mapowane napędy.


Serwer implementujący sieciowy system plików to serwer plików, często nazywany serwerem NAS (Network-Attached Storage). NAS to rozwiązanie umożliwiające wielu użytkownikom lub urządzeniom dostęp do plików. Urządzenie NAS do funkcjonowania wymaga procesora, pamięci i systemu operacyjnego. W przeciwieństwie do NAS, SAN (Storage Area Network) to sieć pamięci masowej, która prezentuje serwerom pamięć na poziomie bloków, a nie plików. Rozwiązania NAS są używane do udostępniania pamięci użytkownikowi końcowemu. Sieciowy system plików nie zastępuje dyskowego systemu plików istniejącego w pamięci masowej; dostarcza on interfejs plików, bazując jednocześnie na interfejsie plików lokalnych.


Otwarte i niemal uniwersalnym standardem sieciowych systemów plików jest NFS (Network File System). Uznawany za standard w Linuksie, jest starszy od tego systemu operacyjnego i dostępny także w systemach UNIX, macOS, a nawet Windows Server. NFS sprawdza się, gdy wymagane jest bezpośrednie współdzielenie plików między komputerami (np. do tworzenia kopii zapasowych). Protokół ten pozwala na zamontowanie konkretnego folderu na komputerze klienta, tak jakby był on dyskiem lokalnym.


Z kolei protokół SMB (Server Message Block), promowany przez Microsoft, jest protokołem jeszcze starszym niż NFS. Był on używany do mapowania (montowania) napędów między serwerami a stacjami roboczymi. W systemie Linux obsługę protokołu SMB zapewnia pakiet Samba (którego nazwa jest żartem opartym na literach SMB). W środowiskach, w których dominują systemy z rodziny Windows, do udostępniania plików zaleca się używanie protokołu SMB. Jeśli natomiast dominują systemy z rodziny UNIX, lepiej sprawdzi się protokół NFS.


Sam Linux (jądro) jest fundamentem i szkieletem domu, absolutnie niezbędnym do funkcjonowania systemu.

  • Dystrybucje takie jak Debian, Arch czy Fedora można porównać do stanu surowego zamkniętego domu. Wymagają one samodzielnego malowania ścian i kładzenia podłóg, co zapewnia pełną kontrolę nad systemem, lecz wymaga rzetelnej wiedzy i większego nakładu pracy.

  • Dystrybucje takie jak Ubuntu, Mint czy Manjaro to z kolei domy pod klucz, sprawiające, że Linux staje się o wiele przystępniejszy.

Podsumowując, system operacyjny, choć często niewidoczny dla przeciętnego użytkownika, jest niczym wszechobecny dyrygent. Od momentu uruchomienia komputera, poprzez zarządzanie każdą milisekundą czasu procesora, aż po ochronę i komunikację z najdrobniejszym urządzeniem, SO jest cichym, ale niezbędnym architektem cyfrowego świata, w którym pracujemy. Bez jego złożonej struktury, nasze nowoczesne urządzenia byłyby tylko martwą kupą krzemu i plastiku.


Komentarze

Popularne posty