sysop2.doc

(1720 KB) Pobierz
1

CELE ISTNIENIA SYSTEMÓW OPERACYJNYCH

Zarys historii rozwoju systemów operacyjnych

Najwcześniejsze komputery (konstruowane w latach 40-tych i na początku 50-tych) nie miały żadnego stałego oprogramowania. Programy użytkowników były pisane w kodzie maszynowym i bezpośrednio (w postaci ciągu bitów) wprowadzane do pamięci operacyjnej komputera. Wyniki działania programów również były odczytywane bezpośrednio z pamięci. Takie programowanie „surowej maszyny” było bardzo niedogodne dla użytkowników.

Aby ułatwić używanie komputera, zaczęto do niego przyłączać dodatkowe urządzenia służące do przyspieszenia wprowadzania programów i danych do pamięci komputera oraz odczytywania wyników. Zostały one nazwane urządzeniami zewnętrznymi komputera (dawniej nazywano je też urządzeniami peryferyjnymi lub peryferałami (peripheral)).

Rodzaje najwcześniejszych urządzeń zewnętrznych:

1) urządzenie typu „dalekopis” (sterowana elektryczna maszyna do pisania) pełniące rolę konsoli operatorskiej, to jest służące do wprowadzania i odczytywania niewielkich porcji informacji w postaci znakowej;

2) czytniki nośników papierowych (taśmy i karty perforowane) umożliwiające dość szybkie wprowadzenie większych programów i danych przygotowanych na oddzielnych urządzeniach (perforatorach);

3) drukarki (wierszowe i głowicowe) umożliwiające dość szybki wydruk wyników.

Nieco później pojawiły się przewijaki taśm magnetycznych, umożliwiające wielokrotny zapis i odczyt większych ilości danych przeznaczonych do czasowego przechowania (na przykład pośrednich wyników obliczeń lub wyników kompilacji programów).

Programowanie obsługi przez komputer urządzeń zewnętrznych (czyli prawidłowego komunikowania się komputera z nimi) należało do najtrudniejszych i najbardziej skomplikowanych zadań programistycznych - i tak jest po dzień dzisiejszy.

W początkowym okresie komputery były bardzo drogimi urządzeniami. Czas ich pracy był wyceniany bardzo wysoko i w związku z tym zaczęły pojawiać się koncepcje mające na celu zaoszczędzenie czasu ich używania przez poszczególnych użytkowników.

Podstawowe koncepcje to:

1) zatrudnianie zawodowych operatorów, którzy szybko i bezbłędnie komunikowali się z komputerem za pośrednictwem konsoli;

2) przygotowywanie na oddzielnych urządzeniach większej liczby tekstów programów i zestawów danych dla nich i łączenie ich we wsady (batch), które umożliwiają natychmiastowe rozpoczęcie wykonywania następnego programu po zakończeniu poprzedniego (lub odrzuceniu go z powodu błędów);

3) uruchamianie na początku pracy komputera specjalnego programu przebywającego w jego pamięci przez cały czas i zawiadującego współpracą komputera z urządzeniami zewnętrznymi oraz kolejnością uruchamiania innych programów.

Trzecia z powyższych koncepcji doprowadziła do powstania systemów operacyjnych, których pierwotną postacią był tak zwany monitor rezydujący. Był to program przebywający przez cały czas w pamięci operacyjnej komputera i wprowadzający do pamięci i nadzorujący wykonywanie innych programów (przekazanie im sterowania i przejęcie go z powrotem po ich zakończeniu). O kolejności wprowadzania programów decydował operator podając odpowiednie polecenia z konsoli, mogło to być też zautomatyzowane poprzez użycie tak zwanych kart sterujących poprzedzających karty z zapisem treści programu.

