• Nie Znaleziono Wyników

2. Analiza wpływu bł˛edów na działanie systemu komputerowego

2.1. Model systemu komputerowego

2.1.2. Model oprogramowania

Oprogramowanie systemu komputerowego słu˙zy przetwarzaniu danych według okre´slonych przez twórców algorytmów. Jest ono zapisane w postaci zestawu instrukcji wykonywanych przez procesor – zbiór instrukcji nazywany jest równie˙z kodem programu. W celu realizacji swoich zada´n oprogramowanie wykorzystuje pami˛e´c. Mo˙zna wyró˙zni´c kilka typów pami˛eci ze wzgl˛edu na przechowywane dane: stos programowy, pami˛e´c statyczn ˛a, pami˛e´c tylko do odczytu oraz pami˛e´c alokowan ˛a.

Stos programowy słu˙zy jako pami˛e´c przechowuj ˛aca dane tymczasowe oblicze´n, gdy jest ich zbyt wiele, aby zostały zapisane w rejestrach procesora. Dodatkowo wykorzystywany jest on w programowaniu wysokopoziomowym, pozwalaj ˛ac na hierarchiczne wywołania procedur.

Pami˛e´c statyczna s ˛a to obszary pami˛eci stałego rozmiaru dost˛epne na ka˙zdym etapie oblicze´n pod tym samym adresem. W pami˛eci tego typu przechowywane s ˛a dane globalne – s ˛a to dane dost˛epne na ka˙zdym etapie wykonania programu.

Pami˛e´c tylko do odczytu zawiera niezmienne podczas oblicze´n dane. Mi˛edzy innymi jest to kod programu, zakodowane obrazy wy´swietlane u˙zytkownikowi na ekranie, czy stałe napisowe, b˛ed ˛ace szablonami komunikatów wypisywanych podczas interakcji z programem.

Pami˛e´c alokowana jest przydzielana w trakcie oblicze´n według potrzeb wykonywanego algorytmu. Charakteryzuje si˛e zmiennym rozmiarem oraz tym, ˙ze jest przyznawana przez mechanizmy alokacji pami˛eci systemu operacyjnego spo´sród dost˛epnej w danej chwili puli wolnej pami˛eci. Istnieje wiele algorytmów alokacji pami˛eci, które ró˙zni ˛a si˛e czasami alokacji oraz stopniem fragmentacji pami˛eci8. Opracowane s ˛a równie˙z zaawansowane techniki zarz ˛adzania pami˛eci ˛a, pozwalaj ˛ace na automatyczne zwalnianie niewykorzystywanej pami˛eci (garbage collection), jednak nie s ˛a one wykorzystywane w ka˙zdym rodzaju oprogramowania ze wzgl˛edu na niedeterministyczny charakter działania.

Dynamika alokacji oraz lokalno´s´c odwoła´n jest ´sci´sle zwi ˛azana z realizowanymi algorytmami oraz wykorzystywanymi strukturami danych. Przykładowo alokacja danych na potrzeby listowej struktury danych9 jest wykorzystana przy ka˙zdym dodawaniu nowego elementu, a tak˙ze przeszukiwanie kolejno w˛ezłów listy powoduje dost˛ep do wielu miejsc w pami˛eci (ka˙zdy

8 Fragmentacja powstaje w przypadku dzielenia przez algorytm alokacji pami˛eci na bloki o stałym rozmiarze.

Kiedy blok jest wykorzystywany na alokacj˛e pami˛eci o mniejszym rozmiarze, ni˙z rozmiar bloku – w ten sposób niewykorzystana cz˛e´s´c pami˛eci staje si˛e niedost˛epna.

9 Opis listowej struktury danych dla j˛ezyka C++: http://www.cplusplus.com/reference/list/list/

w˛ezeł jest alokowany osobno i miejsce jego poło˙zenia w pami˛eci jest zale˙zne od algorytmu alokacji). Natomiast zastosowanie wektorowej struktury danych10 pozwala na redukcj˛e liczby alokacji oraz przegl ˛ad kolejnych elementów struktury danych, charakteryzuje si˛e liniowym dost˛epem do kolejnych adresów pami˛eci (niemniej zysk ten obarczony jest wi˛eksz ˛a zło˙zono´sci ˛a obliczeniow ˛a przy usuwaniu elementów z wektora, w zwi ˛azku z konieczno´sci ˛a przeniesienia elementów znajduj ˛acych si˛e za usuwanym elementem w now ˛a lokalizacj˛e11).

