background image

1. STRUKTURY SYSTEMÓW OPERACYJNYCH 

 
 

Zadania systemów operacyjnych 

 
W  odniesieniu  do  zarządzania  procesami  system  operacyjny  odpowiada  za  następujące 
czynności: 
 

 

tworzenie i usuwanie zarówno procesów użytkowych, jak i systemowych; 

 

wstrzymywanie i wznawianie procesów; 

 

dostarczanie mechanizmów synchronizacji procesów; 

 

dostarczanie mechanizmów komunikacji procesów; 

 

dostarczanie mechanizmów obsługi zakleszczeń. 

 
 
W odniesieniu do zarządzania pamięcią system operacyjny odpowiada za: 
 

 

utrzymywanie  ewidencji  aktualnie  zajętych  części  pamięci  wraz  z  informacją,  w 
czyim są władaniu; 

 

decydowanie  o  tym,  które  procesy  mają  być  załadowane  do  zwolnionych  obszarów 
pamięci; 

 

przydzielanie i zwalnianie obszarów pamięci stosownie do potrzeb. 

 
 
W związku z zarządzaniem plikami system operacyjny odpowiada za: 
 

o

 

tworzenie i usuwanie plików; 

o

 

tworzenie i usuwanie katalogów; 

o

 

dostarczanie elementarnych operacji do manipulowania plikami i katalogami; 

o

 

odwzorowywanie plików na obszary pamięci pomocniczej; 

o

 

składowanie plików na trwałych nośnikach pamięci (na których informacja nie znika). 

 
 

Warstwowa struktura systemu MS-DOS 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

Struktura warstw systemu OS/2 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Struktura systemu UNIX 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Struktura klient-serwer systemu Windows NT 

 
 
 
 
 
 
 
 
 
 

background image

2. PROCESY 

 
 
Proces  to  wykonujący  się  program.  Wykonanie  instrukcji  jednego  procesu  musi  być 
sekwencyjne.  Każdy  proces  ma  licznik  instrukcji  (wskazuje  następną  instrukcję  do 
wykonania),  stos  (m.  in.  na  wywołania  podprogramów),  segment  kodu  i  segment  danych. 
Można też spotkać termin zadanie, który będziemy tu uważać za synonim procesu. 
 
 

Blok kontrolny procesu 

 
Blok  kontrolny  procesu  (ang.  Process  Control  Block  –  PCB)  to  zestaw  informacji  o  stanie 
procesu.  Jest  elementem  realizacji  planowania  procesów.  Służy  do  odtworzenia  stanu 
procesora przy wybraniu tego procesu do wykonywania oraz do zapisu stanu obliczenia przy 
usuwaniu go z procesora. Zawiera następujące informacje: 
 

 

stan procesu, 

 

licznik instrukcji, 

 

wartość rejestrów procesora, 

 

informacje związane z planowaniem, 

 

informacje związane z zarządzaniem pamięcią, 

 

informacje rozliczeniowe, 

 

informacje o stanie wejścia-wyjścia. 

 
Gdy  proces  przechodzi  do  stanu  aktywny,  jego  blok  kontrolny  służy  do  odtworzenia  stanu 
obliczenia.  Gdy  proces  opuszcza  stan  aktywny, w  owym  bloku  zapisuje  się  stan  obliczenia, 
ż

eby można je było potem odtworzyć. 

 
 

Planowanie rotacyjne 

 
RR  (Round-Robin),  czyli  planowanie  rotacyjne  to  strategia,  w  której  każdy  proces  po  kolei 
otrzymuje kwant czasu do wykorzystania na procesorze. Zwykle jest to około 100 milisekund. 
Ż

aden proces nie czeka więc dłużej niż długość kwantu przemnożona przez liczbę procesów. 

Planowanie  rotacyjne  powoduje  znacznie  więcej  przełączeń  kontekstu,  jest  więc  dość 
kosztowną  strategią,  ponieważ  wiąże  się  z  dużymi  narzutami.  Kwant  czasu  musi  być  co 
najmniej o rząd wielkości większy niż czas przełączenia kontekstu. W przeciwnym przypadku 
prace administracyjne (biurokracja systemowa) zduszą rzeczywistą pracę wykonywaną przez 
system dla użytkowników. 
 
 
 

3. PLANOWANIE PRZYDZIAŁU PROCESORA 

 
 
Planowanie  (ang.  scheduling)  przydziału  procesora  leży  u  podstaw  wieloprogramowych 
systemów  operacyjnych.  Dzięki  przełączaniu  procesora  do  procesów,  system  operacyjny 
może zwiększyć wydajność komputera. 
 