Jedną z podstawowych funkcji operatora systemu komputerowego (poza fizyczną obsługą urządzeń wejścia/wyjścia - wkładaniem i wyjmowaniem nośników papierowych, zakładaniem i zdejmowaniem taśm magnetycznych) było zainicjowanie pracy komputera po włączeniu zasilania. Ponieważ komputery nie posiadały pierwotnie pamięci trwałych (ROM) umożliwiających automatyczny start, operator musiał ręcznie (przy użyciu kluczy) wprowadzić do pamięci kilka rozkazów maszynowych umożliwiających wczytanie z nośnika papierowego bardziej złożonego programu (odpowiednika dzisiejszego BIOS-u), który z kolei umożliwiał wczytanie systemu operacyjnego z taśmy magnetycznej.

Rozwój systemów operacyjnych miał na celu jak najefektywniejsze wykorzystanie możliwości sprzętu komputerowego i zawsze był nierozłącznie związany z rozwojem samego sprzętu. Ponieważ urządzenia zewnętrzne zawsze działają znacznie wolniej od samego komputera (jego procesora), dążono do jak największego uniezależnienia pracy procesora od czasu wprowadzania danych i wyprowadzania wyników. Uzyskiwano to poprzez:

1) odchodzenie od współpracy procesora bezpośrednio z urządzeniami operującymi na nośniku papierowym (są zdecydowanie najwolniejsze) poprzez przepisywanie danych i wyników na/z taśmy magnetyczne przy użyciu wyspecjalizowanych urządzeń lub mniejszych, pomocniczych komputerów (tak zwane przetwarzanie satelitarne);

2) buforowanie, czyli wydzielenie fragmentu pamięci operacyjnej do celów komunikacyjnych i umożliwienie urządzeniom zewnętrznym (po zainicjowaniu transmisji przez procesor) niezależny (autonomiczny) zapis/odczyt do/z tego fragmentu;

3) spooling, związany z zastępowaniem taśm magnetycznych dyskami magnetycznymi (szybszy dostęp do danych), będący w istocie buforowaniem na dysku większej ilości zarówno danych, jak i programów, i umożliwiający wykonywanie programów i wykorzystywanie zestawów danych w innej kolejności, niż były wczytane.

Wspólną ideą powyższych rozwiązań było dążenie do zrównoleglenia pracy procesora i urządzeń zewnętrznych poprzez zapewnienie im jak największej niezależności czasowej od siebie (czyli spowodowanie, aby mogły one pracować asynchronicznie). Oczywiście nawet przy pełnym zrównolegleniu nie można oczekiwać, że łączny czas pracy urządzeń zewnętrznych oraz pracy procesora będą sobie równe - zadania obliczeniowe wymagające istotnie większego nakładu czasu procesora nazywamy zadaniami zorientowanymi na przetwarzanie (typowe przykłady – duże obliczenia naukowe i inżynierskie), zaś wymagające głównie pracy urządzeń zewnętrznych -zadaniami zorientowanymi na operacje wejścia/wyjścia (typowy przykład – drukowanie rachunków).

Uwaga Istotną cechą architektury współczesnych komputerów jest wyposażenie prawie wszystkich urządzeń zewnętrznych (oraz komunikujących się z nimi układów elektronicznych wewnątrz komputera) w wyspecjalizowane mikroprocesory zawiadujące ich pracą i komunikacją. W tym sensie prawie każdy współczesny system komputerowy jest maszyną równoległą, w której jeden (lub więcej) procesorów ogólnego użytku oraz pewna liczba procesorów wyspecjalizowanych pracują w dużym stopniu współbieżnie.

Po utworzeniu ośrodków obliczeniowych i zatrudnieniu w nich wykwalifikowanego personelu (a tym samym uniemożliwieniu użytkownikom bezpośredniej styczności z komputerem) podstawowym problemem stał się długi łączny czas przetwarzania zadania z punktu widzenia pojedynczego użytkownika (zaniesienie danych i programu, odebranie następnego dnia wydruków komunikatów o błędach, dostarczenie skorygowanych danych...). Użytkownicy byli zmuszeni do bardzo dużej koncentracji przy przygotowywaniu tekstów programów i danych, jak również musieli przygotowywać dla operatorów komputerów szczegółowe instrukcje postępowania, uwzględniające wszystkie możliwe scenariusze rozwoju sytuacji w trakcie przetwarzania.