Oprogramowanie systemu komputerowego mo˙zna podzieli´c na trzy rodzaje:

oprogramowanie wbudowane (firmware), system operacyjny oraz aplikacje u˙zytkownika.

Firmware jest oprogramowaniem dedykowanym dla poszczególnych urz ˛adze´n i jest wykonywany przez układy elektroniczne stanowi ˛ace integraln ˛a cz˛e´s´c tych urz ˛adze´n. Natomiast oprogramowanie systemu operacyjnego i aplikacji u˙zytkownika wykonywane jest przez procesor systemu komputerowego. Istniej ˛a tak˙ze metody pozwalaj ˛ace na wykonywanie specjalnie zaprojektowanych programów na procesorach specjalizowanych karty graficznej w celu osi ˛agni˛ecia wi˛ekszej wydajno´sci12, jednak oprogramowanie tego typu nie jest rozwa˙zane w niniejszej rozprawie. Poni˙zej przedstawiona jest charakterystyka wymienionych typów oprogramowania zawieraj ˛aca opis struktury, funkcji oraz wzajemnych interakcji pomi˛edzy modułami programowymi.

Oprogramowanie wbudowane

Oprogramowanie wbudowane w komputerach typu COTS wyst˛epuje w wielu urz ˛adzeniach – np. kartach graficznych, kontrolerach RAID, dyskach twardych, czy płytach głównych.

Oprogramowanie to charakteryzuje si˛e wysokim stopniem specjalizacji – jego głównym celem jest zapewnienie poprawnej pracy obsługiwanych urz ˛adze´n. Przykładowo zadaniem oprogramowania wbudowanego w dyski twarde jest realizacja strategii odczytu danych z wyprzedzeniem do pami˛eci podr˛ecznej oraz opó´znionego zapisu13.

Wspóln ˛a cech ˛a oprogramowania wbudowanego jest to, i˙z rzadko jest modyfikowane w produkcyjnym cyklu ˙zycia urz ˛adzenia. Je˙zeli aktualizacja jest konieczna, to operacja ta wymaga przeprowadzenia dedykowanej procedury dla ka˙zdego typu sprz˛etu.

Oprogramowanie wbudowane wykonywane jest niezale˙znie od głównego procesora systemu komputerowego przez układy elektroniczne poszczególnych urz ˛adze´n (np. dysku twardego, adaptera sieciowego). Komunikacja natomiast z zewn˛etrznymi układami odbywa si˛e

10 Opis wektorowej struktury danych dla j˛ezyka C++: http://www.cplusplus.com/reference/vector/vector/

11 Niemniej dzi˛eki lokalno´sci danych składowanych w wektorze czas usuni˛ecia losowo wybranego elementu z listy mo˙ze by´c mniejszy, ni˙z w przypadku listy:

http://www.baptiste-wicht.com/2012/12/cpp-benchmark-vector-list-deque/

12 Np. technologia CUDA umo˙zliwia wykonanie oprogramowania na procesorze GPU http://www.nvidia.com/object/cuda_home_new.html.

13 Funkcja ta polega na grupowaniu i zmianie kolejno´sci ˙z ˛ada´n zapisania danych na dysk w celu optymalizacji operacji wykonywanych przez głowic˛e dysku twardego.

przez układy sprz˛etowe np. magistrale lub bezpo´srednie przył ˛aczenie do przestrzeni adresowej procesora (Memory mapped I/O).

System operacyjny