background image

Cykl faz procesora i wejścia-wyjścia 

 
Sukces  w  planowaniu  przydziału  procesora  zależy  od  pewnej,  dającej  się  zaobserwować 
właściwości  procesów.  Otóż  wykonanie  procesu  składa  się  z  następujących  po  sobie  cykli 
działania  procesora  i  oczekiwania  na  urządzenia  zewnętrzne.  Procesy  naprzemiennie 
przechodzą  od  jednego  do  drugiego  z  tych  dwu  stanów.  Wykonanie  procesu  zaczyna  się  od 
fazy procesora (ang. CPU burst). Po niej następuje faza wejścia-wyjścia (ang. I/O burst), po 
której  proces  znów  przechodzi  do  fazy  procesora,  po  czym  ponownie  –  do  fazy  wejścia-
wyjścia itd. W końcu, w ostatniej fazie procesora, proces – zamiast przejść do następnej fazy 
wejścia-wyjścia – wysyła do systemu żądanie zakończenia swojego działania. 
 
 

Planista przydziału procesora 

 
Gdy  tylko  procesor  zaczyna  być  bezczynny,  system  operacyjny  musi  wybrać  do 
wykonywania  jakiś  proces  z  kolejki  procesów  gotowych.  Wyboru  dokonuje  planista 
krótkoterminowy
  (ang.  short-term  scheduler)  czyli  planista  przydziału  procesora.  Planista 
ten  wybiera  jeden  proces  spośród  przebywających  w  pamięci  procesów  gotowych  do 
wykonania i przydziela mu procesor. 
Kolejka  procesów  gotowych  niekoniecznie  musi  być  kolejką  typu  „pierwszy  na  wejściu  – 
pierwszy  na  wyjściu”  (ang.  first-in,  first-out  –  FIFO).  Podczas  omawiania  różnych 
algorytmów  planowania  przekonamy  się,  że  kolejka  procesów  gotowych  może  być 
zrealizowana jako kolejka FIFO, kolejka priorytetowa, drzewo lub nawet  nieuporządkowana 
lista.  Jednakże  teoretycznie  w  kolejce  procesów  gotowych  wszystkie  procesy  oczekują  w 
szeregu na szansę przydzielenia im procesora. Elementami kolejek są na ogół bloki kontrolne 
procesów (PCB). 
 
 

Planowanie wywłaszczające 

 
Decyzje o przydziale procesora mogą zapadać w następujących czterech sytuacjach: 
 

1.

 

Proces przyszedł od stanu aktywności do stanu czekania (np. z powodu zamówienia na 
wejście-wyjście  lub  rozpoczęcia  czekania  na  zakończenie  działania  któregoś  z 
procesów potomnych) 

2.

 

Proces  przeszedł  od  stanu  aktywności  do  stanu  gotowości  (np.  wskutek  wystąpienia 
przerwania). 

3.

 

Proces  przeszedł  od  stanu  czekania  do  stanu  gotowości  (np.  po  zakończeniu  operacji 
wejścia-wyjścia). 

4.

 

Proces kończy działanie. 

 
W  sytuacjach  1  i  4  nie  ma  możliwości  wyboru  w  kategoriach  planowania.  Kandydatem  do 
przydziału  procesora  musi  zostać  nowy  proces  (jeśli  taki  istnieje  w  kolejce  procesów 
gotowych). Natomiast w sytuacjach 2 i 3 można dokonać wyboru. 
 
 
 
 
 
 

background image

4. ZAKLESZCZENIA 

 
 
W  środowisku  wieloprogramowym  kilka  procesów  może  rywalizować  o  skończoną  liczbę 
zasobów. Proces zamawia zasoby i jeśli nie są one dostępne w danym czasie, wchodzi w stan 
oczekiwania.  Istnieje  możliwość,  że  oczekujące  procesy  nigdy  już  nie  zmienią  swego  stanu, 
ponieważ  zamawiane  przez  nie  zasoby  są  przetrzymywane  przez  inne  czekające  procesy. 
Sytuację taką nazywa się zakleszczeniem (ang. deadlock).  
Większość  współczesnych  systemów  operacyjnych  nie  rozporządza  środkami  zapobiegania 
zakleszczeniom,  prawdopodobnie  jednak  zostaną  one  wkrótce  we  właściwości  takie 
wyposażone.  Problemy  zakleszczeń  mogą  pojawiać  się  coraz  częściej,  zważywszy  na 
aktualne tendencje, w tym coraz większe liczby procesów, programy wielowątkowe, znacznie 
więcej zasobów w systemie i większy nacisk kładziony na długowieczne serwery plików i baz 
danych aniżeli na systemy wsadowe. 
 
 