Pierwszym krokiem w kierunku rozwiązania problemu stało się wprowadzenie wielozadaniowości

(wieloprogramowości) systemów komputerowych. Systemy operacyjne zaczęto konstruować tak, aby mogły ładować do różnych fragmentów pamięci komputera wiele programów jednocześnie i wykonywać je kawałkami, przerzucając sterowanie od jednego programu do drugiego wtedy, kiedy wykonywany program musi na coś zaczekać (na przykład na transmisję większego bloku danych):

Wiązało się to z zaprojektowaniem systemu operacyjnego tak, aby skutecznie radził sobie z:

a) zarządzaniem przydziałem pamięci; b) planowaniem przydziału procesora programom. Wielozadaniowość zmniejszyła średni czas przetwarzania pojedynczego zadania, ale w dalszym ciągu nie umożliwiła użytkownikom bezpośredniej współpracy z komputerem. Rozwiązaniem okazało się dopiero:

1) rozwinięcie technologii monitorów ekranowych (oszczędność ogromnej ilości papieru);

2) konstrukcja systemów operacyjnych z podziałem czasu, czyli takich, w których wiele programów (należących do jednego lub wielu użytkowników) może być wykonywanych pozornie jednocześnie na zasadzie naprzemiennego przydzielania im bardzo krótkich odcinków czasu (tak zwanych kwantów czasu). W systemach z podziałem czasu wielu użytkowników może współpracować z jednym komputerem pozornie jednocześnie w trybie interakcyjnym (czyli w trybie wymiany komunikatów: polecenie użytkownika - odpowiedź systemu) korzystając z wielu podłączonych do komputera terminali składających się z monitora ekranowego i klawiatury (nieco później również myszy).

Konstrukcja dobrze działających systemów operacyjnych z podziałem czasu okazała się bardzo trudna. Tylko w najprostszych przypadkach można było stosować cykliczny przydział równych kwantów czasu wszystkim użytkownikom. Na ogół stosowany jest system priorytetów zadań i zmienna długość oraz kolejność przydzielanych odcinków czasu.

Współczesne rozwiązania i tendencje rozwojowe

1) Wielodostęp vs. komputery indywidualne

Ogromny rozwój technologii półprzewodnikowych i związany z nim gwałtowny spadek cen sprzętu komputerowego umożliwił pod koniec lat 70-tych produkcję małych komputerów dostępnych dla dużej liczby indywidualnych nabywców (personal computer). Początkowo były  one wyposażane w bardzo proste, jednozadaniowe systemy operacyjne umożliwiające gospodarowanie niewielkimi zasobami komputera. W następnych latach komputery osobiste zrobiły nieoczekiwanie dużą karierę, zaspokajając część zapotrzebowania na moc obliczeniową małych firm i prywatnych osób. Współczesne PC-ty mają moc obliczeniową i pojemność pamięci operacyjnej oraz zewnętrznej wielokrotnie przewyższającą zasoby większości dużych komputerów sprzed 20 lat. Przeciwieństwem komputerów osobistych są teraz naprawdę duże (wieloprocesorowe, o pojemności pamięci operacyjnej rzędu gigabajtów) komputery wielodostępne (mainframe). Oferują one swoim użytkownikom czasowy dostęp do zasobów znacznie większych, niż w PC.

2) Systemy skupione vs. systemy rozproszone

We współczesnych dużych komputerach coraz częściej instalowanych jest wiele procesorów, co umożliwia:

a) rzeczywiste (nie pozorne) wykonywanie zadań wielu użytkowników jednocześnie;