System operacyjny jest oprogramowaniem po´srednicz ˛acym mi˛edzy zasobami sprz˛etowymi oraz oprogramowaniem u˙zytkownika – posiada pełen dost˛ep do zasobów sprz˛etowych i udost˛epnia je aplikacjom u˙zytkownika za po´srednictwem ujednoliconych interfejsów programistycznych (patrz [103]). Poni˙zej jako system operacyjny rozwa˙zane jest przede wszystkim j ˛adro systemu operacyjnego. Aplikacje narz˛edziowe dostarczane wraz z systemem operacyjnym nie ró˙zni ˛a si˛e sposobem komunikacji z j ˛adrem od pozostałych aplikacji u˙zytkownika.

System operacyjny wyposa˙zony jest w szereg mechanizmów tworz ˛acych ´srodowisko wykonania aplikacji u˙zytkownika. Podstawowym mechanizmem zaimplementowanym we współczesnych systemach operacyjnych jest mechanizm procesów. Proces jest to instancja wykonania programu wraz z przypisanymi do niej zasobami. System operacyjny odpowiedzialny jest za załadowanie kodu programu dla ka˙zdego procesu, a nast˛epnie przydziela zasoby takie jak czas procesora, pami˛e´c, dost˛ep do pami˛eci masowej lub innych urz ˛adze´n.

Procesy s ˛a zorganizowane w struktur˛e drzewiast ˛a, gdzie ka˙zdy proces jest rodzicem dla uruchomionych przez siebie procesów (dzieci), a korzeniem drzewa jest specjalny proces uruchamiany przez system operacyjny. W ramach procesu mo˙ze by´c uruchomionych wiele w ˛atków – podstawowa jednostka wykonywania, dysponuj ˛aca własnym zestawem rejestrów oraz stosem programowym współdziel ˛aca pami˛e´c z pozostałymi w ˛atkami w ramach procesu. Zastosowanie w ˛atków oraz procesów pozwala na przetwarzanie równoległe, co dzi˛eki zastosowaniu procesorów wielordzeniowych pozwala na równoczesne wykonanie kilku programów, zwi˛ekszaj ˛ac w ten sposób wydajno´s´c systemu.

Pozostałe usługi realizowane przez system operacyjny to: zarz ˛adzanie procesami (np. wstrzymywanie/wznawianie wykonania), przydział czasu procesora poszczególnym procesom, synchronizacja i komunikacja mi˛edzyprocesowa, mechanizm sygnałów, zarz ˛adzanie pami˛eci ˛a, obsługa urz ˛adze´n peryferyjnych, realizacja poł ˛acze´n sieciowych, obsługa systemu plików. Cało´s´c usług dostarczanych przez system operacyjny stanowi ´srodowisko wykonania dla aplikacji u˙zytkownika.

Aplikacje u˙zytkownika komunikuj ˛a si˛e z systemem operacyjnym za po´srednictwem wywoła´n systemowych. Procedura obsługi ˙z ˛ada´n aplikacji u˙zytkownika składa si˛e z nast˛epuj ˛acych kroków (kursyw ˛a zapisane s ˛a kroki wykonywane przez oprogramowanie systemu operacyjnego):

1. odło˙zenie na stos programowy parametrów wywołania systemowego, 2. wykonanie dedykowanej instrukcji przerwania programowego,

3. procesor przechodzi z trybu u˙zytkownika do trybu systemu operacyjnego, 4. odczytanie parametrów wywołania systemowego,

5. obsługa wywołania,

6. zast ˛apienie parametrów wywołania systemowego wynikiem wywołania, 7. powrót do trybu u˙zytkownika i wznowienie wykonania.

Oprócz wspomnianych przerwa´n wywoła´n systemowych system operacyjny obsługuje równie˙z przerwania sprz˛etowe oraz przerwania wywołane sytuacjami wyj ˛atkowymi.

