Systemy operacyjne: trzy proste elementy. Część 1: Wprowadzenie (tłumaczenie)

Wprowadzenie do systemów operacyjnych

Hej Habra! Chciałbym Państwu przedstawić cykl artykułów-tłumaczeń jednej, moim zdaniem, ciekawej literatury - OSTEP. W tym materiale dość szczegółowo omówiono pracę systemów operacyjnych typu uniksowego, a mianowicie pracę z procesami, różnymi programami planującymi, pamięcią i innymi podobnymi komponentami tworzącymi nowoczesny system operacyjny. Oryginał wszystkich materiałów można zobaczyć tutaj tutaj. Zaznaczam, że tłumaczenie zostało wykonane nieprofesjonalnie (dość swobodnie), ale mam nadzieję, że zachowałem ogólny sens.

Pracę laboratoryjną na ten temat można znaleźć tutaj:
- oryginalny: https://pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- oryginalny: https://github.com/remzi-arpacidusseau/ostep-code
- moja osobista adaptacja: https://github.com/bykvaadm/OS/tree/master/ostep

Możesz również sprawdzić mój kanał na telegram =)

Działanie programu

Co się dzieje, gdy program jest uruchomiony? Działający program robi jedną prostą rzecz - wykonuje instrukcje. W każdej sekundzie procesor pobiera z pamięci RAM miliony, a może nawet miliardy instrukcji, które kolejno dekoduje (na przykład rozpoznaje, do jakiego typu należą te instrukcje) i wykonuje. Może to być dodanie dwóch liczb, dostęp do pamięci, sprawdzenie warunku, przejście do funkcji i tak dalej. Po wykonaniu jednej instrukcji procesor przystępuje do wykonania kolejnej. I tak instrukcja po instrukcji, są wykonywane aż do zakończenia programu.
Ten przykład jest oczywiście uważany za uproszczony - w rzeczywistości, aby przyspieszyć procesor, nowoczesny sprzęt umożliwia wykonywanie instrukcji poza kolejnością, obliczanie możliwych wyników, jednoczesne wykonywanie instrukcji i podobne sztuczki.

Model obliczeniowy von Neumanna

Opisana przez nas uproszczona forma pracy jest podobna do modelu obliczeniowego von Neumanna. Von Neumann jest jednym z pionierów systemów komputerowych, jest także jednym z autorów teorii gier. Podczas działania programu ma miejsce wiele innych zdarzeń, działa wiele innych procesów i logika stron trzecich, których głównym celem jest uproszczenie uruchamiania, obsługi i konserwacji systemu.
Istnieje zestaw oprogramowania odpowiedzialny za ułatwianie uruchamiania programów (lub nawet umożliwianie jednoczesnego uruchamiania wielu programów), który umożliwia programom współdzielenie tej samej pamięci i komunikację z różnymi urządzeniami. Taki zespół oprogramowania (oprogramowanie) nazywany jest zasadniczo systemem operacyjnym i do jego zadań należy monitorowanie poprawności i wydajności działania systemu oraz zapewnianie łatwości zarządzania tym systemem.

System operacyjny

System operacyjny, w skrócie OS, to zestaw powiązanych ze sobą programów zaprojektowanych do zarządzania zasobami komputera i organizowania interakcji użytkownika z komputerem..
OS osiąga swoją skuteczność przede wszystkim poprzez najważniejszą technikę - technikę wirtualizacja. System operacyjny współdziała z zasobem fizycznym (procesorem, pamięcią, dyskiem itp.) i przekształca go w bardziej ogólną, wydajniejszą i łatwiejszą w użyciu formę samego siebie. Dlatego dla ogólnego zrozumienia można bardzo z grubsza porównać system operacyjny z maszyną wirtualną.
Aby umożliwić użytkownikom wydawanie poleceń systemowi operacyjnemu, a tym samym korzystanie z możliwości maszyny wirtualnej (takich jak uruchamianie programu, przydzielanie pamięci, uzyskiwanie dostępu do pliku itd.), system operacyjny udostępnia interfejs zwany API (interfejs programowania aplikacji) i do którego można dzwonić (połączenia). Typowy system operacyjny umożliwia wykonanie setek wywołań systemowych.
Wreszcie, ponieważ wirtualizacja umożliwia uruchamianie wielu programów (w ten sposób współdzielenie procesora) i równoczesny dostęp do ich instrukcji i danych (w ten sposób współdzielenie pamięci) oraz dostęp do dysków (w ten sposób współdzielenie urządzeń we/wy). ), system operacyjny jest również nazywany kierownik zasobów. Każdy procesor, dysk i pamięć jest zasobem systemu, a tym samym jedną z ról systemu operacyjnego staje się zadanie zarządzania tymi zasobami, robienia tego sprawnie, rzetelnie lub odwrotnie, w zależności od zadania, dla którego ten system operacyjny jest zaprojektowany.