b) realizację rzeczywistej (nie pozornej) współbieżności procesów wspólnie pracujących nad zadaniem obliczeniowym jednego użytkownika. Systemy komputerowe wieloprocesorowe ogólnie dzielimy na:

a) systemy skupione (ściśle powiązane) - procesory mają wspólną pamięć operacyjną i zegar, odległości pomiędzy elementami są niewielkie (wspólna obudowa);

b) systemy rozproszone (luźno powiązane) - procesory mają odrębne pamięci operacyjne i są taktowane oddzielnymi zegarami (czyli pracują asynchronicznie), mogą być zarówno zbiorem oddzielnych płyt umieszczonych we wspólnej obudowie (cluster), jak i zbiorem oddzielnych komputerów połączonych kablami lub łączami telekomunikacyjnymi w sieć.

Konstrukcja zarówno systemów operacyjnych przeznaczonych dla wieloprocesorów, jak i rozproszonych systemów operacyjnych jest zadaniem bardzo trudnym i jest obecnie przedmiotem wielu prac naukowych.

Wskutek gwałtownego rozwoju technologii cyfrowych łącz telekomunikacyjnych w ostatnich latach, model sieciowy systemu komputerowego bardzo się rozpowszechnił i prawdopodobnie jego znaczenie będzie nadal rosło. Obecne komputery indywidualne często pełnią rolę terminali inteligentnych, czyli same przetwarzają takie zadania, które nie przekraczają ich możliwości, a w przypadku zapotrzebowania na większą moc obliczeniową lub pojemność pamięci komunikują się przez sieć lokalną lub Internet z dużymi komputerami, często zgrupowanymi w farmie serwerów. Terminale mogą komunikować się z serwerami w trybie tekstowym, ale coraz częściej komunikują się w trybie graficznym - są wtedy określane jako graficzne stacje robocze.

Zaletą systemów sieciowych jest zarówno lepsze wykorzystanie sprzętu, jak i informacji przechowywanych w pamięciach komputerów. Istotne są też aspekty niezawodnościowe i komunikacyjne.

Podział systemów operacyjnych ze względu na czas reakcji

Systemy operacyjne pracujące w trybie wsadowym (bardziej ogólnie: programy komputerowe, których czas reakcji na podanie danych może być dowolnie długi) nazywamy też systemami pracującymi off-line. Ich przeciwieństwem są systemy, których czas reakcji musi zmieścić się w z góry określonych granicach (zazwyczaj systemy interakcyjne) - nazywamy je pracującymi on-line. Szczególnym przypadkiem tych drugich są systemy, od których wymagana jest praktycznie natychmiastowa reakcja na dane (w każdym razie przed nadejściem następnych) - nazywamy je systemami czasu rzeczywistego (real-time). Typowymi przykładami systemów czasu rzeczywistego są systemy sterujące procesami technologicznymi w zakładach przemysłowych.

Podsumowanie

Głównymi celami tworzenia systemów operacyjnych są:

1) wygoda użytkowników komputerów;

2) efektywność wykorzystania sprzętu komputerowego;

3) niezawodność pracy systemów komputerowych.

1. SPRZĘTOWE MECHANIZMY OCHRONY PROCESÓW OBLICZENIOWYCH

Ogólny schemat logiczny komputera (pomijający organizację magistral, pamięć podręczną itd.)

W pamięci komputera może jednocześnie przebywać wiele programów (wśród nich system operacyjny) oraz danych dla nich.

Programem (wykonywalnym) nazywamy zapis ciągu rozkazów (instrukcji) przeznaczonych do wykonania przez procesor komputera.

Procesem (obliczeniowym) nazywamy „wykonywanie programu”, czyli ciąg stanów, jakie kolejno przyjmuje procesor (jego rejestry) oraz obszar danych programu w związku z wykonywaniem przez procesor tego programu (uwaga: kolejność wykonywanych instrukcji nie musi być taka sama, jak kolejność ich zapisu w programie).