Przerwania sprz˛etowe słu˙z ˛a do obsługi sygnałów pochodz ˛acych z urz ˛adze´n zewn˛etrznych lub magistrali danych – np. klawiatura systemowa, kontroler DMA14. Obsługa przerwania sprz˛etowego najcz˛e´sciej oznacza odebranie danych z urz ˛adzenia zewn˛etrznego i przekazanie ich do oczekuj ˛acego na nie procesu. Sytuacje wyj ˛atkowe zgłaszane s ˛a przez procesor w przypadku naruszenia zasad bezpiecze´nstwa lub wykonania nieprawidłowych operacji. Cz˛e´s´c sytuacji wyj ˛atkowych jest krytyczna i nie pozwala na dalsze wykonanie kodu – np. wyj ˛atek dzielenia przez zero lub próba zapisu do pami˛eci tylko do odczytu. Przykłady przerwa´n, które system operacyjny mo˙ze obsłu˙zy´c, to pułapka debug (słu˙zy do wstrzymania wykonania procesu i przekazania sterowania do oprogramowania debuggera w celach diagnostycznych), czy bł ˛ad stronicowania15 (ang. page fault). Przy zarz ˛adzaniu pami˛eci ˛a procesor współpracuje z układem MMU opisanym w 2.1.1. W przypadku udanej obsługi sytuacji wyj ˛atkowej wykonywanie kodu jest wznawiane od instrukcji, która wywołała przerwanie. Je˙zeli obsługa nie jest mo˙zliwa, system operacyjny awaryjnie ko´nczy działanie bł˛ednego programu. Gdy ´zródłem bł˛edu jest kod systemu operacyjnego implementowane s ˛a ró˙zne strategie działania: np. systemy operacyjne z rodziny Windows wy´swietlaj ˛a niebieski ekran z informacjami diagnostycznymi bł˛edu i wymagany jest restart systemu komputerowego, natomiast systemy z rodziny Linux wypisuj ˛a informacje diagnostyczne na wszystkich dost˛epnych konsolach i ko´ncz ˛a działanie w ˛atku, na rzecz którego wykonywany był kod zgłaszaj ˛acy ˙z ˛adanie – restart systemu nie jest wymagany, jednak system komputerowy mo˙ze działa´c niestabilnie lub nie odpowiada´c na ˙z ˛adania. Procedura obsługi sytuacji wyj ˛atkowej w systemie operacyjnym, w przypadku niepowodzenia przy jej obsłudze, zbiera mo˙zliwie najwi˛ecej danych o kontek´scie wyst ˛apienia wyj ˛atku i wypisuje je na ekran. Dane te mog ˛a zawiera´c m.in. typ zgłoszonego wyj ˛atku, zawarto´s´c rejestrów procesora, załadowane moduły systemu operacyjnego, dane procesu, czy stos wywoła´n funkcji (ang. stack-trace).

System operacyjny mo˙ze by´c rozszerzany o dodatkowe funkcje poprzez ładowane w trakcie działania systemu moduły. Moduły mog ˛a by´c wykorzystane do rozszerzenia zbioru wywoła´n systemowych, implementacji nowych mechanizmów w j ˛adrze systemu operacyjnego (np. nowego system plików), jednak najcz˛estszym wykorzystaniem jest dostarczenie dla systemu operacyjnego sterowników – s ˛a to specjalne programy stanowi ˛ace

14 Ang. Direct Memory Access

15 Jest to cz˛e´s´c mechanizmu pami˛eci wirtualnej, sygnalizuj ˛aca dost˛ep do pami˛eci wirtualnej niedost˛epnej w danej chwili w pami˛eci fizycznej, a obsługa polega na załadowaniu przez system ˙z ˛adanej strony pami˛eci z pliku wymiany.

ł ˛acznik mi˛edzy systemem operacyjnym, a konkretnym urz ˛adzeniem. Zadaniem sterowników jest implementacja okre´slonego interfejsu zdefiniowanego w systemie operacyjnym dla danego typu urz ˛adzenia, jednocze´snie oprogramowuj ˛ac specyficzny dla danego typu urz ˛adzenia protokół wymiany danych, który mo˙ze by´c ró˙zny dla urz ˛adze´n dostarczanych przez ró˙znych producentów.