Wirtualizacja procesora

Rozważ następujący program:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Systemy operacyjne: trzy proste elementy. Część 1: Wprowadzenie (tłumaczenie)

Nie wykonuje żadnych specjalnych akcji, w rzeczywistości jedyne, co robi, to wywołuje funkcję spin(), którego zadaniem jest cykliczne sprawdzanie czasu i powrót po upływie jednej sekundy. W ten sposób powtarza w nieskończoność ciąg, który użytkownik przekazał jako argument.
Uruchommy ten program i przekażmy mu znak „A” jako argument. Wynik nie jest szczególnie interesujący - system po prostu wykonuje program, który okresowo wyświetla znak „A”.
Teraz wypróbujmy tę opcję, gdy działa wiele instancji tego samego programu, ale wyświetla różne litery, aby było to bardziej przejrzyste. W takim przypadku wynik będzie nieco inny. Pomimo tego, że mamy jeden procesor, program jest wykonywany jednocześnie. Jak to się stało? Okazuje się jednak, że system operacyjny nie bez pomocy możliwości sprzętowych tworzy iluzję. Złudzenie, że system ma wiele procesorów wirtualnych, zamieniając pojedynczy procesor fizyczny w teoretycznie nieskończoną liczbę, a tym samym umożliwiając jednoczesne uruchamianie pozornie programów. Ta iluzja jest tzw Wirtualizacja procesora.
Ten obraz rodzi wiele pytań, na przykład, jeśli kilka programów chce działać w tym samym czasie, który z nich zostanie uruchomiony? Za to pytanie odpowiadają „polityki” systemu operacyjnego. Zasady są używane w wielu miejscach w systemie operacyjnym i odpowiadają na takie pytania, i są podstawowymi mechanizmami implementowanymi przez system operacyjny. Stąd rola systemu operacyjnego jako menedżera zasobów.

Wirtualizacja pamięci

Przyjrzyjmy się teraz pamięci. Fizyczny model pamięci we współczesnych systemach jest reprezentowany jako tablica bajtów.. Aby odczytać z pamięci, musisz określić adres komórkiaby uzyskać do niego dostęp. Aby zapisać lub zaktualizować dane, należy również określić dane oraz adres komórki, w której mają zostać zapisane.
Dostęp do pamięci występuje stale podczas trwania programu. Program przechowuje całą swoją strukturę danych w pamięci i uzyskuje do niej dostęp, wykonując różne instrukcje. W międzyczasie instrukcje są również przechowywane w pamięci, więc jest ona również dostępna dla każdego żądania następnej instrukcji.

wywołanie malloc().

