Podstawy systemów operacyjnych. Tom 1 - ebook
Podstawy systemów operacyjnych. Tom 1 - ebook
Podstawy systemów operacyjnych to dziesiąte, najnowsze wydanie najlepszego na świecie podręcznika o systemach operacyjnych, stosowanego powszechnie na uczelniach wyższych w Polsce. Opisano w nim rozwój systemów, budowę sprzętu, zarządzanie procesami i pamięcią. Omówiono podsystem wejścia-wyjścia, nowe technologie i rozwiązania programowe, związane z rozwojem urządzeń pamięci zewnętrznej oraz szyn łączących je z procesorem i pamięcią główną. Sporo miejsca poświęcono systemom rozproszonym i zagadnieniom dotyczącym ochrony i bezpieczeństwa informacji. Omówiono także przykładowe systemy operacyjne, w tym najnowszy Windows i Linux. Wielką zaletą książki jest przystępny język, czytelne rysunki i ćwiczenia do każdego rozdziału.
Podręcznik jest przeznaczony dla studentów informatyki na wszystkich uczelniach wyższych.
Książka została wydana w dwóch tomach, aby ułatwić Czytelnikom korzystanie z niej.
W Tomie I zostały omówione następujące zagadnienia:
• Czym są systemy operacyjne, co robią, jak są pomyślane i zbudowane
• Pojęcia procesu i współbieżności stanowiące sedno nowoczesnych systemów operacyjnych
• Metody synchronizacji procesów i postępowania z zakleszczeniami
• Zarządzanie pamięcią główną (operacyjną) podczas wykonywania procesu
• Wykorzystanie i działanie pamięci masowej oraz wejścia-wyjścia w nowoczesnym systemie komputerowym
• Działanie systemów plików w nowoczesnym systemie komputerowym
Kategoria: | Informatyka |
Zabezpieczenie: |
Watermark
|
ISBN: | 978-83-01-21402-9 |
Rozmiar pliku: | 20 MB |
FRAGMENT KSIĄŻKI
Systemy operacyjne są główną częścią każdego systemu komputerowego. Dlatego kurs systemów operacyjnych stanowi zasadniczą część wszelkiej edukacji informatycznej. Dziedzina ta podlega szybkim zmianom, ponieważ komputery są dziś wszechobecne niemal w każdym obszarze codziennego życia – od urządzeń wbudowanych w pojazdy aż po najbardziej wymyślne narzędzia planowania dla rządów i firm międzynarodowych. Podstawowe zasady pozostają mimo to dość przejrzyste i na nich skupiliśmy się w tej książce.
Napisaliśmy ją jako podręcznik do wstępnego wykładu z systemów operacyjnych dla studentów studiów licencjackich lub dla studentów pierwszego roku studiów magisterskich. Mamy nadzieję, że osoby podchodzące do tematu od strony praktycznej też uznają ją za przydatną. Zawiera ona klarowny opis _zasad_ leżących u podstaw systemów operacyjnych. Założyliśmy, że Czytelnik jest zaznajomiony z podstawowymi strukturami danych, budową komputerów oraz z językiem wysokiego poziomu, takim jak C lub Java. Zagadnienia dotyczące sprzętu potrzebne do zrozumienia systemów operacyjnych są przedstawione w rozdziale 1. W tym rozdziale zamieściliśmy również przegląd podstawowych struktur danych powszechnie występujących w większości systemów operacyjnych. Przykłady kodu wyraziliśmy najczęściej w języku C, sporo z nich przedstawiliśmy również w Javie, niemniej zrozumienie omawianych algorytmów nie wymaga od Czytelnika dogłębnej znajomości tych języków.
Podstawowe idee nakreśliliśmy w sposób intuicyjny. Ujęliśmy wyniki teoretyczne, jednak w większości z pominięciem formalnych dowodów. Noty bibliograficzne na końcu każdego rozdziału zawierają odsyłacze do artykułów naukowych, w których dane wyniki pojawiły się po raz pierwszy i zostały udowodnione, a także odniesienia do nowych materiałów przeznaczonych do dalszej lektury. W miejsce dowodów posłużyliśmy się rysunkami i przykładami mającymi sugerować, dlaczego powinniśmy oczekiwać, że dany wynik jest prawdziwy.
Uwzględnione w książce podstawowe koncepcje i algorytmy nawiązują często do rozwiązań przyjętych zarówno w systemach operacyjnych o otwartym kodzie, jak i w systemach komercyjnych. Naszym celem było przedstawienie ich w sposób ogólny, bez łączenia z jednym, konkretnym systemem operacyjnym. Podaliśmy jednak dużo przykładów odnoszących się do najpopularniejszych i najbardziej innowacyjnych systemów operacyjnych, w tym do systemów Linux, Microsoft Windows, Apple macOS (pierwotną nazwę OS X zmieniono w 2016 r., aby dopasować ją do schematu nazewniczego innych wyrobów firmy Apple) i Solaris. Zamieściliśmy również przykłady pochodzące z systemów Android oraz iOS – dwóch najpopularniejszych obecnie systemów operacyjnych dla urządzeń mobilnych.
Układ książki odzwierciedla nasze wieloletnie doświadczenia z nauczania systemów operacyjnych. Uwzględniliśmy również uwagi poczynione przez recenzentów podręcznika oraz wiele komentarzy i sugestii otrzymanych od Czytelników jego poprzednich wydań, a także od naszych byłych studentów. Niniejsze _dziesiąte_ wydanie spełnia również wymagania programu nauczania dziedziny systemów operacyjnych zawartego w _Computer Science Curricula 2013_ – najnowszym zbiorze zaleceń dotyczących programów nauczania informatyki na studiach dyplomowych, opublikowanym przez IEEE Computing Society oraz Association for Computing Machinery (ACM).
Co nowego w tym wydaniu
W dziesiątym wydaniu skoncentrowaliśmy się na przeglądach i usprawnieniach nakierowanych na obniżenie kosztów ponoszonych przez studentów, lepsze zaangażowanie studentów w proces nauczania i zwiększenie pomocy dla prowadzących zajęcia.
Według badań firmy Outsell, najbardziej wiarygodnej w badaniach rynku wydawniczego, rok 2015 stanowił punkt zwrotny w sposobie korzystania z podręczników – po raz pierwszy studiujący częściej wybierali do nauki materiały cyfrowe niż drukowane i od tej pory zainteresowanie formą cyfrową zwiększa się coraz szybciej.
Mimo że książka drukowana ma wciąż duże znaczenie dla wielu osób studiujących jako pomoc naukowa, w obecnym, dziesiątym wydaniu położyliśmy nacisk na postać przydatną do nauki w formie materiałów cyfrowych. W porównaniu z dziewiątym wydaniem amerykańskim istotnie zmniejszyliśmy wydatki studentów we wszystkich oferowanych postaciach podręcznika. Są to następujące jego formy:
• SAMODZIELNY PODRĘCZNIK W WERSJI ELEKTRONICZNEJ ZAWIERAJĄCY OBECNIE WIELE UDOSKONALEŃ. W formacie e-podręcznika dziesiątego wydania ćwiczenia wraz z rozwiązaniami umieszczono na końcach głównych części, dodano możliwość ukrywania lub ujawniania definicji najważniejszych terminów i zainstalowano sporo animowanych rysunków. Wersja ta zawiera również dodatkowe „Ćwiczenia praktyczne” do każdego rozdziału (wraz z rozwiązaniami), ćwiczenia specjalne, zadania i projekty programistyczne, punkty „Dalsze lektury”, kompletny słownik i cztery dodatki dotyczące dziedzictwa systemów operacyjnych.
• E-PODRĘCZNIK W PARZE ZE SKRÓCONĄ WERSJĄ DRUKOWANĄ. Za niewielką dopłatą e-podręcznik jest również dostępny wraz ze skróconą wersją papierową w postaci luźnych arkuszy, zawierającą główny tekst rozdziałów, następujące po nich „Ćwiczenia praktyczne” (z rozwiązaniami dostępnymi online) oraz punkty „Dalsze lektury”. Wykładowcy mogą również zamówić w tym pakiecie oprawione wersje towarzyszące, kontaktując się z przedstawicielem handlowym wydawcy.
Chociaż mocno zachęcamy wszystkich wykładowców i studentów do wykorzystania wszelkich zalet wynikających z ceny, zawartości i korzyści edukacyjnych elektronicznego wydania podręcznika, osoby prowadzące zajęcia mogą za pośrednictwem przedstawiciela handlowego wydawcy przygotować odpowiednie dla siebie wydanie drukowane na papierze.
W celu dokładniejszego zapoznania się z tymi możliwościami lub omówienia innych prosimy o skontaktowanie się z odpowiednim przedstawicielem wydawcy lub wizytę na stronie tego podręcznika w Sieci.
Materiał umieszczony w książce
Książka składa się z 21 rozdziałów i 4 dodatków. Wszystkie rozdziały i dodatki zawierają tekst podstawowy oraz następujące uzupełnienia:
• zbiór ćwiczeń praktycznych łącznie z rozwiązaniami,
• zbiór zwykłych ćwiczeń,
• zbiór zadań do zaprogramowania,
• zbiór projektów programistycznych,
• punkt z wyborem dalszych lektur,
• słownik ważnych terminów,
• animacje ilustrujące określone, istotne koncepcje.
Podręcznik w postaci oprawionej można kupić w księgarniach, a także online. Ta wersja zawiera te same rozdziały co wersja elektroniczna. Nie ma w niej jednak dodatków, zwykłych ćwiczeń, rozwiązań ćwiczeń praktycznych, zadań do zaprogramowania, projektów programistycznych i niektórych innych dodatków zawartych w książce publikowanej elektronicznie.
Zawartość książki
Książka jest podzielona na dziesięć głównych części:
• PRZEGLĄD. W rozdziałach 1 i 2 wyjaśniliśmy, czym są systemy operacyjne, co robią, jak są pomyślane i zbudowane. Omówiliśmy w nich typowe cechy systemu operacyjnego oraz to, co system operacyjny robi dla użytkownika. Podaliśmy opis zarówno tradycyjnych systemów operacyjnych komputerów osobistych (PC) i serwerów, jak i systemów operacyjnych urządzeń mobilnych. Z oczywistych względów przedstawiane wiadomości mają charakter motywacyjny i objaśniający. Unikaliśmy w tych rozdziałach omawiania jak co jest zbudowane od wewnątrz. Takie ujęcie jest przystępne dla indywidualnych Czytelników i dla słuchaczy niższych lat studiów, którzy chcą się dowiedzieć, czym jest system operacyjny bez wnikania w szczegóły wewnętrznych algorytmów.
• ZARZĄDZANIE PROCESAMI. W rozdziałach od 3 do 5 omówiliśmy pojęcia procesu i współbieżności stanowiące sedno nowoczesnych systemów operacyjnych. Proces jest jednostką (cząstką) pracy w systemie. Tak rozumiany system jest zbiorem procesów wykonywanych współbieżnie, z których część wykonuje rozkazy kodu samego systemu, a inne wykonują kod dostarczony przez użytkownika. W wymienionych rozdziałach przedstawiliśmy metody planowania procesów i komunikacji międzyprocesowej. Zamieściliśmy też szczegółowe omówienie wątków oraz przegląd zagadnień dotyczących systemów wieloprocesorowych i programowania równoległego.
• SYNCHRONIZACJA PROCESÓW. Rozdziały od 6 do 8 poświęciliśmy omówieniu metod synchronizacji procesów i postępowania z zakleszczeniami. Ponieważ zwiększyliśmy ilość materiału dotyczącego synchronizacji procesów, stary rozdział 5 („Synchronizacja procesów”) podzieliliśmy na dwa rozdziały: 6, zatytułowany „Narzędzia synchronizacji”, i 7, „Przykłady synchronizacji”.
• ZARZĄDZANIE PAMIĘCIĄ GŁÓWNĄ. W rozdziałach 9 i 10 zajęliśmy się zarządzaniem pamięcią główną (operacyjną) podczas wykonywania procesu. W celu polepszania stopnia wykorzystania procesora, a także szybkości, z jaką odpowiada on swoim użytkownikom, komputer musi przechowywać w pamięci wiele procesów. Istnieje znaczna liczba różnych schematów zarządzania pamięcią operacyjną odzwierciedlających rozmaite podejścia do zarządzania pamięcią, przy czym efektywność danego algorytmu zależy od konkretnej sytuacji.
• ZARZĄDZANIE PAMIĘCIĄ MASOWĄ. W rozdziałach 11 i 12 opisaliśmy wykorzystanie i działanie pamięci masowej oraz wejścia-wyjścia (we-wy) w nowoczesnym systemie komputerowym. Wskutek dużego zróżnicowania urządzeń wejścia-wyjścia podłączanych do komputera system operacyjny musi zapewniać aplikacjom szeroki wybór funkcji, aby umożliwiać im wszechstronne sterowanie urządzeniami. Dogłębnie omówiliśmy system wejścia-wyjścia, zwracając uwagę na jego konstrukcję, interfejsy oraz wewnętrzne struktury i funkcje. Z wielu powodów urządzenia we-wy są najwolniej działającymi ważnymi elementami komputera. Ponieważ są one wąskim gardłem wydajności, przeanalizowaliśmy też zagadnienia dotyczące optymalizacji ich działania.
• SYSTEMY PLIKÓW. W rozdziałach od 13 do 15 omówiliśmy działanie systemów plików w nowoczesnym systemie komputerowym. Systemy plików dostarczają mechanizmów bezpośredniego magazynowania i dostępu zarówno do danych, jak i do programów. Opisaliśmy klasyczne wewnętrzne algorytmy i struktury zarządzania pamięcią masową (magazynową) i utworzyliśmy mocne podstawy do praktycznego rozumienia stosowanych algorytmów, ich własności, zalet i wad.
• BEZPIECZEŃSTWO I OCHRONA. W rozdziałach 16 i 17 przedstawiliśmy mechanizmy niezbędne do zapewniania bezpieczeństwa i ochrony systemów komputerowych. Procesy w systemie operacyjnym należy chronić przed wzajemnym oddziaływaniem. Aby umożliwić taką ochronę, musimy zapewnić, że na plikach, pamięci, procesorze i innych zasobach systemowych będą mogły działać tylko te procesy, które uzyskały odpowiednie upoważnienie od systemu operacyjnego. Przez ochronę rozumie się mechanizm kontrolowania dostępu programów, procesów lub użytkowników do zasobów systemu komputerowego. Mechanizm ten musi dostarczać możliwości do określania wymaganej kontroli oraz środki jej egzekwowania. Bezpieczeństwo ma na celu ochronę nienaruszalności informacji przechowywanych w systemie (zarówno danych, jak i kodu) oraz zasobów fizycznych systemu przed nieupoważnionym dostępem, złośliwymi uszkodzeniami lub zmianami, a także przed przypadkowym wprowadzaniem niespójności.
• TEMATY ZAAWANSOWANE. W rozdziałach 18 i 19 omówiliśmy maszyny wirtualne oraz sieci i systemy rozproszone. W rozdziale 18 dokonaliśmy przeglądu maszyn wirtualnych i ich związków ze współczesnymi systemami operacyjnymi. Zamieściliśmy w nim ogólny opis technik sprzętowych i programowych umożliwiających wirtualizację. W rozdziale 19 natomiast zawarliśmy przegląd sieci komputerowych i systemów rozproszonych ze szczególnym uwzględnieniem Internetu i protokołów TCP/IP.
• PRZYKŁADY KONKRETNYCH SYSTEMÓW. W rozdziałach 20 i 21 szczegółowo omówiliśmy przykłady dwóch prawdziwych systemów operacyjnych: Linuxa i Windows 10.
• DODATKI. W dodatku A zaprezentowaliśmy kilka starych, już nieużywanych systemów operacyjnych, które wywarły duży wpływ na rozwój dziedziny. W dodatkach B, C i D zawarliśmy bardziej szczegółowe ujęcie trzech starszych systemów operacyjnych: Windows 7, BSD i Mach.
Środowiska programowania
W podręczniku zawarliśmy pewną liczbę przykładów programów napisanych w językach C i Java. Są one przeznaczone do pracy w następujących środowiskach programowania:
• POSIX. Zbiór standardów określany mianem POSIX (interfejs przenośnego systemu operacyjnego – _Portable Operating System Interface_) jest przeznaczony głównie dla uniksowych systemów operacyjnych. Chociaż systemy Windows mogą również wykonywać niektóre programy POSIX-owe, nasze ujęcie POSIX-a koncentruje się na systemach Linux i UNIX. Systemy zgodne ze standardem POSIX muszą implementować rdzenny standard POSIX-a (POSIX.1); przykładami systemów zgodnych z tym standardem są Linux i macOS. W ramach standardu POSIX zdefiniowano również kilka rozszerzeń, w tym rozszerzenia dotyczące czasu rzeczywistego (POSIX.1b) i rozszerzenie definiujące bibliotekę wątków (POSIX.1c, bardziej znane jako P-wątki – _Pthreads_). Podaliśmy kilka przykładów programowania napisanych w języku C, ilustrujących podstawowy interfejs API standardu POSIX oraz P-wątków i rozszerzeń dotyczących programowania czasu rzeczywistego. Przykładowe programy zostały przetestowane w systemach Linux 4.4 i macOS 10.11 z użyciem kompilatora gcc.
• JAVA. Java jest szeroko stosowanym językiem programowania wyposażonym w bogaty interfejs programowania aplikacji (API) i wbudowane zaplecze językowe programowania współbieżnego i równoległego. Programy w Javie działają w dowolnym systemie operacyjnym zaopatrzonym w maszynę wirtualną Javy (czyli JVM). Za pomocą programów w Javie przetestowanych z użyciem wersji 1.8 pakietu Java Development Kit (JDK) unaoczniliśmy różne koncepcje systemów operacyjnych i pracy sieciowej.
• SYSTEMY WINDOWS. Podstawowym środowiskiem programowania w systemach Windows jest Windows API zawierający wszechstronny zbiór funkcji do zarządzania procesami, wątkami, pamięcią i urządzeniami zewnętrznymi. Podaliśmy niewielką liczbę programów w C ilustrujących zastosowanie tego API. Programy zostały przetestowane pod kontrolą systemu Windows 10.
Wybraliśmy te trzy środowiska programowania, ponieważ uważamy, że najlepiej reprezentują one dwa najpopularniejsze modele systemów operacyjnych: Linux (lub UNIX) i Windows, oraz będące w powszechnym użyciu środowisko Java. Większość przykładów programowania napisano w języku C i spodziewamy się, że Czytelnicy czują się w nim dobrze. Czytelnikom zaznajomionym zarówno z językiem C, jak i z Javą zrozumienie większości programów w tej książce nie powinno sprawiać trudności.
W niektórych przypadkach – jak na przykład przy tworzeniu wątków – dane pojęcie objaśniliśmy, używając wszystkich trzech środowisk programowania, co umożliwi Czytelnikowi porównanie trzech różnych bibliotek w zastosowaniu do tego samego zadania. Kiedy indziej zdarzało nam się demonstrować koncepcje tylko w jednym z tych API. Na przykład pamięć dzieloną przedstawiliśmy, używając do tego tylko środowiska POSIX API. Programowanie gniazd w TCP/IP naświetliliśmy za pomocą API Javy.
Maszyna wirtualna Linuxa
Aby pomóc studentom w lepszym zrozumieniu systemu Linux, dostarczyliśmy wraz z tym podręcznikiem maszynę wirtualną Linuxa działającą w dystrybucji Ubuntu. Można ją pobrać ze strony podręcznika w Sieci (_http://www.os-book.com_), tam również znajdują się środowiska pracy, w tym kompilatory: gnu i Java. Większość zadań do zaprogramowania zawartych w książce można wykonać, używając tej maszyny wirtualnej z wyjątkiem zadań wymagających API Windows. Maszynę wirtualną można zainstalować i wykonywać w dowolnym goszczącym systemie operacyjnym, w którym można wykonywać oprogramowanie VirtualBox, a do takich zaliczają się obecnie systemy Windows 10, Linux i macOS.
Wydanie dziesiąte
Podczas pisania niniejszego, dziesiątego wydania _Podstaw systemów operacyjnych_ braliśmy pod uwagę utrzymujący się wzrost w czterech fundamentalnych obszarach wywierających wpływ na systemy operacyjne:
1. Mobilne systemy operacyjne.
2. Systemy wielordzeniowe.
3. Wirtualizacja.
4. Nieulotna pomocnicza pamięć masowa.
Aby uwypuklić te zagadnienia, włączyliśmy do tego nowego wydania niezbędny materiał. Na przykład znacznie więcej miejsca poświęciliśmy mobilnym systemom operacyjnym Android i iOS, a także naszemu ujęciu architektury ARMv8 dominującej w urządzeniach przenośnych. Zwiększyliśmy również ilość materiału dotyczącego systemów wielordzeniowych, w tym środowisk API umożliwiających współbieżność i równoległość. Urządzenia pamięci nieulotnej w rodzaju SSD-ków są obecnie potraktowane na równi z napędami dysków twardych w rozdziałach, w których omówiliśmy wejście-wyjście, pamięć masową i systemy plików.
Niektórzy z naszych Czytelników podkreślali konieczność zwiększenia udziału Javy, toteż zamieściliśmy w tym wydaniu dodatkowe przykłady w Javie.
Ponadto niemal każdy rozdział napisaliśmy na nowo, uaktualniając stary materiał i usuwając wiadomości, które przestały być interesujące lub straciły na znaczeniu. Zreorganizowaliśmy wiele rozdziałów, co zmusiło nas w niektórych przypadkach do przeniesienia porcji tekstu z jednego rozdziału do drugiego. W znacznym stopniu zrewidowaliśmy również szatę graficzną, tworząc sporo nowych rysunków oraz modyfikując istniejące.
Główne zmiany
Dziesiąte, uaktualnione wydanie obejmuje znacznie więcej materiału niż poprzednie uaktualnienia, zarówno pod względem treści, jak i jego nowego ujęcia. Poniżej podajemy w skrócie wykaz głównych zmian w każdym rozdziale:
• ROZDZIAŁ 1. WSTĘP zawiera uaktualnione ujęcie systemów wielordzeniowych, a także nowe podanie systemów NUMA i klastrów (gron) Hadoop. Zaktualizowaliśmy stary materiał i dodaliśmy nowe uzasadnienie studiowania systemów operacyjnych.
• ROZDZIAŁ 2. STRUKTURY SYSTEMÓW OPERACYJNYCH dostarcza istotnie zrewidowane omówienie projektowania i implementowania systemów operacyjnych. Uaktualniliśmy nasze podejście do Androida i iOS-a i zrewidowaliśmy potraktowanie procesu rozruchu systemu, skupiając się na GRUB-ie dla systemów Linux. Zamieściliśmy również nowe ujęcie podsystemu Windows w Linuxie. Dodaliśmy nowe podrozdziały o konsolidatorach („linkerach”) i ładowaczach, a także przedstawiliśmy, dlaczego aplikacje często zależą od konkretnego systemu operacyjnego. Na koniec dodaliśmy jeszcze omówienie uruchomieniowego zestawu narzędziowego BCC.
• ROZDZIAŁ 3. PROCESY. Uprościliśmy w nim rozważania dotyczące planowania, zawężając je do zagadnień planowania przydziału procesora. W obecnym ujęciu mieszczą się: wygląd pamięci w programie C, hierarchia procesów w Androidzie, przekazywanie komunikatów w Machu i androidowe zdalne wywołania procedur (RPC). Zastąpiliśmy również tradycyjne omówienie uniksowo-linuksowego procesu init przedstawieniem funkcji systemd.
• ROZDZIAŁ 4. WĄTKI I WSPÓŁBIEŻNOŚĆ (poprzedni tytuł: „Wątki”) zawiera więcej materiału dotyczącego zaplecza programowania współbieżnego i równoległego na poziomie API i bibliotek. Ponownie przejrzeliśmy podrozdział o wątkach Javy i obecnie zawiera on „futury” i uaktualnioną prezentację architektury Grand Central Dispatch z Apple, uwzględniającą także Swifta. W nowych podrozdziałach omówiliśmy równoległość z użyciem ramy _fork-join_ w Javie, a także intelowe bloki konstrukcyjne wątków.
• ROZDZIAŁ 5. PLANOWANIE PRZYDZIAŁU CPU (JEDNOSTKI CENTRALNEJ) (poprzednio rozdz. 6) zawiera zrewidowany materiał dotyczący kolejki wielopoziomowej i planowania przetwarzania wielordzeniowego. Zebraliśmy w jednym miejscu rozsiane wcześniej zagadnienia planowania z uwzględnieniem NUMA, dodając omówienie wpływu takiego rodzaju planowania na równoważenie obciążeń. Przedstawiliśmy również powiązane z tym modyfikacje linuksowego planisty CFS. Obecne ujęcie łączy prezentacje planowania rotacyjnego i priorytetowego, heterogenicznego wieloprzetwarzania i planowania w Windows 10.
• ROZDZIAŁ 6. NARZĘDZIA SYNCHRONIZACJI (poprzednio stanowił część rozdz. 5, „Synchronizowanie procesów”) dotyczy różnych narzędzi synchronizacji procesów. W zupełnie nowym ujęciu przedstawiliśmy zagadnienia architektoniczne, takie jak reorganizacja instrukcji i opóźniane zapisywanie buforów. Wprowadziliśmy również algorytmy bez blokad, używające instrukcji porównaj-i-zamień (_compare-and-swap_ – CAS). Nie przedstawiliśmy żadnego konkretnego API, zawarliśmy natomiast w rozdziale wprowadzenie do zagadnień szkodliwej rywalizacji i ogólnych narzędzi, których można używać do zapobiegania wyścigom danych. W szczególności po nowemu ujęliśmy modele pamięci, bariery pamięciowe i kwestie żywotności.
• ROZDZIAŁ 7. PRZYKŁADY SYNCHRONIZACJI (poprzednio stanowił część rozdz. 5, „Synchronizowanie procesów”) jest wprowadzeniem w klasyczne problemy synchronizacji; omówiliśmy w nim również konkretny interfejs API do projektowania efektywnych rozwiązań tych problemów. Rozdział zawiera nowe ujęcie nazwanych i beznazwowych semaforów oraz zmiennych warunkowych. Dodaliśmy także nowy podrozdział o synchronizacji w Javie.
• ROZDZIAŁ 8. ZAKLESZCZENIA (poprzednio rozdz. 7) uległ niewielkim uaktualnieniom. Dodaliśmy nowy podrozdział o szamotaninie (żywej blokadzie) i omówienie zakleszczeń jako przykładów żywotnych (trwałych) hazardów. Zawarliśmy w nim nowe ujęcie linuksowego narzędzia lockdep i deadlock_detector z BCC, a także przedstawienie wykrywania zakleszczenia w Javie z użyciem zrzutów pamięci wątków.
• ROZDZIAŁ 9. PAMIĘĆ GŁÓWNA (OPERACYJNA) (poprzednio rozdz. 8) zawiera kilka uaktualnień dotyczących zarządzania pamięcią w nowoczesnych systemach komputerowych. Dodaliśmy nowy opis 64-bitowej architektury ARMv8, uaktualniliśmy omówienie bibliotek konsolidowanych dynamicznie oraz inaczej potraktowaliśmy wymianę, skupiając się obecnie na wymianie stron, a nie procesów. Usunęliśmy także omówienie segmentacji.
• ROZDZIAŁ 10. PAMIĘĆ WIRTUALNA (poprzednio rozdz. 9). Zrewidowaliśmy go w kilku miejscach, dodając uaktualniony materiał o przydzielaniu pamięci w systemach NUMA i przydziale globalnym z użyciem listy wolnych ramek. Na nowo potraktowaliśmy pamięć skompresowaną, poważniejsze i mniej ważne braki stron oraz zarządzanie pamięcią w systemach Linux i Windows 10.
• ROZDZIAŁ 11. STRUKTURA PAMIĘCI MASOWEJ (poprzednio rozdz. 10). Uzupełniliśmy go o przedstawienie urządzeń pamięci nieulotnej, takich jak dyski _flash_ i dyski półprzewodnikowe. Uprościliśmy omówienie planowania dysków twardych, sprowadzając je do pokazania tylko tych algorytmów, które są obecnie używane. Dodaliśmy również nowy podrozdział o chmurowej pamięci masowej, uaktualniliśmy przedstawienie architektur RAID i zamieściliśmy nowe omówienie pamięci masowej obiektów.
• ROZDZIAŁ 12. SYSTEMY WEJŚCIA-WYJŚCIA (poprzednio rozdz. 13) zawiera uaktualnione ujęcie materiału dotyczącego technologii i parametrów wydajnościowych, rozszerzone potraktowanie wejścia-wyjścia synchronicznego i asynchronicznego oraz blokowanego i bez blokowania. Jest w nim również nowy podrozdział o wektorowym we-wy. Poszerzyliśmy w nim także zagadnienie zarządzania zasilaniem w mobilnych systemach operacyjnych.
• ROZDZIAŁ 13. INTERFEJS SYSTEMU PLIKÓW (poprzednio rozdz. 11) uaktualniliśmy o wiadomości związane z bieżącymi technologiami. W szczególności ulepszyliśmy omówienie struktur katalogowych i uaktualniliśmy kwestie ochrony. Poszerzyliśmy też podrozdział dotyczący plików odwzorowanych w pamięci, a do opisania pamięci dzielonej dodaliśmy przykład z interfejsu API Windows 10. Kolejność tematów w rozdziałach 13 i 14 została zreorganizowana.
• ROZDZIAŁ 14. IMPLEMENTACJA SYSTEMU PLIKÓW (poprzednio rozdz. 12). Również ten rozdział uaktualniliśmy, uwzględniając bieżące technologie. Obecnie zawiera on omówienie mechanizmu TRIM i systemu plików Apple. Dodaliśmy ponadto zagadnienia wydajności i poszerzyliśmy tematykę rejestrowania (prowadzenia dziennika – _journaling_).
• ROZDZIAŁ 15. WEWNĘTRZNA ORGANIZACJA SYSTEMU PLIKÓW. Jest to nowy rozdział zawierający uaktualnione wiadomości z poprzednich rozdziałów 11 i 12.
• ROZDZIAŁ 16. BEZPIECZEŃSTWO (poprzednio rozdz. 15) poprzedza teraz rozdział dotyczący ochrony. Zawarliśmy w nim zrewidowane i uaktualnione określenia współczesnych zagrożeń bezpieczeństwa i sposobów jego naruszania, w tym takich jak oprogramowanie wymuszające (zbójeckie) i środki zdalnego dostępu. Położyliśmy w nim nacisk na zasadę najmniejszych przywilejów. Przejrzeliśmy na nowo zagrożenia i ataki polegające na wstrzykiwaniu kodu, dodając przykłady kodu. Uaktualniliśmy omówienie technik szyfrowania, koncentrując się na obecnie używanych. Zaktualizowaliśmy i rozszerzyliśmy o przydatne zalecenia uwierzytelnianie (za pomocą haseł i innych metod). Wśród nowych treści znajduje się teraz omówienie randomizacji wyglądu przestrzeni adresowej i nowe podsumowanie sposobów obrony bezpieczeństwa. Przykład z systemu Windows 7 uaktualniliśmy do Windows 10.
• ROZDZIAŁ 17. OCHRONA (poprzednio rozdz. 14). Ten rozdział został istotnie zmieniony. Uaktualniliśmy omówienie pierścieni i warstw ochrony, które obecnie odnosi się do modelu Bell–LaPadula i zawiera przegląd modelu ARM stref zaufania i bezpiecznych wywołań monitora (_Trust-Zones and Secure Monitor Calls_). Poszerzyliśmy omówienie zasady wiedzy koniecznej i dodaliśmy wiadomości na temat obligatoryjnego kontrolowania dostępu. Zawarliśmy w nim też nowe punkty omawiające uprawnienia w Linuxie, system upoważnień Darwin, ochronę nienaruszalności bezpieczeństwa, filtrowanie wywołań systemowych, zastosowanie piaskownic i podpisywanie kodu. Dodaliśmy także omówienie egzekwowania zasad w fazie wykonania w Javie, w tym techniki inspekcji stosu.
• ROZDZIAŁ 18. MASZYNY WIRTUALNE (poprzednio rozdz. 16). Dodaliśmy w nim szczegóły dotyczące sprzętowych technologii wspierających. Rozszerzyliśmy również temat powstrzymywania ekspansji aplikacji ujmujący obecnie kontenery, strefy (zony) oraz systemy Docker i Kubernetes. W nowym podrozdziale przedstawiliśmy bieżące badania nad wirtualizacją, w tym unijądra, biblioteczne systemy operacyjne, hiperwizory partycjonowania (podziału na strefy dyskowe) i hiperwizory separacji.
• ROZDZIAŁ 19. SIECI I SYSTEMY ROZPROSZONE (poprzednio rozdz. 17) został istotnie uaktualniony i obecnie łączy tematykę sieci komputerowych i systemów rozproszonych. Ten materiał przejrzeliśmy pod kątem aktualności, z uwzględnieniem współczesnych sieci komputerowych i systemów rozproszonych. Jeszcze większy nacisk położyliśmy na model TCP/IP, dodaliśmy również omówienie chmurowej pamięci masowej. Usunęliśmy podrozdział o topologiach sieci. Poszerzyliśmy tematykę tłumaczenia nazw i dodaliśmy przykład z Javy. Na nowo przedstawiliśmy również rozproszone systemy plików, dołączając omówienie systemu MapReduce usytuowanego powyżej systemu plików Google’a, a także rozwiązania Hadoop, GPFS i Lustre.
• ROZDZIAŁ 20. SYSTEM LINUX (poprzednio rozdz. 17) został uaktualniony i zawiera teraz omówienie jądra Linux 4._i_.
• ROZDZIAŁ 21. WINDOWS 10 jest nowy, przedstawiliśmy w nim wewnętrzną organizację systemu Windows 10.
• DODATEK A. WPŁYWOWE SYSTEMY OPERACYJNE. Ten dodatek uaktualniliśmy, włączając do niego materiał z rozdziałów, które już nie występują w podręczniku.
Pomocnicza witryna
Odwiedzając witrynę _http://www.os-book.com_, można zaopatrzyć się w następujące materiały:
• maszynę wirtualną Linuxa,
• kod źródłowy w językach C i Java,
• kompletny zbiór rysunków i ilustracji,
• omówienia przykładowych systemów: FreeBSD, Mach i Windows 7,
• erratę,
• bibliografię.
Uwagi dla prowadzących zajęcia
W witrynie podręcznika zamieściliśmy kilka przykładów programów nauczania z propozycjami różnych sposobów jego wykorzystania, zarówno na kursach dla początkujących, jak i dla zaawansowanych. Ogólnie biorąc, zachęcamy wykładowców do przerabiania rozdziałów po kolei, gdyż ta strategia daje najstaranniejsze studium systemów operacyjnych. Niemniej, korzystając z przykładowych sylabusów, prowadzący zajęcia mogą wybrać inną kolejność omawiania rozdziałów (lub podrozdziałów).
W tym wydaniu dodaliśmy dużo na nowo sformułowanych ćwiczeń oraz zadań i projektów do zaprogramowania. Większość nowych zadań programistycznych dotyczy procesów, wątków, planowania procesów, synchronizacji procesów i zarządzania pamięcią. W niektórych trzeba dodawać moduły jądra do systemu Linux, co wymaga korzystania z towarzyszącej tej książce wirtualnej maszyny Linuxa lub stosowania innej, odpowiedniej dystrybucji Linuxa.
Dla osób prowadzących wykłady, które wybrały ten podręcznik do prowadzenia kursów z systemów operacyjnych, są dostępne rozwiązania ćwiczeń pisemnych i zadań programistycznych. Aby otrzymać te „reglamentowane” materiały, należy się skontaktować z lokalnym przedstawicielem handlowym wydawcy.
Uwagi dla studentów
Zachęcamy Was do korzystania z ćwiczeń praktycznych znajdujących się na końcu każdego rozdziału. Namawiamy również do czytania poradnika studiowania opracowanego przez jednego z naszych studentów. Poza tym studentom niezaznajomionym z systemami UNIX i Linux radzimy, aby sprowadzili sobie i zainstalowali maszynę wirtualną Linuxa. którą załączamy w witrynie pomocniczej. To nie tylko umożliwi Wam nowe doświadczenia informatyczne, lecz dzięki otwartemu charakterowi Linuxa pozwoli na łatwe penetrowanie wewnętrznych szczegółów tego popularnego systemu operacyjnego. Życzymy Wam wszelkiej pomyślności w studiowaniu systemów operacyjnych!
Piszcie do nas
Staraliśmy się wyeliminować z tekstu błędy typograficzne i inne. Jednak, podobnie jak w nowych wydaniach oprogramowania, jest niemal pewne, że zawsze znajdą się jakieś niedociągnięcia. Aktualna errata jest dostępna w witrynie książki. Bylibyśmy zobowiązani, gdybyście zechcieli zawiadamiać nas o wszelkich błędach lub pominięciach w książce, które nie są wyszczególnione na bieżącej liście poprawek.
Bylibyśmy radzi otrzymywać sugestie dotyczące ulepszenia tej książki. Z przyjemnością przyjmiemy też wszelki wkład w witrynę książki w Sieci, który mógłby się przydać przyszłym czytelnikom, taki jak zadania do zaprogramowania, sugestie projektów, pracownie i instruktaże online oraz wskazówki dydaktyczne. Pocztę należy kierować pod adresem [email protected]_.
Podziękowania
Wiele osób okazało nam pomoc w przygotowaniu tego dziesiątego wydania, jak również przy poprzednich dziewięciu wydaniach, z których ono się wywodzi.
Dziesiąte wydanie
• Rick Farrow służył swoim doświadczeniem i fachowymi radami jako redaktor techniczny.
• Jonathan Levin pomagał w ogarnięciu tematyki systemów mobilnych, ochrony i bezpieczeństwa.
• Alex Ionescu uaktualnił poprzedni rozdział o Windows 7, umożliwiając przygotowanie rozdziału 21: „Windows 10”.
• Sarah Diesburg dokonała przeglądu rozdziału 19: „Sieci i systemy rozproszone”.
• Brendan Gregg dostarczył przewodnik po zestawie narzędziowym BCC.
• Richard Stallman (RMS) pozostawał z nami w kontakcie w związku z opisem oprogramowania „wolnego” (bezpłatnego) i o otwartym kodzie.
• Robert Love naniósł uaktualnienia w rozdziale 20: „System Linux”.
• Michael Shapiro pomagał w opracowaniu szczegółów dotyczących pamięci masowej i wejścia-wyjścia.
• Richard West przeniknął obszary badań nad wirtualizacją.
• Clay Breshears pomógł w ujęciu zagadnień intelowych bloków konstrukcyjnych wątków.
• Gerry Howser kontaktował się z nami w kwestiach motywacji do studiowania systemów operacyjnych, a także wypróbowywał nowy materiał na swoich zajęciach.
• Judi Paige pomogła w opracowaniu rysunków i prezentacji slajdowych.
• Jay Gagne i Audra Rissmeyer przygotowali nową szatę graficzną tego wydania.
• Owen Galvin zapewnił opracowanie techniczne rozdziałów 11 i 12.
• Mark Wogahn dopilnował, aby oprogramowanie użyte do produkcji tej książki (LaTeX i kroje pisma, tzw. fonty) działało jak należy.
• Ranjan Kumar Meher przepisał na nowo część oprogramowania LaTeX-owego użytego do produkcji tego nowego tekstu.
Poprzednie wydania
• PIERWSZE TRZY WYDANIA. Ta książka wywodzi się z poprzednich wydań, współautorem trzech pierwszych z nich był James Peterson.
• OGÓLNE ZASŁUGI. W przygotowaniu poprzednich wydań pomagały nam również następujące osoby: Hamid Arabnia, Rida Bazzi, Randy Bentson, David Black, Joseph Boykin, Jeff Brumfield, Gael Buckley, Roy Campbell, P. C. Capon, John Carpenter, Gil Carrick, Thomas Casavant, Bart Childs, Ajoy Kumar Datta, Joe Deck, Sudarshan K. Dhall, Thomas Doeppner, Caleb Drake, M. Rasit Eskicioğlu, Hans Flack, Robert Fowler, G. Scott Graham, Richard Guy, Max Hailperin, Rebecca Hartman, Wayne Hathaway, Christopher Haynes, Don Heller, Bruce Hillyer, Mark Holliday, Dean Hougen, Michael Ahmed Kamel, Morty Kewstel, Richard Kieburtz, Carol Kroll, Morty Kwestel, Thomas Blanc, John Leggett, Jerrold Leichter, Ted Leung, Gary Lippman, Carolyn Miller, Michael Molloy, Euripides Montagne, Yoichi Muraoka, Jim M. Ng, Banu Özden, Ed Posnak, Boris Putanec, Charles Qualline, John Quarterman, Mike Reiter, Gustavo Rodriguez-Rivera, Carolyn J. C. Schauble, Thomas P. Skinner, Yannis Smaragdakis, Jesse St. Laurent, John Stankovic, Adam Stauffer, Steven Stepanek, John Sterling, Hal Stern, Louis Stevens, Pete Thomas, David Umbaugh, Steve Vinoski, Tommy Wagner, Larry L. Wear, John Werth, James M. Westall, J. S.Weston i Yang Xiang.
• SPECJALNE ZASŁUGI
– Robert Love uaktualnił zarówno rozdział 20, jak i tematykę Linuxa w obrębie całego tekstu, a także odpowiedział na wiele naszych pytań dotyczących Androida.
– Dodatek B został napisany przez Dave’a Proberta na podstawie rozdziału 22 z ósmego wydania _Operating System Concepts._
– Jonathan Katz przyczynił się do powstania rozdziału 16. Richard West dostarczył danych źródłowych do rozdziału 18. Salahuddin Khan uaktualnił podrozdział 16.7, umożliwiając nowe ujęcie zagadnień bezpieczeństwa w systemie Windows 7.
– Fragmenty rozdziału 19 pochodzą z artykułu Levy’ego i Silberschatza .
– Rozdział 20 powstał na podstawie nieopublikowanego artykułu Stephena Tweedie’ego.
– Cliff Martin pomógł w aktualizacji dodatku o UNIX-ie treściami dotyczącymi systemu FreeBSD.
– Niektóre ćwiczenia wraz z rozwiązaniami dostarczył Arvind Krishnamurthy.
– Andrew DeNicola przygotował studencki poradnik studiowania dostępny na naszej witrynie w Sieci. Część slajdów przygotowała Marilyn Turnamian.
– Mike Shapiro, Bryan Cantrill oraz Jim Mauro udzielili odpowiedzi na kilka pytań dotyczących systemu Solaris, a ponadto Bryan Cantrill z Sun Microsystems pomógł w ujęciu wiadomości o systemie plików ZFS. Josh Dees i Rob Reynolds mają swój wkład w opracowanie materiału o oprogramowaniu NET z Microsoftu.
– Owen Galvin pomógł w przygotowaniu do druku rozdziału 18.
Produkcja książki
Redaktorem naczelnym wydania był Don Fowley. Starszym redaktorem technicznym był Ken Santor. Obowiązki niezależnego redaktora prowadzącego pełnił Chris Nelson, a zastępował go Ryann Dannelly. Okładkę zaprojektował Tom Nery. Adjustację wykonała niezależnie Beverly Peavler. Niezależną korektorką była Katrina Avery. Sporządzenie skorowidza powierzono niezależnej firmie WordCo, Inc. Skład w LaTeX-u wykonał zespół z Aptara Inc., a konkretnie Neeraj Saxen i Lav Kush.
Noty osobiste
Avi chciałby podziękować Valerii za jej miłość, cierpliwość i pomoc podczas dokonywania przeglądu tej książki.
Peter pragnie wyrazić wdzięczność swojej żonie Carli i swoim dzieciom: Gwen, Owenowi i Maddie.
Greg za nieustanną pomoc wyraża podziękowania swojej rodzinie: żonie i synom – Thomasowi i Jayowi.
Abraham Silberschatz, New Haven, CT
Peter Baer Galvin, Boston, MA
Greg Gagne, Salt Lake City, UTCZĘŚĆ 1
PRZEGLĄD
System operacyjny działa jako pośrednik między użytkownikiem komputera a sprzętem komputerowym. Zadaniem systemu operacyjnego jest tworzenie środowiska, w którym użytkownik może wykonywać programy w wygodny i wydajny sposób.
System operacyjny jest oprogramowaniem, które zarządza sprzętem komputerowym. Sprzęt musi dostarczać odpowiednich mechanizmów zapewniających poprawne działanie systemu komputerowego i zapobiegających zaburzaniu przez programy właściwego działania systemu.
Wewnętrzna budowa systemów operacyjnych jest mocno zróżnicowana, ponieważ są one zorganizowane pod różnymi kątami. Zaprojektowanie nowego systemu operacyjnego jest poważnym przedsięwzięciem, toteż jest istotne, aby cele systemu były dobrze zdefiniowane przed rozpoczęciem projektu.
Ponieważ system operacyjny jest duży i skomplikowany, musi być tworzony fragmentami. Każdy z tych fragmentów powinien być dobrze wydzieloną porcją systemu ze starannie zdefiniowanymi danymi wejściowymi, danymi wyjściowymi i funkcjami.O AUTORACH
ABRAHAM SILBERSCHATZ
Od 2005 roku profesor informatyki na Uniwersytecie Yale. Przed dołączeniem do Yale był wiceprezesem Centrum Badań Informacji Naukowej w Bell Laboratories. Wcześniej przewodniczył profesurze na Wydziale Nauk Komputerowych Uniwersytetu Teksańskiego w Austin.
PETER BAER GALVIN
Principal Solutions Architect i GUI Product Manager w Starfish Storage i Chief Technologist w Cambridge Computer Services. Wcześniej m.in. CTO w firmie Corporate Technologies, Chief solutions architect w Pluribus Networks, DELL. Do 2012 roku był wykładowcą na Uniwersytecie w Bostonie, gdzie prowadził zajęcia z wprowadzenia do systemów operacyjnych.
GREG GAGNE
Kierownik Wydziału Informatyki w Westminster College w Salt Lake City, gdzie uczy od 1990 roku.PRZYPISY
Nie jest błędem nazywanie JVM również „maszyną wirtualną Java” – przyp. tłum.
Popularny i uniwersalny program rozruchowy i ładowacz systemów operacyjnych – przyp. tłum.
W oryginale _futures_, specjalny typ obiektów – przyp. tłum.
Taką nazwę (_swift_ – dosłownie – jerzyk) nosi w systemach operacyjnych m.in. pewien język programowania, o którym autorzy wspominają w rozdziale 4 – przyp. tłum.
Chodzi oczywiście o urządzenia przenośne, a nie ruchome. W przekładzie używamy przymiotnika „mobilny” tylko ze względu na powszechną manierę jego stosowania w podobnych kontekstach – przyp. tłum.
Inaczej: jednostek centralnych (_central processing units_, CPUs), co semantycznie nieco koliduje z decentralizacją współczesnych architektur sprzętowych – przyp. tłum.
Dalej będziemy używać krótszych określeń: MODUŁ STERUJĄCY lub MODUŁ OBSŁUGI_._ W obiegu jest również nazwa „sterownik” (a nawet „drajwer”); takie jej przypisanie koliduje z nazwą sterownik w znaczeniu sprzętowym (trzeba by go wówczas określać mianem „kontrolera”). Jeszcze inna spotykana nazwa to program sterujący urządzenia – przyp. tłum.
Nie usuwając oczywiście oryginalnego słowa z pamięci – przyp. tłum.
Jeżeli podejść do tego z drugiej strony, tzn. uzmysłowić sobie, że reprezentację wszystkich tych odrębności można stopniowo, hierarchicznie sprowadzić do ciągów bitów, zdumienie będzie mniejsze – przyp. tłum.
W związku z tą rozbieżnością interpretacji wielkości jednostek kilobajt, megabajt, gigabajt itd. istnieje propozycja obocznych nazw: kiBIbajt, miBIbajt, giBIbajt itd. dla zaznaczenia, że chodzi o potęgi liczby 1024 (czyli 2¹⁰), z pozostawieniem utartych nazw w znaczeniu potęg liczby 1000 – przyp. tłum.
Które należą również do klasy pamięci nieulotnych (w znaczeniu ang. _nonvolatile_) – przyp. tłum.
W angielskiej literaturze przedmiotu są używane terminy _storage_ i _memory_. Po polsku często oba te słowa są utożsamiane, choć _storage_ oznacza też magazyn. W przekładzie w razie potrzeby będziemy więc używać określenia pamięć magazynująca, choć najczęściej wystarczy termin PAMIĘĆ MASOWA.Termin „pamięć” pozostawiamy natomiast w znaczeniu pamięci operacyjnej, częściej obecnie nazywanej – w ślad za terminem angielskim – PAMIĘCIĄ GŁÓWNĄ (co również czynimy). Angielskie terminy _storage memory_ i _mass memory_ ukazują _de facto_ dwa aspekty pamięci jednej klasy – przyp. tłum.
Host (_host_ – gospodarz) oznacza tu komputer sieciowy goszczący jakiś proces, na przykład aplikację, i w tym znaczeniu będzie używane dalej to popularne zapożyczenie – przyp. tłum.
Według przyjętych w tym wydaniu rozróżnień (p. 1.3.2) procesor może zawierać więcej niż jedną CPU, jednak tam, gdzie to rozróżnienie nie jest istotne, zastępujemy czasem termin jednostka centralna (CPU) określeniem procesor, przyjmując, że chodzi o procesor z jedną CPU – przyp. tłum.
Dawniej nazywanego jeszcze trybem monitora (_monitor mode_) – przyp. tłum.
Być może należałoby tutaj używać nawet liczby mnogiej – zarządca maszyn wirtualnych. Oprogramowanie to jest również nazywane monitorem maszyny wirtualnej (_virtual machine monitor_) lub hipernadzorcą; będziemy go także nazywać hiperwizorem – przyp. tłum.
Ang. _system calls_; inne spotykane nazwy: odwołania do systemu, funkcje systemowe – przyp. tłum.
Przypominam, że terminy _pamięć główna_, _pamięć operacyjna_ i _pamięć_ wszędzie oznaczają to samo – przyp. tłum.
A różnych formatów (typów) plików są setki, por. _http://www.fileinfo.com_ – przyp. tłum.
Inni autorzy (np. Stallings) rozwijają skrót VMM jako _virtual machine monitor_ – monitor maszyny wirtualnej – przyp. tłum.
Choć ang. _host_ ma różne znaczenia zależnie od kontekstu (komputer sieciowy lub goszczący inny system), zważywszy na jego zwięzłość, będziemy dalej posługiwać się tym zapożyczeniem bez cudzysłowów – przyp. tłum.