Istnieje kilka koncepcji konstrukcji systemu operacyjnego. Podstawowe z nich to architektura j ˛adra monolitycznego oraz mikroj ˛adra. W ramach architektury monolitycznej sterowniki oraz wszystkie usługi s ˛a integraln ˛a cz˛e´sci ˛a j ˛adra systemu operacyjnego. W przypadku mikroj ˛adra kod wykonywany w przestrzeni j ˛adra systemu operacyjnego jest ograniczony do minimum – sterowniki oraz inne usługi implementowane s ˛a jako aplikacje wykonywane w przestrzeni u˙zytkownika, komunikuj ˛ace si˛e z j ˛adrem z u˙zyciem komunikatów.

Istotnym zagadnieniem s ˛a mechanizmy alokowania pami˛eci w systemach operacyjnych.

Istnieje wiele mechanizmów wyspecjalizowanych do obsługi ró˙znych ˙z ˛ada´n. Mo˙zna wyró˙zni´c dwa główne mechanizmy alokowania pami˛eci – alokowanie na potrzeby współpracy ze sprz˛etem oraz alokowanie na potrzeby oblicze´n.

Mechanizm alokacji pami˛eci do wykorzystania ze sprz˛etem musi spełnia´c nast˛epuj ˛ace wymagania:

1. szybko´s´c – w ˛atek wywołuj ˛acy alokacj˛e nie mo˙ze by´c u´spiony w oczekiwaniu na alokacj˛e, 2. przydzielona pami˛e´c musi by´c ci ˛agła w sensie adresów fizycznych.

Wymaganie 1. jest zwi ˛azane z konieczno´sci ˛a sprawnej obsługi urz ˛adze´n – alokacje cz˛esto s ˛a wywoływane w procedurach obsługi przerwa´n generowanych przez urz ˛adzenia w celu przygotowania pami˛eci na dane przychodz ˛ace od urz ˛adze´n. Powolna alokacja w tym scenariuszu mo˙ze spowodowa´c problemy wydajno´sciowe. Natomiast wymaganie 2. wynika z zastosowania techniki DMA16, która pozwala na przesyłanie danych bezpo´srednio z urz ˛adzenia (np. dysku twardego) do pami˛eci RAM – wykorzystanie pojedynczego, ci ˛agłego bloku pami˛eci fizycznej pozwala na unikni˛ecie wielokrotnego programowania kontrolera DMA.

Implementacje tego mechanizmu alokacji zazwyczaj narzucaj ˛a alokowanie bloków pami˛eci o stałym rozmiarze, co mo˙ze powodowa´c fragmentacj˛e pami˛eci.

Alokacja na potrzeby oblicze´n nie podlega takim restrykcjom jak alokacja pami˛eci dla sprz˛etu. Mo˙ze wykorzystywa´c wolniejsze algorytmy alokacji, które gwarantuj ˛a mniejsz ˛a fragmentacj˛e. Ten mechanizm alokacji stosowany jest do przydzielania pami˛eci np. dla kodu, stosu i danych procesów u˙zytkownika.

Oprócz wymienionych głównych mechanizmów alokacji istniej ˛a równie˙z inne specjalistyczne mechanizmy. Przykładowo s ˛a to mechanizmy zoptymalizowane pod

16 Ang. Direct Memory Access.

k ˛atem przechowywania danych tymczasowych (cache), czy pozwalaj ˛ace na wykorzystanie rozszerzonych przestrzeni adresowych17.

Aplikacje u˙zytkownika

Aplikacje u˙zytkownika s ˛a to procesy uruchomione w systemie operacyjnym. Realizuj ˛a one główne zadania powierzone systemom komputerowym: np. ´srodowisko stacji roboczej, serwer WWW, czy serwer baz danych. Aplikacje te wykorzystuj ˛a do swojego działania