Rozważmy następujący program, który przydziela region pamięci za pomocą wywołania malloc () (https://youtu.be/jnlKRnoT1m0):

Systemy operacyjne: trzy proste elementy. Część 1: Wprowadzenie (tłumaczenie)

Program robi kilka rzeczy. Najpierw przydziela trochę pamięci (linia 7), następnie wypisuje adres przydzielonej komórki (linia 9), zapisuje zero w pierwszym gnieździe przydzielonej pamięci. Następnie program wchodzi w pętlę, w której zwiększa wartość zapisaną w pamięci pod adresem w zmiennej „p”. Drukuje również swój identyfikator procesu. Identyfikator procesu jest unikalny dla każdego uruchomionego procesu. Po uruchomieniu kilku kopii natkniemy się na ciekawy wynik: w pierwszym przypadku, jeśli nic nie zrobisz i tylko uruchomisz kilka kopii, adresy będą inne. Ale to nie podlega naszej teorii! Poprawnie, ponieważ nowoczesne dystrybucje mają domyślnie włączoną losowość pamięci. Jeśli jest wyłączona, otrzymujemy oczekiwany rezultat - adresy pamięci dwóch jednocześnie uruchomionych programów będą się zgadzać.

Systemy operacyjne: trzy proste elementy. Część 1: Wprowadzenie (tłumaczenie)

W rezultacie okazuje się, że dwa niezależne programy działają z własnymi prywatnymi przestrzeniami adresowymi, które z kolei są odwzorowywane przez system operacyjny w pamięci fizycznej. Dlatego użycie adresów pamięci w jednym programie nie wpłynie w żaden sposób na inne, a każdemu programowi wydaje się, że ma swój własny kawałek pamięci fizycznej, całkowicie mu przydzielony. Rzeczywistość jest jednak taka, że ​​pamięć fizyczna jest zasobem współdzielonym zarządzanym przez system operacyjny.

Spójność

Innym ważnym tematem w systemach operacyjnych jest spójność. Termin ten jest używany, gdy mówimy o problemach w systemie, które mogą wystąpić podczas pracy z wieloma rzeczami w tym samym czasie w tym samym programie. Problemy ze spójnością pojawiają się nawet w samym systemie operacyjnym. W poprzednich przykładach wirtualizacji pamięci i procesorów zdaliśmy sobie sprawę, że system operacyjny zarządza wieloma rzeczami jednocześnie — uruchamia pierwszy proces, potem drugi i tak dalej. Jak się okazało, takie zachowanie może prowadzić do pewnych problemów. Na przykład nowoczesne programy wielowątkowe napotykają takie trudności.

Rozważ następujący program:

Systemy operacyjne: trzy proste elementy. Część 1: Wprowadzenie (tłumaczenie)

Program w funkcji main tworzy dwa wątki za pomocą wywołania pthread_create(). W tym przykładzie wątek można traktować jako funkcję działającą w tej samej przestrzeni pamięci wraz z innymi funkcjami, z wyraźnie więcej niż jedną funkcją działającą w tym samym czasie. W tym przykładzie każdy wątek uruchamia się i wykonuje funkcję worker() co z kolei po prostu zwiększa zmienną,.

Uruchommy ten program z argumentem 1000. Jak można się domyślić, wynikiem powinno być 2000, ponieważ każdy wątek zwiększał zmienną 1000 razy. Jednak wszystko nie jest takie proste. Spróbujmy uruchomić program z większą liczbą powtórzeń o rząd wielkości.

Systemy operacyjne: trzy proste elementy. Część 1: Wprowadzenie (tłumaczenie)

Wprowadzając liczbę, na przykład 100000, spodziewamy się, że na wyjściu pojawi się liczba 200000. Jeśli jednak uruchomimy liczbę 100000 kilka razy, nie tylko nie zobaczymy prawidłowej odpowiedzi, ale także otrzymamy różne nieprawidłowe odpowiedzi. Odpowiedź tkwi w tym, że aby zwiększyć liczbę, potrzebne są trzy operacje - wydobycie liczby z pamięci, zwiększenie, a następnie ponowne zapisanie liczby. Ponieważ wszystkie te instrukcje nie są wykonywane atomowo (wszystkie w tym samym czasie), takie dziwne rzeczy mogą się zdarzyć. Ten problem nazywa się w programowaniu warunki wyścigu. Kiedy nieznane siły w nieznanym momencie mogą wpłynąć na wydajność którejkolwiek z twoich operacji.

Źródło: www.habr.com

Dodaj komentarz