Charakterystyka zakleszczenia 

 
Będąc  w  stanie  zakleszczenia  procesy  nigdy  nie  skończą  swoich  działań,  wiążąc  zasoby 
systemowe i uniemożliwiając rozpoczęcie wykonywania innych zadań. 
 
 

Warunki konieczne 

 
Do  zakleszczeń  może  dochodzić  wtedy,  kiedy  w  systemie  zachodzą  jednocześnie  cztery 
warunki: 
 

1.

 

Wzajemne  wykluczanie:  Przynajmniej  jeden  zasób  musi  być  niepodzielny;  to 
znaczy,  że  zasobu  tego  nie  może  używać  w  danym  czasie  tylko  jeden  proces.  Jeśli 
inny proces zamawia dany zasób, to musi być opóźniany do czasu, aż zasób zostanie 
zwolniony. 

2.

 

Przetrzymywanie  i  oczekiwanie:  Musi  istnieć  proces,  któremu  przydzielono  co 
najmniej  jeden  zasób  i  który  oczekuje  na  przydział  dodatkowego  zasobu, 
przetrzymywanego właśnie przez inny proces. 

3.

 

Brak wywłaszczeń: Zasoby nie podlegają wywłaszczaniu, co oznacza, że zasób może 
zostać  zwolniony  tylko  z  inicjatywy  przetrzymującego  go  procesu,  po  zakończeniu 
pracy tego procesu. 

4.

 

Czekanie cykliczne: Musi istnieć zbiór {P

0

P

1

, …, P

n

} czekających procesów, takich 

ż

e  P

0

  czeka  na  zasób  przetrzymywany  przez  proces  P

1

,  P

1

  czeka  na  zasób 

przetrzymywany  przez  proces  P

2

,  …,  P

n-1

  czeka  na  zasób  przetrzymywany  przez 

proces P

n

, a P

n

 czeka na zasób przetrzymywany przez proces P

0

 
 

Metody postępowania z zakleszczeniami 

 
Zasadniczo mamy trzy różne metody radzenia sobie z problemem zakleszczeń: 
 

 

Można  zastosować  protokół  gwarantujący,  że  system  nigdy  nie  wejdzie  w  stan 
zakleszczenia. 

background image

 

Pozwala  się  systemowi  na  zakleszczenia,  po  czym  podejmuje  się  działania 
zmierzające do ich wykrycia i usunięcia. 

 

Można  też  zlekceważyć  ten  problem  zupełnie,  uważając,  że  zakleszczenia  nigdy  nie 
pojawią się w systemie. Takie rozwiązanie stosuje się w większości systemów, m. in. 
w systemie UNIX. 

 
 
 

5. ZARZĄDZANIE PAMIĘCIĄ 

 
 
Pamięć 