´srodowisko stworzone przez system operacyjny: systemy plików, mechanizmy alokacji pami˛eci, komunikacj˛e mi˛edzyprocesow ˛a, interfejsy do urz ˛adze´n sieciowych, mechanizm bibliotek współdzielonych.

Systemy plików pozwalaj ˛a na zapis oraz odczyt plików na urz ˛adzeniach takich jak dyski twarde, czy pami˛eci flash. Dzi˛eki abstrakcji systemu operacyjnego aplikacja u˙zytkownika wykorzystuje jeden interfejs programistyczny niezale˙znie od typu urz ˛adzenia przechowuj ˛acego dane.

Mechanizm alokacji pami˛eci pozwala na wykorzystanie przez procesor dowolnej ilo´sci pami˛eci z przestrzeni adresowej w celu realizacji swoich zada´n. System operacyjny udost˛epnia pami˛e´c z wykorzystaniem mechanizmu pami˛eci wirtualnej, co pozwala na wykorzystanie przez procesy wi˛ekszej ilo´sci pami˛eci, ni˙z jest dost˛epna w systemie komputerowym.

Komunikacja mi˛edzyprocesowa pozwala na wymian˛e danych mi˛edzy procesami (potoki, wiadomo´sci, pami˛e´c współdzielona), synchronizacj˛e (semafor, mutex) oraz przesyłanie sygnałów. Dzi˛eki tym mechanizmom mo˙zliwe jest koordynowanie pracy wielu procesów.

Interfejsy sieciowe pozwalaj ˛a na oprogramowanie komunikacji z innymi systemami komputerowymi. Słu˙z ˛a zarówno do udost˛epniania usług jak i korzystania z usług innych systemów komputerowych.

Ze wzgl˛edu na du˙zy stopie´n skomplikowania oprogramowania opracowana została mo˙zliwo´s´c modularyzacji kodu w postaci bibliotek. Biblioteki mog ˛a by´c powi ˛azane z programem statycznie lub dynamicznie. Statyczne biblioteki s ˛a podczas kompilacji doł ˛aczane do kompilowanego programu u˙zytkownika. Natomiast biblioteki dynamiczne pozwalaj ˛a na ładowanie bibliotek w trakcie działania programu – podczas kompilacji wykorzystywana jest jedynie informacja o interfejsie programistycznym biblioteki, na podstawie której w kodzie skompilowanego programu tworzone s ˛a niezwi ˛azane symbole stanowi ˛ace punkty wywoła´n biblioteki. Ładowanie bibliotek w trakcie działania programu wymaga wsparcia ze strony systemu operacyjnego. W systemach operacyjnych z rodziny Unix biblioteki dynamiczne nazywane s ˛a dynamic shared object, natomiast w systemach z rodziny Windows dynamic-link library. Zadaniem systemu jest odnalezienie ˙z ˛adanej biblioteki i załadowanie

17 Rozszerzona przestrze´n adresowa umo˙zliwia wykorzystanie wi˛ecej ni˙z 4GB pami˛eci na architekturach wykorzystuj ˛acych 32-bitowe słowo adresowe. Implementacja firmy Microsoft polega na udost˛epnienia przesuwnego okna dost˛epu do pami˛eci. Szczegóły mo˙zna znale´z´c na stronie http://msdn.microsoft.com/en-us/library/windows/desktop/aa366527(v=vs.85).aspx

kodu wykonywalnego do przestrzeni adresowej procesów18 i powi ˛azanie symboli z kodem załadowanej biblioteki. Kod biblioteki jest współdzielony – tzn. ładowany jest tylko raz w jedno miejsce pami˛eci i udost˛epniany klienckim procesom z zastosowaniem pami˛eci wirtualnej. Ka˙zdy z procesów posiada natomiast swoj ˛a instancj˛e danych wykorzystywanych przez bibliotek˛e.

Aplikacje te mog ˛a realizowa´c ró˙zne zadania, jednak wszystkie korzystaj ˛a z systemu operacyjnego, jako jedynej drogi komunikacji z urz ˛adzeniami oraz mi˛edzy sob ˛a.