Pytania przykładowe z "Architektury systemów komputerowych"
Część II (czerwiec 2004)
:: Wszytkie pytania jakie mi wpadły w ręce
:: NIEPEWNE
- A - [9-nie wiem czy to] [15-mało] [17-mało]
- B - [2-nie wiem czy to]
- C - [2-pusto]
- D - [2-troche nie na temat]
A. Wprowadzenie do systemów operacyjnych i systemów dedykowanych
Jakie czynniki ekonomiczne kształtowały rozwój wczesnych systemów operacyjnych
pierwsze programy były całkowicie samodzielne, w trakcie realizacji nie korzystały z pomocy innych programów.
wszystkie programy realizowały podobne lub identyczne czynności w zakresie obsługi urządzeń wejścia-wyjścia. Urządzenia te wymagały starannego oprogramowania, co wymagało znajomości wielu szczegółów technicznych; często realizacja prostej czynności przez urządzenie wymagała wykonania złożonego ciągu operacji;
zaczęto tworzyć odrębne podprogramy obsługi dla każdego urządzenia, udostępniane innym programom — podprogramy te wykonywały proste zlecenia otrzymywane od zwykłych programów;
bardzo wysokie koszty instalacji i eksploatacji systemów komputerowych spowodowały konieczność wprowadzenia oprogramowania nadzorującego i koordynującego pracę całego systemu w celu uzyskania jego maksymalnej wydajności — oprogramowanie to przyjęto nazywać systemem operacyjnym;
w różnych systemach komputerowych zdefiniowano szereg usług, które mogły być zlecane przez zwykłe programy do podprogramów systemowych;
w ten sposób ukształtował się pewien interfejs obejmujący zasady korzystania z usług systemu operacyjnego przez programy, znany jako interfejs programowania aplikacji (ang. API )
systemy operacyjne i architektura komputerów wywarły na siebie wzajemnie znaczny wpływ — aby ułatwić posługiwanie się sprzętem, zaczęto rozwijać systemy operacyjne; zauważono, że wprowadzenie zmian w sprzęcie pozwala na uproszczenie systemów operacyjnych.
Omówić podstawowe problemy związane z pracą systemów wielozadaniowych
Naturalne przestoje podczas których procesor był bezczynny wymusiły powstanie systemów wielozadaniowych, wieloprocesowym; ale i tak powstały problemy:
konflikty w zakresie dostępu do urządzeń spowodowane komunikacją procesów z urządzeniami zewnętrznymi. Wprowadzono pośrednictwo podprogramów systemowych w operacjach wejścia-wyjścia; system operacyjny przyjmował zlecenia i wykonywał je niezwłocznie jeśli urządzenie było wolne; jeśli jednak było zajęte, to zlecenie było rejestrowane i realizowane do zakończeniu poprzedniej operacji drukowania;
problem sprawnego wykonywania wielu programów, tak by łączny czas oczekiwania był minimalny; (szeregowanie zadań);
problem związany z koniecznością wzajemnej izolacji procesów; czasem proces próbował odczytać lub zmienić dane należące do innego procesu lub systemu operacyjnego; wprowadzono sprzętowe mechanizmy ochrony zadań i systemu operacyjnego;
w miarę rozwoju konstrukcji mikroprocesorów rozwiązania stosowane w systemach operacyjnych dla dużych komputerów okazały się odpowiednie dla komputerów osobistych — koncepcje zastosowane w wielkich systemach komputerowych przeniknęły do komputerów PC;
Jakie zadania spełnia system operacyjny?
1. zarządzanie procesami (własnymi i użytkowników)
- tworzenie i usuwanie procesów
- wstrzymywanie i wznawianie procesów
- dostarczanie mechanizmów synchronizacji i komunikacji procesów
- dostarczanie mechanizmów obsługi blokad
2. zarządzanie pamięcią operacyjną
- zarządzanie pamięcią wirtualną
- utrzymywanie ewidencji zajętych aktualnie bloków PAO wraz z informacją przypisania ich do procesów
- podejmowanie decyzji o przydzielenie wolnych blokóe PAO
- dynamiczne przydzielenie i zwalnianie obszarów PAO w zależności od potrzeb
3. zarządzanie pamięcią pomocniczą (dyskową)
- zarządzanie wolnymi obszarami
- przydzielanie pomięci
- planowanie przydziałów obszarów (porcji) pamięci dyskowej
4. zarządzanie systemem wejścia - wyjścia, składającym się z :
- pamięci natatnikowej i systemu buforów
- interfejsu do programów obsługi urządzeń we/wy
programów obsługi urządzeń poszczególnych urządzeń
5. zarządzanie plikami
- tworzenie i usuwanie plików i katalogów
- dostarczanie podstawowych operacji do manipulowania plikami i katalogami
- odwzorowywanie plików na obszary pamięci pomocniczej
- składowanie plików w archiwach
6. zarządzanie systemem ochrnoy - autoryzacja dostępu
7. obsługa komunikacji sieciowej
8. system interpretacji poleceń (shell - powłoka)
Jakie funkcje udostępnia system operacyjny?
- wykonanie programu uzytkowanika
- operacje we/wy
- operacje na plikacj i systemach plików
- komunikacja sieciowa i miedzyprocesowa
- wykrywanie błędów - diagnostyka systemowa
- przydział zasobów
- rozliczanie
- ochrona i kontrola dostępu
- wiarygodna komunikacja
- tworzenie procesów i zarządzać nimi;
- administracja pamięcią pomocniczą i operacyjną;
Co to jest jądro systemu operacyjnego i jakie spełnia zadania?
Jądro systemu (ang. kernel), składa się ze zbioru funkcji i tablic systemowych;
Głównym zadaniem jądra jest dostarczenie narzędzi do zarządzania procesami, zarządzania pamięcią i zarządzania systemem plików takie jak:
- tworzenie/usunięcie procesu - wpisanie/usunięcie na listę aktywnych
- czekanie na podniesienie semaforu
- generacja przerwania logicznego
- wynajęcie/zwolnienie urządzenie logicznego
- proces tła
- reset systemu
Jądro systemu operacyjnego zwalnia wszystkie zasoby używane przez proces-duch (Proces-duch jest procesem zakończonym, ale na jego zakończenie nie czekał proces macierzysty;)
(np. obszar pamięci), ale pozostawia rekord zawierający kod wyjścia i pewne statystyki; kod wyjścia zostanie udostępniony procesowi macierzystemu, gdy ten wywoła funkcję wait.
Jakie znasz sposoby planowania zadań w systemie operacyjnym?
- FCFS - first came first served - realizowane przez kolejkę FIFO. średni czas oczekiwania może być długi
- SJF - shortest job first - stosowany we wstępnej fazie, przyporządkowuje kolejki gotowym zadaniom, czas czekania jest optymalny. trudno sie określa czas realizacji w poszczególnych fazach
- planowanie priorytetowe - każdy proces ma przypisany pewien priorytet - proces o najwyższym priotytecie jest podtrzymywany. może być wywłaszczający lub nie wywłaszczający
- planowanie rotacyjne - dla systemów z podziałem czasu - procesy wykonują się przez określony odcinek czasu (trudno obieralny), kolejka jest cykliczna, średni czas cyklu zależy od kwantu czasu
- wielopoziomowe planowanie kolejki - gdy procesy można przypisać do różnych grup wykonania
- wielopoziomowe planowanie kolejek ze sprzężeniem zwrotnym - jest z uwzględnieniem możliwości przemieszczania procesów między kolejkami
- planowanie wieloprocesorowe - dla wszystkich procesów jednakowych lub przynajmniej jednego innego
Na czym polega zarządzanie pamięcią w systemach operacyjnych?
Procesor odczytuje kolejne rozkazy z pamięci operacyjnej, które następnie wykonuje; procesor pobiera także dane z pamięci operacyjnej i zapisuje wyniki obliczeń (przetwarzania);
W trakcie tworzenia programu nie można przewidzieć rozmiarów danych, na których program będzie wykonywał działania — w takich przypadkach pamięć potrzebna na dane powinna być przydzielana dynamicznie przez system operacyjny w miarę żądań programu;
Programy kierują do systemu operacyjnego żądania przydzielenia nowych obszarów pamięci, które po pewnym czasie, jeśli są już niepotrzebne, zwracane są do systemu; niekiedy programy żądają przydzielenia obszarów większych niż cała zainstalowana pamięć główna (operacyjna);
System operacyjny powinien ewidencjonować aktualnie zajęte części pamięci wraz z informacją w czyim są władaniu oraz decydować, które procesy mają być załadowane do zwolnionych obszarów pamięci;
Zarządzanie pamięcią jest szczególnie ważne w systemach wielozadaniowych — system operacyjny powinien odpowiednio dzielić dostępną pamięć między wykonywane programy, w dążeniu do jak najbardziej efektywnej pracy systemu.
Na czym polega zarządzanie pamięcią pomocniczą i plikami w systemie operacyjnym?
Pamięć operacyjna jest za mała aby pomieścić wszystkie dane i programy, a zawarte w niej dane giną po odcięciu zasilania. Konieczne jest więc stosowanie pamięci pomocniczej, stanowiącej zaplecze dla pamięci operacyjnej.
Jej zadaniem jest trwałe przechowywanie wielkiej ilości danych (np HDD). Stosowanych jest wiele innych typów pamięci pomocniczych, obecnie CD ROM
Większość programów (kompilatory, edytory, debuggery) do czasu załadowania do pamięci operacyjnej jest przechowywana na dysku; z kolei w trakcie wykonywania używa dysków jako źródeł i miejsc przeznaczenia przetwarzanych przez nie danych;
Przetwarzanie danych zapisanych w pamięci pomocniczej wymaga uprzedniego przepisania ich do pamięci operacyjnej (za pomocą operacji we/wy);
Na czym polega zarządzanie użytkownikami w systemie operacyjnym?
Interpreter poleceń stanowi interfejs między użytkownikiem a systemem operacyjnym; jest to jeden z najważniejszych programów w systemie operacyjnym;
w wielu systemach operacyjnych (np. DOS, Unix) interpreter poleceń jest specjalnym programem, wykonywanym przy rozpoczynaniu zadania lub wtedy, gdy użytkownik rejestruje się w systemie; inne systemy operacyjne zawierają interpreter poleceń w swoim jądrze;
interpreter poleceń znany jest pod nazwą powłoki (ang. shell);
interfejs graficzny (np. MS Windows, Macintosh) jest zwykle bardziej przyjazny dla użytkownika;
za pomocą poleceń przekazywanych do interpretera można:
tworzyć procesy i zarządzać nimi;
obsługiwać wejście-wyjście;
administrować pamięcią pomocniczą i operacyjną;
realizować operacje na plikach i katalogach;
realizować pracę sieciową;
użytkownik porozumiewa się z systemem za pomocą interpretera zleceń, analogicznie programy porozumiewają się z systemem operacyjnym za pomocą funkcji systemowych.
Co to jest proces i jak wygląda jego opis w systemie operacyjnym?
System operacyjny musi realizować różne zadania systemowe; można więc przyjąć, że system składa się zbioru procesów: procesy systemu operacyjnego wykonują kod systemowy, a procesy użytkowe działają wg kodu należącego do użytkowników;
Proces jest obiektem aktywnym, który ma przydzielone pewne zasoby i dla którego można wskazać następny rozkaz do wykonania poprzez określenie zawartości wskaźnika instrukcji (licznika rozkazów) procesora; wykonywany proces może tworzyć wiele nowych procesów;
Opis (reprezentacja)
Proces reprezentowany jest w systemie operacyjnym przez blok kontrolny procesu (PCB); w skład bloku kontrolnego wchodzą następujące informacje:
stan procesu: może być określony jako nowy, gotowy, aktywny, oczekiwanie, zatrzymanie, itd.;
wskaźnik instrukcji (licznik rozkazów): wskazuje adres następnego rozkazu do wykonania w procesie;
rejestry procesora: rodzaje przechowywanych rejestrów zależą od architektury procesora;
informacja o planowaniu przydziału procesora: priorytet procesu i inne parametry potrzebne do planowania;
informacje o zarządzaniu pamięcią: zawartości rejestrów granicznych, tablice stron lub segmentów, itp,;
informacje do rozliczeń: ilość zużytego czasu procesora i czasu rzeczywistego, ograniczenia czasowe, numery kont, itd.;
informacje o stanie wejścia-wyjścia: informacje o otwartych plikach, stosowanych urządzeniach, itd.;
Na czym polega zarządzanie procesami ?
Założenia :
- proces przebywa w jednym z 3 głównych stanów - gotowy, aktywny, czekający)
- blok kontrolny procesu ma postać:
Wskaźnik |
Stan procesu |
Nr procesu |
|
Wskaźnik instrukcji |
|
Rejestry |
|
Ograniczenia pamięci |
|
Wykaz otwartych plików |
|
|
- zasoby fizyczne i logiczne - izolacja (współdzielenie)
- tworzenie procesu - ograniczenia zasobów dostępnych dla porocesów potomnych do podzbioru zasobów rodzica
- zakończenie procesu
- planowanie zadań
Co to są blokady i jak ich unikamy?
Blokada powstanie gdy jednocześnie są spełnione następujące 4 warunki:
- wzajemne wyłączenie - przynajmniej jeden zasób musi być niepodzielny
- przetrzymywanie i oczekiwanie na inny zasób
- brak wywłaszczeń zasobów
- czekanie cykliczne - procesy czekają na zasoby wzajemnie przetrzymywane
Zapobieganie blokadom (pozostawanie w stanie bezpiecznym):
- wzajemne wyłączenie tylko może mięć miejsce w zasobach niepodzielnych - w pozostałych musi być eliminowany
- ograniczenie liczby przetrzymywanych zasobów do najwyżej jednego
- używanie różnych protokołów aby wywłaszczyć zsoby
- uporządkowanie typów zasobów i ubiegać się o nie w porządku aby uniknąc czekania cyklicznego
-- zakończenie procesu
-- zaniechanie (cofnięcie) procesów uwikłanych w blokady
-- usuwanie procesów aż do eliminacji pętli blokady
-- wywłaszczenie zasobów
Przedstawić specyfikę systemów operacyjnych czasu rzeczywistego (czym się różnią od klasycznych so)
systemy czasu rzeczywistego stanowią specjalizowany rodzaj systemów operacyjnych, w których występują surowe wymagania na czas wykonania operacji lub przepływu danych;
w systemach czasu rzeczywistego przetwarzanie danych musi (!) zakończyć się przed upływem określonego czasu, w przeciwnym razie system nie spełnia wymagań;
istnieją dwie odmiany systemów czasu rzeczywistego
1. rygorystyczny system czasu rzeczywistego (ang. hard real time system) gwarantuje terminowe wypełnianie krytycznych zadań;
2. łagodny system czasu rzeczywistego (ang. soft real-time system) jest mniej wymagający: krytyczne zadanie do obsługi w czasie rzeczywistym otrzymuje pierwszeństwo przed innymi zadaniami, przy czym pierwszeństwo zostaje zachowane aż do chwili wykonania zadania;
systemy rygorystyczne, ze względu na ostre wymagania czasowe i konieczność ograniczenia wszystkich opóźnień w systemie, nie mają większości cech nowoczesnych systemów operacyjnych, a ponadto cechują je liczne ograniczenia, np. pamięć pomocnicza jest bardzo mała lub nie występuje wcale, nie używa się także pamięci wirtualnej;
żaden z istniejących, uniwersalnych systemów operacyjnych nie umożliwia działania w czasie rzeczywistym w sensie rygorystycznym, jedynie system Windows NT/2000 w pewnym stopniu może być brany pod uwagę;
systemy łagodne znajdują zastosowanie w mniej odpowiedzialnych rolach, np. w technice multimedialnej; większość uniwersalnych systemów operacyjnych spełnia wymagania systemów łagodnych.
wprawdzie wczesne wersje systemu Windows nigdy nie pretendowały do klasy systemów czasu rzeczywistego, ale wskutek ich powolnego działania nie zostały zaakceptowane przez użytkowników; późniejsze wersje Windows korzystały już ze znacznie szybszych procesorów i większej pamięci, ale niektóre przyjęte rozwiązania miały charakter uproszczony, dostosowany do aktualnych możliwości sprzętu.
Omówić podstawowe stany w jakich może znajdować się proces
proces może znajdować się w jednym z następujących stanów:
nowy — proces został utworzony,
aktywny — są wykonywane instrukcje,
oczekiwanie — proces czeka na wystąpienie jakiegoś zdarzenia (np. na zakończenie operacji wejścia-wyjścia),
gotowy — proces czeka na przydział procesora,
zakończony — proces zakończył działanie
W każdej chwili w dowolnym procesorze tylko jeden proces może być aktywny, przy czym może być wiele procesów gotowych lub czekających;
Podaj sposoby synchronizacji procesów
Mechanizmy synchronizacji/koordynowania:
- sprzętowe - przerwania
- niskiego poziomu - sygnały, potoki
- programowe - na poziomie SO lub wyżej
- sekcje krytyczne
- semafory
Co to jest semafor i jak go implementujemy?
Semafor jest narzędziem synchronizacji procesów - jest zmienna całkowitą, która z pkt widzenie programisty przyjmuje warttości nieujemne lub w przypadku semaforów binarncyh - logiczne. Zmienna semafora musi mieć nadaną wartość.
Implemenatacja semafora ma charakter atomowy (nieprzerwalny)
czekaj(S): while s=<0 do nic;
S:=S-1;
sygnalizuj(S):S:S+1
reszta kodu procesu
Co to jest strefa krytyczna i jak ją tworzymy?
Semafory służą m.in. do budowy sekcji krytycznej wykorzystywanej przez wiele procesów
repeat
czekaj(S)
sekcja krytyczna
sygnalizuj(S)
reszta kodu procesu
until false
B. Programy wielomodułowe
Omówić przyczyny, dla których translacja programu źródłowego wykonywana jest etapowo.
w trakcie tworzenia dużych systemów oprogramowania celowe jest podzielenie systemu na mniejsze podsystemy, z których każdy jest oddzielnie analizowany i kodowany — umożliwia to racjonalne tworzenie i uruchamianie systemu;
wprowadzenie kolejnych poprawek i zmian i nie wymaga wówczas kompilowania całego programu, ale tylko modułu, którego treść została zmieniona;
jeśli nad programem pracuje kilku programistów, to jednoczesna edycja tego samego pliku przez kilka osób jest bardzo kłopotliwa;
moduły stanowią zazwyczaj naturalne jednostki całego programu, przez co zrozumienie jego działania jest łatwiejsze;
kompilatory (i asemblery) dostępne w danym środowisku programistycznym generują kod wynikowy w tym samym języku, nazywanym językiem pośrednim;
język pośredni można uważać za rodzaj "wspólnego mianownika" dla różnych kompilatorów; w środowisku komputerów PC kod w języku pośrednim (przechowywany w plikach z rozszerzeniem .OBJ) zawiera instrukcje procesora w formacie pozwalajacym na przeadresowywanie;
Jakie przekształcenia stosowane są w trakcie ładowania programu wykonywalnego do pamięci.
w wyniku linkowania uzyskuje się plik wykonywalny (w komputerach PC plik z rozszerzeniem .EXE);
oprócz plików zawierających skompilowany program, w procesie linkowania dołączane są też niezbędne podprogramy biblioteczne; zestawy takich podprogramów, zwane bibliotekami statycznymi przechowywane są zwykle w plikach z rozszerzeniem .LIB;
niekiedy wygodniejsze może być udostępnienie podprogramów bibliotecznych dopiero w trakcie wykonywania programu — biblioteki takie nazywane są dynamicznymi i przechowywane są zazwyczaj w plikach z rozszerzeniem .DLL; zastąpienie bibliotek statycznych przez dynamiczne powoduje zmniejszenie rozmiaru pliku wykonywalnego .EXE;
bezpośrednio przed rozpoczęciem wykonywania programu niektóre adresy instrukcji muszą być dostosowane do środowiska konkretnego komputera — korekcja adresów wykonywana jest w trakcie ładowania i korzysta z tablicy przeadresowań, która zapisana jest w pliku .EXE;
Jaką rolę pełni interfejs API w programowaniu?
interfejs programowania aplikacji [API], obejmuje zbiór struktur danych i funkcji, a niekiedy stanowi listę komunikatów;
stanowi ustaloną konwencję wywoływania, za pomocą której program użytkowy (aplikacja) może uzyskać dostęp do usług systemu operacyjnego lub usług udostępnianych przez inne moduły oprogramowania, które zwykle implementowane są jako biblioteki;
API definiowane jest na poziomie kodu źródłowego i stanowi pewien poziom abstrakcji między aplikacją a jądrem systemu operacyjnego (lub innego programu usługowego), co tworzy potencjalne możliwości przenośności kodu;
API udostępniono także w wielu językach wysokiego poziomu w postaci funkcji lub procedur.
powszechnie stosowanym modelem statycznym systemu operacyjnego jest struktura warstwowa, w której warstwy niższe oferują pewne funkcje i usługi warstwom niższym; API jest jedną z tych warst
C. Tworzenie i zarządzanie procesami
W jaki sposób tworzy się nowy proces w systemie Linux?
W systemie Unix utworzenie nowego procesu jest możliwe jedynie poprzez wykonanie funkcji fork
Funkcja fork (ang. rozwidlenie) jest to funkcja systemowa, dostępna w systemie Unix, która tworzy kopię wykonywanego procesu i rozpoczyna wykonywanie dwóch niezależnych procesów realizujących ten sam kod; (innymi słowy: funkcja fork tworzy kopię aktualnie wykonywanego programu i rozpoczyna wykonywanie obu programów);
Omówić technikę synchronizacji procesu macierzystego i potomnego.
W jakim celu zdefiniowano programy rezydentne w systemie DOS.
system DOS jest prosty, jednozadaniowy, o umiarkowanych wymaganiach sprzętowych. Przez wiele lat czynione były próby prowizorycznego dostosowania systemu DOS do pracy wielozadaniowej; w wyniku podjętych prac rozwinięto technikę programów rezydentnych (ang. TSR — terminate and stay resident), stanowiących namiastkę wielozadaniowości;
system Windows jest przygotowany do wykonywania programów TSR;
po wykonaniu programu TSR, jego część kodu i danych pozostaje w pamięci operacyjnej tworząc właściwy program rezydentny; program rezydentny może być później wielokrotnie uruchamiany
D. Zarządzanie pamięcią
1. Co oznaczają terminy: fragmentacja zewnętrzna i wewnętrzna?
system operacyjny przechowuje tablicę z informacjami o tym, które części pamięci są dostępne, a które zajęte, po jego uruchomieniu cała pamięć jest dostępna dla procesów.
W wyniku wykonywania wielu operacji przydzielania i zwalniania obszarów pamięci występuje fragmentacja, objawiająca się istnieniem dużej liczby małych niezajętych obszarów pamięci — przydzielanie większych obszarów pamięci napotyka na trudności;
fragmentacja zewnętrzna polega na tym, że rozmiar znalezionej dziury jest większy od rozmiaru żądanego — po przydzieleniu pozostaje mały niezajęty obszar pamięci, który jest nieprzydatny dla innych programów;
fragmentacją wewnętrzną - czasami jeśli rozmiar dziury jest minimalnie większy od rozmiaru żądanego, to przydziela się całą dziurę, aby uniknąć kłopotów związanych z administrowaniem obszarami zawierającymi kilkanaście bajtów; w rezultacie program otrzymuje większy obszar pamięć niż zamówiony, co oznacza że część pamięci pozostanie niewykorzystana
W jakim celu stosowana jest sprzętowa ochrona pamięci?
w dobrze skonstruowanym systemie komputerowym powinny istnieć mechanizmy zapewniające ochronę systemu operacyjnego przed wpływami programów użytkowników, a ponadto wzajemną ochronę programów użytkowników;
prosty sposób realizacji takiej ochrony polega na użyciu rejestru bazowego i granicznego; mechanizm ten stosowany jest nadal we współczesnych procesorach, ale w zmodyfikowanej postaci;
rejestr bazowy przechowuje najmniejszy dopuszczalny adres fizyczny pamięci dla danego zadania;
rejestr graniczny zawiera rozmiar obszaru pamięci;
każdy adres wygenerowany w programie jest sprawdzany z zawartością ww. rejestrów; próba wyjścia poza obszar traktowana jest jako błąd programu;
zawartości rejestrów bazowego i granicznego ustawia system operacyjny za pomocą specjalnych rozkazów, które nie mogą być wykonywane przez program użytkownika;
Omówić mechanizm transformacji adresów stosowany w procesorze Pentium.
Trudności związane z racjonalnym zarządzaniem pamięcią eleminowane są poprzez skonstruowanie mechanizmu, który pozwala tłumaczyć adres logiczny (wirtualny) na dowolny adres fizyczny. Jest to realizowane za pomocą tablicy transformacji adresów, w której adres logiczny stanowi indeks wskazujący element tablicy, w którym zapisany jest wymagany adres fizyczny;
Zazwyczaj transformowany adres logiczny dzieli się na trzy (lub dwa) pola; pole zawierające kilkanaście najmniej znaczących bitów adresu nie jest transformowane, natomiast pozostałe pola są przekształcane za pomocą tablicy;
w takim ujęciu adres uzyskany po transformacji starszych bitów adresu pierwotnego wskazuje pewien obszar pamięci fizycznej, nazywany stroną, w którym położenie konkretnej lokacji pamięci określa młodsza, nietransformowana część adresu pierwotnego;
rozmiar strony zależy od liczby bitów, która nie podlega transformacji; w procesorze Pentium najczęściej stosuje się schemat transformacji, w którym 12 najmniej znaczących bitów adresu liniowego nie jest przekształcane — zatem w tym przypadku strony mają rozmiar 4096 bajtów (czyli 4 KB); dostępne są też schematy transformacji, w których strony mają rozmiar 2 lub 4 MB;
W jaki sposób implementuje się pamięć wirtualną za pomocą stronicowania.
omówione mechanizmy stronicowania stanowią podstawę do implementacji pamięci wirtualnej, co oznacza symulowanie dużej pamięci operacyjnej za pomocą stosunkowo niedużej pamięci RAM i pamięci dyskowej; implementacja ta polega na przechowywaniu zawartości pamięci symulowanej częściowo w pamięci RAM i częściowo w pamięci dyskowej;
jeśli strona, do której następuje odwołanie, aktualnie nie znajduje się w pamięci operacyjnej, to generowany jest wyjątek (przerwanie), który obsługiwany jest przez system operacyjny, który dokonuje wymiany stron; wówczas inna, aktualnie nieużywana strona kopiowana jest na dysk, a na jej miejsce wprowadzana jest żądana strona; w systemie Windows strony zapisywane i odczytywane z dysku gromadzone są w pliku wymiany;
ponieważ stosowana jest transformacja adresów, więc wymiana może dotyczyć jakiekolwiek strony w pamięci RAM (zwykle wybiera się stronę od dawna nieużywaną) położoną w dowolnym miejscu pamięci o adresie początkowym podzielnym przez 4096; dotychczasowa zawartość strony w pamięci RAM jest zapisywana na dysk, a na jej miejsce wprowadzana jest aktualnie potrzebna strona, tymczasowo przechowywana na dysku;
w niektórych przypadkach program może się odwoływać do lokacji pamięci o adresach nie istniejących w zainstalowanej pamięci RAM; odwołania te muszą zostać skierowane do odpowiednich, rzeczywistych komórek pamięci;
realizacja pamięci wirtualnej za pomocą stronicowania ma liczne zalety, wśród których można wymienić:
poszczególne procesy mają dostęp wyłącznie do swoich własnych obszarów pamięci — jakiekolwiek odwołanie do pamięci przechodzi zawsze przez tablice transformacji adresów i jest kierowane do własnego obszaru pamięci procesu;
zarządzanie pamięcią jest znacznie usprawnione, ponieważ system operacyjny nie musi przeprowadzać scalania małych, niezajętych obszarów pamięci; zwarty obszar pamięci wirtualnej może być ulokowany w postaci wielu stron rozproszonych w całej pamięci RAM;
stosowanie pamięci wirtualnej powoduje pewne zmniejszenie prędkości wykonywania programu wskutek konieczności wymiany stron między pamięcią operacyjną a pamięcią dyskową; im mniejsza jest zainstalowana pamięć RAM, tym wymiana strona wykonywana częściej.
W jakim celu zdefiniowano specyfikacje XMS, EMS i DPMI?
przed systemem Win brakowało odpowiedniego oprogramowania pozwalającego na wykonywanie programów w trybie chronionym. Postanowiono więc zdefiniować techniki i standardy wspomagające dostęp do pamięci rozszerzonej dla programów wykonywanych w trybie rzeczywistym i w trybie V86. Przyjęte specyfikacje określające zasady dostępu do pamięci rozszerzonej — specyfikacje te określały interfejs, poprzez który zwykłe programy mogły się porozumiewać z oprogramowaniem wspomagającym;
najczęściej używane są specyfikacje:
XMS - (ang. extended memory specification) specyfikacja zasad dostępu do pamięci rozszerzonej; program HIMEM.SYS jest zgodny ze specyfikacją XMS;
EMS - (ang. expanded memory specification) specyfikacja zasad dostępu do pamięci oparta na innej koncepcji:
- w latach osiemdziesiątych specyfikacja EMS implementowana była za pomocą kart rozszerzeniowych zawierających dodatkową pamięć RAM, umieszczoną poza przestrzenią adresową procesora;
- w późniejszych rozwiązaniach zastosowano symulację za pomocą odpowiedniego oprogramowania (np. sterownik EMM.386 w systemie DOS);
DPMI - (ang. DOS protected mode interface) specyfikacja opracowana m.in. przez firmy Microsoft, Borland, oferuje możliwość wykonywania quasi-konwencjonalnych programów DOSowych w trybie chronionym;
E. Operacje na plikach
Omówić koncepcję tablicy FAT stosowanej w systemie MS Windows.
tablica rozmieszczenia plików, znana jako tablica FAT jest tablicą stosowaną w systemie Windows; tablica ta przechowywana jest na początku dysku (lub dyskietki), a w przypadku dysku podzielonego na strefy (partycje) na początku każdej partycji;
w tablicy tej każdej pozycji odpowiada jeden klaster (blok) dyskowy; zapis w katalogu wskazuje numer pierwszego klastra pliku; pozycja w tablicy FAT, indeksowana przez numer tego klastra, zawiera numer następnego klastra w pliku; łańcuch taki ciągnie się aż do ostatniego klastra w pliku, który na odpowiadającej mu pozycji w tablicy ma specjalny symbol końca pliku;
tablica rozmieszczenia plików FAT zawiera informacje o stanie wszystkich klastrów obszaru danych dysku; kolejne klastry numerowane są: 2, 3, ...;
struktura informacji w tablicy FAT:
- pierwsze dwie pozycje są rezerwowane dla specjalnych informacji;
- trzecia pozycja tablicy FAT zawiera informacje o pierwszym klasterze obszaru danych (tj. klasterze oznaczonym numerem 2);
- następne pozycje tablicy FAT zawierają informacje o kolejnych klastrach;
- każda pozycja w tablicy FAT używana przez plik wskazuje następną pozycję w FAT dla tego pliku — sekwencja numerów kolejnych pozycji FAT jest taka sama jak numery klastrów składających się na plik, a zatem opisane jest położenie pliku na dysku;
W jaki sposób opisywane jest położenie pliku na dysku w systemie Linux?
pliki przechowywane są na dysku w postaci rozproszonej;
w systemie Linux (Unix) podstawowe informacje o pliku przechowywane są w i-węzłach — podane są tam informacje o rozmiarze pliku, data i czas ostatniej modyfikacji, uprawnienia dostępu do pliku oraz tablicę adresów, za pomocą której można zlokalizować części pliku na dysku;
w systemie Unix przyjęto, że tablica adresów bloków zawiera ustaloną liczbę pozycji, a każda pozycja zajmuje 4 bajty;
początkowe 12 pozycji omawianej tablicy zawiera adresy bezpośrednie, tj. wskazujące konkretne bloki — dzięki temu dostęp do plików o niewielkich rozmiarach odbywa się bardzo szybko; dalsze pozycje zawierają numery bloków: pojedynczego pośredniego, podwójnego pośredniego, potrójnego pośredniego
dostęp do danych przez blok pośredni wymaga wczytania tego bloku i znalezienia odpowiedniej pozycji z adresem bloku bezpośredniego
Jaką rolę w operacjach plikowych pełni uchwyt pliku (ang. file handle)?
Uchwyt pliku jest liczbą identyfikującą wskazywany plik. Jest on przekazywany do programu przez system podczas żądania otwarcia lub utworzenia pliku, które zawiera nazwę pliku, jego położenie i inne parametry.
W dalszych operacjach plik ten będzie identyfikowany przez zwrócony uchwyt pliku (a nie przez nazwę i położenie);
W jaki sposób można zmieniać bieżącą pozycję pliku bez wykowania operacji odczytu lub zapisu?
dostęp do plików ma charakter sekwencyjny. Bieżąca pozycja pliku ma charakter licznika odczytanych/zapisanych bajtów i określana jest zwykle za pomocą liczby 32-bitowej
funkcja systemowa lseek pozwala na poruszanie się w pliku i przesuwanie go bez czytania lub pisania (traktujemy pliki jak tablice);
(postać funkcji wywołanej w języku C)
p = lseek (fd, offset, skąd);
gdzie:
p — bieżąca pozycja pliku po przesunięciu,
fd — uchwyt pliku,
offset — wielkość przesunięcia (long),
skąd — punkt startowy: może przyjmować wartości:
SEEK_SET — początek pliku,
SEEK_CUR — bieżące położenie,
SEEK_END — koniec pliku
Z pliku zawierającego 2472 bajtów odczytano 7 bajtów.
W jaki sposób program może odczytać zawartość katalogu?
Przeglądanie zawartości katalogów
za pomocą funkcji opendir, readdir i closedir
w programach wykonujących działania na plikach zachodzi często konieczność przeglądania (i ewentualnie wyświetlania) listy plików umieszczonych we wskazanym katalogu;
w środowisku Unix (Linux), a także w Windows odczytywanie zawartości katalogów można wykonać za pomocą funkcji opendir, readdir, rewinddir i closedir; funkcje te są zgodne ze standardem POSIX (Portable Operating System Interface), a ich prototypy podane są w pliku nagłówkowym <dirent.h>;
opendir otwarcie strumienia danych katalogowych,
readdir odczytanie ze strumienia danych katalogowych pojedynczej pozycji katalogu (kolejne wykonanie funkcji readdir spowoduje odczytanie kolejnej pozycji katalogu),
rewinddir przesunięcie strumienia na pierwszą pozycję katalogu,
closedir zamknięcie strumienia danych katalogowych;
technikę stosowania ww. funkcji wyjaśnia poniższy przykład
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main ( )
{
DIR * dirp;
struct dirent * dp;
printf("\n\n");
dirp = opendir(".");
/* odczytywanie bieżącego katalogu */
while ((dp = readdir(dirp)) != NULL)
{
printf("\nPlik = %s", dp > d_name);
}
/* od nowa */
rewinddir(dirp);
while ((dp = readdir(dirp)) != NULL)
{
printf("\nPlik = %s", dp > d_name);
}
closedir (dirp);
printf("\nTest programu\n");
return 0;
}
funkcja readdir zwraca wskaźnik do struktury, w której m.in. zdefiniowane jest pole
char d_name[ ];
pole to zawiera nazwę (np. pliku), zakończoną bajtem zerowym; przekazywane nazwy mogą stanowić: nazwy plików (także plików ukrytych i systemowych), nazwy katalogów (w tym katalogi . i ..), etykiety dysku oraz nazwy urządzeń; funkcja readdir zwraca wskaźnik NULL w przypadku natrafienia na koniec katalogu, a także w przypadku błędu;
funkcja readir nie podaje jednak informacji czy nazwa wskazuje na plik, czy na katalog czy też na urządzenie; informacje te można uzyskać za pomocą funkcji stat; poniższy fragment (stanowiący rozszerzenie podanego wyżej przykładu) ilustruje zastosowanie funkcji stat;
#include <sys\stat.h>
struct stat statbuf;
/* odczytywanie bieżącego katalogu */
while ((dp = readdir(dirp)) != NULL)
{
printf("\nPlik = %s", dp > d_name);
stat (dp -> d_name, &statbuf);
if (statbuf.st_mode & S_IFDIR) printf(" - jest to katalog!");
else printf (" - rozmiar pliku = %ld", statbuf.st_size);
używana jest także funkcja fstat, która pozwala uzyskać analogiczne informacje w odniesieniu do plików aktualnie otwartych (zamiast nazwy pliku podaje się uchwyt pliku);
należy zwrócić uwagę, że nazwy plików uzyskiwane za pomocą funkcji readdir trzeba poprzedzić ścieżką dostępu, i dopiero w tej postaci nazwy można zastosować jako argumenty funkcji stat; ścieżkę dostępu można pominąć w przypadku katalogu bieżącego.
8
14