dynamicznaDRAM (ang. Dynamic 

Random 

Access 

Memory

– 

rodzaj 

ulotnej pamięci półprzewodnikowej RAM,  która  przechowuje  każdy  bit  danych  w 
oddzielnym kondensatorze wewnątrz 

układu 

scalonego. 

Poszczególne 

jej 

elementy 

zbudowane  są  z tranzystorów MOS,  z  których  jeden  pełni  funkcję  kondensatora,  a  drugi 
elementu separującego. 
W  przeciwieństwie  do pamięci  statycznych wymagają  okresowego  odświeżania  zawartości 
(ze  względu  na  rozładowywanie  się  kondensatorów).  Jednocześnie  pojedyncza  komórka 
pamięci  dynamicznej  składa  się  z  mniejszej  liczby  elementów  niż  analogiczna  komórka 
pamięci  statycznej.  Powyższe  cechy  pozwalają  na  większe  upakowanie  elementów 
w układach  scalonych,  co  daje  efekt  w  postaci  niższych  kosztów  produkcji  i  pozwala  na 
budowę tańszych układów pamięci o danych pojemnościach. 
Odświeżanie  musi  następować  w  regularnych  odstępach  czasu  i  wewnętrznie  polega  na 
ponownym  zapisie  odczytanej  wartości  w  tych  samych  komórkach  pamięci.  Za  odświeżanie 
odpowiedzialne są układy  pamięci, specjalizowane układy wspomagające (kontroler pamięci 
– obecnie najczęściej stanowi on integralną część chipsetu) bądź sam procesor (np. Z80). 
Pamięci  dynamiczne  najczęściej  łączone  są  w  dwuwymiarowe  tablice  adresowane  numerem 
wiersza i kolumny, co pozwala ograniczyć liczbę wymaganych linii adresowych i przyspiesza 
sekwencyjny  odczyt  danych  umieszczonych  w  kolejnych  komórkach  tego  samego  wiersza 
pamięci. 
 
Pamięci  dynamiczne  są  obecnie  szeroko  wykorzystywane  jako pamięć  operacyjna w 
urządzeniach,  z  wyjątkiem  układów  wymagających  niezbyt  dużych  ilości  pamięci  (np. 
sterowniki)  oraz  wymagających  szybkiego  dostępu  do  pamięci  (np.  specjalizowany  sprzęt 
sieciowy). 
 
 

Popularne odmiany pamięci DRAM 

 
FPM – Fast Page Mode DRAM 
EDO – Extended Data Out DRAM 
SDRAM – Synchronous DRAM 
SDR SDRAM Single Data Rate Synchronous DRAM 
DDR SDRAM – Dual Data Rate Synchronous DRAM 
DDR2 SDRAM – Dual Data Rate Synchronous DRAM (wersja druga) 
DDR3 SDRAM – Dual Data Rate Synchronous DRAM (wersja trzecia) 
RAMBUS (RDRAM) 
 
 
 

background image

Stronicowanie 

 
Stronicowanie  (ang.  paging)  to  schemat  zarządzania  pamięcią  zezwalający  na  nieciągłość 
fizycznej  przestrzeni  adresowej  procesu.  Stosując  stronicowanie,  omija  się  niebagatelny 
problem  dopasowywania  kawałków  pamięci  o  zmiennych  rozmiarach  do  miejsca  w  pamięci 
pomocniczej,  co  jest  bolączką  większości  uprzednio  omówionych  schematów  zarządzania 
pamięcią. Gdy trzeba wymienić pewne fragmenty kodu lub danych pozostających w pamięci 
operacyjnej, wówczas należy znaleźć miejsce w pamięci pomocniczej. Problemy fragmentacji 
omówione  w  odniesieniu  do  pamięci  operacyjnej  dotyczą  w  tym  samym  stopniu  pamięci 
pomocniczej,  z  tym  że  dostęp  do  niej  jest  znacznie  powolniejszy  co  uniemożliwia 
upakowanie. Rozmaite formy stronicowania, dzięki ich zaletom w porównaniu z poprzednimi 
metodami są w powszechnym użyciu w większości systemów operacyjnych. 
Organizacja  stronicowania  z  reguły  należała  do  obowiązków  sprzętu.  Wszelako  w  ostatnich 
opracowaniach spotyka się stronicowanie zrealizowane na zasadzie bliskich powiązań sprzętu 
z systemem operacyjnym, zwłaszcza w mikroprocesorach 64-bitowych. 
 
 

Stronicowanie hierarchiczne 

 
Większość współczesnych systemów komputerowych umożliwia stosowanie bardzo wielkich 
przestrzeni  adresów  logicznych  (od  2

32

  do  2

64

).  W  takim  środowisku  tablica  stron  staje  się 

zbyt  duża.  Rozważmy  na  przykład  system,  w  którym  logiczna  przestrzeń  adresowa  jest  32-
bitowa.  Jeśli  rozmiar  strony  w  takim  systemie  wyniesie  4  KB  (2

12

),  to  tablica  stron  może 

zawierać do miliona wpisów (2

32

/2

12

). Zakładając, że każda pozycja w tablicy ma 4B, każdy 

proces może potrzebować do 4 MB fizycznej przestrzeni adresowej na samą tablicę stron. Jest 
zrozumiałe,  że  nie  chcielibyśmy  przydzielać  na  taką  tablicę  ciągłego  obszaru  w  pamięci 
operacyjnej.  Jednym  z  prostszych  rozwiązań  jest  tutaj  podzielenie  tablicy  stron  na  mniejsze 
części. Można to wykonać na kilka sposobów. 
Jeden sposób polega na zastosowaniu algorytmu stronicowania dwupoziomowego, w którym 
sama  tablica  stron  jest  podzielona  na  strony.  Aby  to  zilustrować,  powróćmy  do  naszego 
przykładu z 32-bitową maszyną o stronach wielkości 4 KB. Adres logiczny dzieli się na 20-
bitowy  numer  strony  i  12-bitową  odległość  na  stronie.  Ponieważ  dzielimy  tablicę  stron  na 
strony,  numer  strony  podlega  więc  dalszemu  podziałowi  na  10-bitowy  numer  strony  i  10-
bitową odległość na stronie. Adres logiczny przyjmuje więc postać 
 
 
 
 
 
 
 
 
Przy czym s

1

 jest indeksem do zewnętrznej tablicy stron, a s

2

 oznacza przesunięcie na stronie 

tej  zewnętrznej  tablicy.  Ponieważ  tłumaczeni  adresu  przebiega  od  zewnętrznej  tablicy  stron 
do  wewnątrz,  schemat  ten  jest  również  znany  pod  nazwą  wstępnie  odwzorowanej  tablicy 
stron
  (ang.  Forward-mapped  page  table).  Architekturę  tę  zastosowano  w  procesorze 
Pentium-II. 
 
 
 

background image

6. SEGMENTACJA PAMIĘCI 

 
 
Segmentacją (ang. segmentation) nazywa się schemat zarządzania pamięcią, który pomaga w 
urzeczywistnieniu  opisanego  sposobu  widzenia  pamięci  przez  użytkownika.  Przestrzeń 
adresów  logicznych  jest  zbiorem  segmentów.  Każdy  segment  ma  nazwę  i  długość.  Adresy 
określają zarówno nazwę segmentu jak i odległość wewnątrz segmentu. Użytkownik określa 
więc  każdy  adres  za  pomocą  dwóch  wielkości:  nazwy  segmentu  i  odległości  (zestawmy  ten 
schemat ze stronicowaniem, w którym użytkownik określał tylko pojedynczy adres, dzielony 
następnie  przez  sprzęt  na  numer  strony  i  odległość  –  w  sposób  niewidoczny  dla  osoby 
programującej). 
W celu ułatwienia implementacji segmenty są numerowane, a w odwołaniach do nich zamiast 
nazw segmentów, używa się numerów segmentów. Adres logiczny tworzy więc parę (krotkę 
dwuelementową – ang. two tuple): 
 

<numer-segmentu, odległość>. 

 
Program  użytkownika  jest  zazwyczaj  tłumaczony  za  pomocą  kompilatora,  przy  czym 
kompilator  automatycznie  konstruuje  segmenty  odpowiadające  programowi  wejściowemu. 
Kompilator Pascala może wytwarzać osobne segmenty dla: 
 

(1)

 

zmiennych globalnych; 

(2)

 

stosu  wywołań  procedur,  przeznaczonego  na  przechowanie  parametrów  i  adresów 
powrotnych; 

(3)

 

porcji kodu poszczególnych procedur lub funkcji; 

(4)

 

lokalnych zmiennych każdej procedury lub funkcji. 

 
Choć  użytkownik  może  teraz  odwoływać  się  do  obiektów  w  programie  za  pomoc  adresu 
dwuwymiarowego,  rzeczywista  pamięć  fizyczna  jest  wciąż  –  rzecz  jasna  – 
jednowymiarowym 

ciągiem 

bajtów. 

Należy 

zatem 

zdefiniować 

implementację 

odwzorowującą  dwuwymiarowe  adresy  określone  przez  użytkownika  na  jednowymiarowe 
adresy  fizyczne.  Odwzorowanie  to  daje  tablica  segmentów  (ang.  segment  table).  Każda 
pozycja w tablicy segmentów składa się z bazy segmentu i granicy segmentu. Baza segmentu 
zawiera  początkowy  adres  fizyczny  segmentu  w  pamięci  operacyjnej,  a  granica  segmentu 
określa jego długość. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

7. WINDOWS VISTA 

 
 

Warstwa programowania systemu Windows 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Na rysunku 11.2 pokazano warstwy systemu operacyjnego Windows. Pod warstwami apletów 
i  graficznego  interfejsu  użytkownika  (GUI)  znajdują  się  interfejsy  programowe 
wykorzystywane  przez  aplikacje.  Jak  w  większości  systemów  operacyjnych,  wspomniane 
warstwy składają się w dużej mierze z bibliotek kodu (DLL), które są dynamicznie dołączane 
do  programów  żądających  dostępu  do  odpowiednich  funkcji  systemu.  System  Windows 
obejmuje  też  wiele  interfejsów  programowania,  które  zaimplementowano  w  formie  usług 
działających jako odrębne procesy. Aplikacje komunikują się z usługami trybu użytkownika 
za pośrednictwem zdalnych wywołań procedur (ang. Remote Procedure Calls – RPC). 
 
 

Organizacja trybu jądra systemu Windows