Pierwotnie użytkownik komputera sprawował nad nim „nieograniczoną władzę” - miał dostęp do wszystkich instrukcji procesora, wszystkich lokat pamięci operacyjnej oraz wszystkich portów. Dawało mu to pełną swobodę poczynań, ale jednocześnie nieograniczone możliwości szkodzenia zarówno samemu sobie, jak i innym użytkownikom komputera.

Obecnie tak szerokie możliwości mają jedynie:

1) użytkownicy komputerów indywidualnych (którzy świadomie chcą z tych możliwości korzystać);

2) administratorzy wielodostępnych systemów komputerowych.

Zadaniem systemu operacyjnego jest chronienie sprzętu komputerowego oraz wykonywanych na nim

procesów obliczeniowych przed uszkodzeniem przez nieświadomych lub złośliwych użytkowników.

Jakiego rodzaju szkody może wyrządzać błędny program?

1) Niewłaściwa komunikacja z urządzeniem zewnętrznym może spowodować:

     a) utratę części bądź całości danych przekazywanych do / z urządzenia;

     b) trwałe uszkodzenie urządzenia lub jego przedwczesne zużycie.

2) Program użytkownika może się zapętlić i angażować procesor komputera aż do wyłączenia zasilania (restartu systemu).

3) Program użytkownika może wywołać rozkaz zatrzymania pracy procesora (zazwyczaj jest to rozkaz halt).

4) Program może błędnie zmodyfikować swój własny kod (zapis) lub zniszczyć swoje dane.

5) W przypadku pracy w systemie wielozadaniowym program może również zniszczyć programy i dane należące do innych użytkowników (zarówno w pamięci operacyjnej, jak i na nośnikach zewnętrznych). W szczególności może popsuć system operacyjny.

Nawet najlepiej zaprojektowane systemy operacyjne nie są w stanie zapobiegać takim zjawiskom, jeśli nie umożliwiają tego odpowiednie rozwiązania sprzętowe. Ogólnie, systemy operacyjne są projektowane pod kątem funkcjonowania na konkretnym sprzęcie, a dokładniej, na sprzęcie, od którego można oczekiwać pewnych konkretnych własności.

Jakie są minimalne wymogi wobec sprzętu komputerowego, aby można było zapewnić ochronę jemu oraz procesom obliczeniowym?

Musi być zapewniona możliwość ciągłego śledzenia pewnych aspektów wykonywania programów użytkowników oraz możliwość natychmiastowej interwencji w przypadku próby wykonania instrukcji potencjalnie szkodliwej.

Minimum sprzętowe niezbędne w każdym przypadku to posiadanie przez procesor bitu trybu pracy (co najmniej jednego). Tradycyjnie był to jeden bit, którego ustawienie na 1 oznaczało tryb użytkownika, zaś ustawienie na 0 - tryb monitora (nadzorcy systemu).

Instrukcje procesora, które są potencjalnie niebezpieczne (w sensie wyżej wymienionych zagrożeń) załadowane do rejestru rozkazów procesora będącego w trybie pracy użytkownika powodują:

1) przełączenie trybu pracy na tryb nadzorcy;

2) zarzucenie wykonywania programu użytkownika i przejście do wykonywania kodu systemu operacyjnego.

Aby stwierdzić, czy instrukcja pobrana do wykonania jest potencjalnie niebezpieczna, procesor musi przeanalizować: 1) co dana instrukcja ma wykonać; 2) na czym (na jakim miejscu w pamięci) ma być wykonana. Musi zatem sprawdzić zarówno część kodową instrukcji, jak i jej część adresową.

Instrukcje potencjalnie niebezpieczne ze względu na swoją część kodową (na przykład instrukcja zawieszenia lub zatrzymania procesora) nazywane są czasem uprzywilejowanymi...

Zgłoś jeśli naruszono regulamin