T. F. 13

Transkrypt

T. F. 13
T. F.
WYKŁAD 5
Problem producent – konsument.
Dwa programy (producent, konsument) dziel obszar pami ci zwany buforem(N elementowa tablica danych
jakiego typu). Producent wypełnia t tablic danymi, a konsument opró nia j . Producent (odp. konsument) ma
zmienn wy (odp. we) 0 - N-1 mówi c który element tablicy ma by wypełniony (opró niony) jako nast pny..
Z ka dym wyprodukowanym(skonsumowanym) elementem nast puje wy++(we--). Innymi słowy wy wskazuje
na pierwsz woln komórk , a we na pierwsz zaj t . Zwi kszanie we, wy odbywa si modulo N, czyli
wy=(wy+1)%N, we=(we+1)%N
Ilo elementów do konsumpcji jest wyznaczona przez we-wy. Problem w tym, e wyznaczona jest z
dokładno ci do N, wi c gdy we-wy=0 nie da si powiedzie czy tablica jest całkowicie zapełniona, czy
całkowicie pusta. Aby odró ni te dwie sytuacje mo na wprowadzi dodatkow zmienn współdzielon licznik,
która b dzie zawiera liczb elementów gotowych do konsumpcji. Dzi ki temu mo na zabezpieczy tablic
przed zapisywaniem nowych danych przed przetworzeniem starych.
Producent:
while(1){
dana d;
/* wytworzenie jednostki danych do d*/
while (licznik==N);--czeka na pobranie elementu z tabl przez konsumenta(opró nienie bufora)
reszta bufor[wy]=d; --wstawia do tablicy wyprodukowane dane
wy=(wy+1)%N;
licznik++; --sekcja krytyczna}
Program ten wypełnia wi c tablic tylko wtedy gdy konsument robi miejsce na nowe dane.
Konsument:
while(1){
dana d;
while(licznik==0);--czeka na wyprodukowanie elementu
d=bufor[we];
we=(we+1)%N;
licznik--;
/* konsumpcja danej*/ }
Kod ten jest kodem niepewnym, gdy współbie na praca konsumenta i producenta odbywa si na tym samym
obszarze pami ci. Nie ma problemu z buforem, gdy kod ten nie dopuszcza do równoczesnego czytania i
dopisywania na jednym elemencie tablicy. Takiego zabezpieczenia nie ma na zmienn licznik, wi c przy
jednoczesnej modyfikacji tej zmiennej mo e doj do desynchronizacji procesów. Mo na si przed tym
zabezpieczy , ustalaj c e operacje licznik++, licznik—s operacjami atomowymi (gdy jeden program
modyfikuje licznik to dost p do zmiennej jest blokowany dla drugiego programu). Bez tego ka da z tych
operacji jest interpretowana jako ci g operacji atomowych:
w1:pobierz do rejestru
w2:zwiu ksz(zmniejsz ) rejestr
w3:zapisz rejestr do zmiennej
W systemach wieloprocesorowych mog wyst pi przeploty tych operacji.
np.: gdy licznik=3
w1
w2
w3
m1
m2
m3
rejestr
3
4
4
4
3
3
licznik
3
3
4
4
4
3
w1
w2
m1
m2
m3
w1
rejestr
3
4
3
2
2
4
licznik
3
3 sterowanie do prod. stan rejestru
3 zapami tuje a do powrotu sterowania
3
2 kons. dostaje sterowanie i przywraca
4 zapami tany stan rejestru
Pojawia si wi c nieistniej cy element, który po skonsumowaniu mo e wyło y program.
Dlatego te operacje musz by atomowe.
Zamkni cie semafora – mówimy, e my b dziemy korzysta ze zmiennej współdzielonej i, e nikt inny nie mo e
z niej teraz korzysta .
Otwarcie semafora – informujemy, e inni mog ju korzysta z tej zmiennej, bo my ju sko czyli my.
13
T. F.
Model sekcji krytycznej
Rozwa my system zło ony z n procesów. Ka dy z nich ma w kodzie fragment zwany sekcj krytyczn .
W modelu sekcji krytycznej co najwy ej 1proces systemu mo e znajdowa si w swojej sekcji krytycznej (jeden
lub aden). Przed wej ciem do swojej sekcji krytycznej proces musi dosta na to zgod (od innych procesów
grupy lub od S.O.). Oczekiwanie na zgod nazywamy sekcj wej ciow . Po zako czeniu wykonania sekcji
krytycznej proces musi poinformowa o jej zako czeniu i, e inni mog do niej wej (bo inaczej inni nie b d
wiedzieli, e sekcja krytyczna jest wolna) jest to nazywane sekcj wyj ciow . Reszt kodu procesu nazywamy
reszt .
Ogólny schemat procesu korzystaj cego z sekcji krytycznej
While(1)
{
/* sekcja wej ciowa*/
/* sekcja krytyczna*/
/* sekcja wyj ciowa*/
/* reszta*/
}
Warunki poprawnego funkcjonowania modelu sekcji krytycznej:
(1)
wzajemne wył czanie (gdy proces jest w sekcji krytycznej to aden inny nie mo e do niej wej ) – jest to
warunek podstawowy, zazwyczaj spełniony w pierwszej kolejno ci.;
(2)
warunek post pu – tylko procesy wykonuj ce sekcj wej ciow mog kandydowa do wej cia do sekcji
krytycznej, a wybór jednego z nich nie mo e by odwlekany;
(3)
ograniczone czekanie – je eli proces wykonuje sekcj wej ciow to istnieje ograniczona liczba wej
sekcji krytycznej innych programów.
do
Programowe metody synchronizacji.
Algorytm 1:
W systemie s 2 procesy P0, P1, które dziel zmienn całkowit numer o pocz tkowej warto ci 0. Warto
zmiennej numer oznacza, który z nich ma wej do sekcji krytycznej.
Struktura procesu Pi ma posta :
Pi : while(1)
{
while(numer!=i);//sekcja wej ciowa (czeka na swój numer gdy spełniony to czas na jego sekcj kryt.)
/*wykonuje sekcj krytyczn */
numer=numer-1; //zmienia na numer drugiego
/*reszta*/
}
Rozwa my procesy:
P0: czas reszty 1s.
P1: czas reszty 1h.
czas sekcji krytycznej pomijalny
P0
P1
sekcja krytyczna P1
reszta 1s
reszta 1s
sekcja krytyczna P1
reszta 1h
Do sekcji krytycznej wchodzi P0 ko czy j , zmienia numer na 1 i robi przez 1s reszt . P1 wykonuje sekcj
zmienia numer na 0 i wykonuje przez 1h reszt . Nast pnie P0 ma sekcj krytyczn i zmienia numer na 1.
Nast pnie po wykonaniu reszty chce sekcji ponownie, ale nie mo e si do niej dosta bo numer wskazuje na 1,
który go zmieni dopiero po 1h (po zako czeniu reszty, i wykonaniu sekcji krytycznej). Algorytm ten jest zły bo
nie jest spełniony warunek post pu.
14
T. F.
Algorytm 2:
Dwa procesy dziel zmienn tablicow int flaga[2]={0,0}; która zawiera informacj który z procesów chce
wej do sekcji krytycznej (0 w odpowiednim miejscu tablicy gdy pi nie chce sekcji, 1 gdy chce).
struktura Pi:
while(1)
{
flaga[i]=1;
while(flaga[1-i]==1); --czeka, a drugi nie b dzie chciał i do sekcji
/*wykonuje sekcj */
flaga[i]=0; --umo liwia dost p drugiemu
/*reszta*/
}
Algorytm ten nie pracuje na stanie w jakim jest proces, ale na tym czy chce on sekcji krytycznej.
Wada:
Mo e nast pi zakleszczenie gdy oba równocze nie poprosz o sekcj krytyczn , oba zmieni flag na 1. Przez
to oba wpadn w niesko czon p tl (bo warunkiem wyj cia jest to, e flaga[i]=0, a oba maj 1. Wynika st d , e
co pewien czas wszystko si zawiesza.
Algorytm (Dekker / Peterson)(działaj ce poł czenie algorytmów 1 i 2):
Dwa procesy dziel zmienn int flaga[2] ={0,0} (informuje który chce wej do sekcji krytycznej) i numer
(który ma wej ).
Struktura Pi:
while(1)
{
flaga[i]=1;--sygnalizuje, e chce wej
numer=1-i;--numer drugiego procesu
while(!(flaga[1-i]==0||numer==i));--je li 2-gi chce wej i nie jego numer to czeka
/*gdy zadziała warunek to opuszcza p tl i przechodzi do sekcji krytycznej*/
flaga[i]=0;--by da mo liwo wej cia drugiemu
/*reszta*/
}
Algorytm ten spełnia wszystkie warunki modelu sekcji krytycznej.
Ten sam proces nie mo e mie 2 sekcji krytycznych pod rz d, gdy jest inny na ni czekaj cy gdy zgłaszaj c
zapotrzebowanie zmienia numer na indeks drugiego (odbiera sobie prawo pierwsze stwa) nie spełnia wi c
adnego z warunków opuszczenia p tli.
Wsparcie synchronizacji programowej od strony procesora.
Model `TAS (Test And Set po raz pierwszy zastosowany w Motoroli).
int TAS(int * zamek)
{
int stary=* zamek;--zapami tuje star warto zamka
*zamek=1;
--zmienia warto zamka
return stary;
--zwraca star warto zamka
}
Program ten zwraca star warto zamka i nadaje zamkowi warto 1(zawsze t sam ).
Zwraca 0 lub 1. 0 1,1 1.
while(!(TAS(&zamek)==0);--wchodzi w p tl gdy zamek był 0
--TAS jest operacj atomow gdy 1 proces j wykonuje zamyka zamek
/*sekcja krytyczna*/
zamek=0;--zeruje zamek aby nast pny z procesów mógł wej do sekcji
TAS nie mówi który z procesów ma przebi p tl while dlatego mo e dochodzi do głodzenia procesu (nie jest
spełniony warunek ograniczonego czekania).
XCHG (Intel)
sprowadza si to do tego samego co TAS.
kod asemblera
petla: mov
al , 1
--pobiera do rejestru 1
lock
xchg
al , zamek –zmienia al i zamek(zamek staje si 1 bo al było równe 1)
cmp
al , 0
porównuje al i 0, gdy s równe to idzie dalej
jne
petla --gdy nie był spełniony to idzie do petla
Podobnie jak TAS instrukcja ta nie spełnia warunku ograniczonego czekania.
15
T. F.
WYKŁAD 6
Semafor – zmienna całkowita , na której mo na wykonywa jedynie niepodzielne operacje:
proberen P (wait)
verhogen V (signal)
void P (int *semafor)
{
while(*semafor<=0);--instrukcja ; wi c czeka, a semafor b dzie dodatni
(*semafor)--;
}
void V(int *semafor)
{
(*semafor)++;
}
Operacje te s niepodzielne. Dla P oznacza to, e je li proces przebije p tl while to wykonuje operacj
(*semafor)—; niepodzielnie.
Gdy np.: *semafor==1 to:
Gdy czeka kilka procesów to jeden z nich przebija p tl i zmienia semafor na 0, pozostałe wi c musz czeka ,
gdy nie jest spełniony warunek przebicia p tli. Semafor jest wi c zamkiem przepuszczaj cym przez siebie tylko
jeden proces. Semafor ustawiony na 0 zamyka przej cie innym dopóki proces nie wykona operacji V. Wtedy
przechodzi nast pny np., np..
Gdy semafor ma na pocz tku inn warto to przejd 3 procesy (bo ka dy z nich zmniejsza semafor o 1)
Program do synchronizacji dzi ki semaforom:
while(1)
{
P(semafor);
/*sekcja krytyczna*/
V(semafor);--gdyby tego nie zrobił to aden inny nie mógłby wej
}
do sekcji krytycznej na jego miejsce
Semafor binarny – semafor inicjowany przez 1. Mo e przyjmowa tylko 2 warto ci: gdy przyjmuje 1 to
mo emy wej do sekcji, gdy 0 to musimy czeka a proces wykonuj cy s. krytyczn wyjdzie z niej (wykona
wtedy V).
Semafory nie mog pokona zakleszczenia tzn: niech sem1, sem2 – semafory
P(sem1)
P2(sem2)
P(sem2)
P2(sme1)
Pomi dzy tymi instrukcjami mo e doj
jest i dlatego nie mog sko czy swojej) .
do zakleszczenia (oba nie mog dosta s. krytycznej bo drugi w niej
Wady semaforów binarnych:
aktywne czekanie (wiruj ca blokady) – p tla while brak spełnienia warunku ograniczonego czekania (nie wiemy
który proces przejdzie przez blokad po podniesieniu semafora i dostanie sekcj krytyczn , mo e by to ustalane
losowo lub przez jakie szeregowanie wi c procesy mog by głodzone )
Semafory uogólnione
void P(int *semafor)
{
(*semafor)--;
if (*semafor<0)
{
doł cz_mnie_do_listy_semafora(semafor);--wykonyje to koordynator – zaawyczaj S.O.
u pij_mnie();
}
}
void V(int *semafor)
{
16
T. F.
}
(*semafor)++;
if(*semafor<=0)
{
p=wyjmij_process_z_listy_semafora(semafor);--wykonuje to specjalny proces
obud _proces(p);
}
Semafory stosowane s gdy chce si dosta ró nymi drogami do czego , a jednocze nie mo e to by
wykonywane przez jeden proces.
Model z semaforem uogólnionym: proces po doj ciu do semafora informuje dyspozytora (zazwyczaj S.O. ), e
musi by doł czony do kolejki semafora, nast pnie usypia si . Operacja V wykonywana jest przez dyspozytora
(a nie przez sam proces), który te budzi nast pny proces do sekcji krytycznej (mo e on by tak dobrany aby nie
było głodzenia).
Gdy przychodzi proces do semafora to zmniejsza go o 1, nast pny tak samo np. Gdy proces wychodzi to system
wykonuje V zwi ksza semafor. Moduł semafora to liczba czekaj cych na przej cie procesów. Gdy semafor ==0
to jest tylko jeden proces (wtedy on wchodzi).
Zazwyczaj systemy operacyjne maj w interfejsie u ytkownika f-cje stwórz semafor, usu semafor, podnie
semafor, opu semafor.
Komunikacja mi dzyprocesowa.
Jest ona stosowana, aby przekazywa dane z procesu do procesu w systemach w których nie ma mo liwo ci
oddziaływania na siebie przez zmienne współdzielone(np.: Unix).
Mi dzy dwoma rozdzielonymi zadaniami przesyłanie danych. Realizuje si to przez funkcje nadaj, odbierz
wykonuj ce si w sposób strumieniowy.
1. produkuje (nadaje ) dane;
2. konsumuje (odbiera) dane.
Istniej dwie linie podziału komunikacji mi dzyprocesowej:
1. nazewnictwo;
2. buforowanie.
1. nazewnictwo:
(i) Pierwsza metoda organizacji to komunikacja bezpo rednia. Funkcje nadaj i odbierz maj jako parametry:
nadaj(odbiorca, komunikat);
odbierz(nadawca, komunikat); --nadawca odbiorca to identyfikatory odpowiednich procesów
Jest to wariant symetryczny, gdy oba znaj adresy tego drugiego.
Wariant asymetryczny:
nadaj(odbiorca, komunikat);
odbierz(komunikat);-- nie ma od kogo
(ii) komunikacja po rednia:
procesy komunikuj si za pomoc pewnych obiektów systemowych zwanych partiami (albo skrzynkami
pocztowymi)
nadawca(skrzynka, komunikat);
odbiorca(skrzynka, komunikat);
Nadawca wysyła do skrzynki, a odbiorca z tej samej skrzynki odbiera. Nie ma koordynat(???)
2. buforowanie:
wyst puj tu 3 typy komunikacji:
(i) ł cze o pojemno ci 0 – nadawca musi czeka , a odbiorca odbierze, i na odwrót(synchronizuje nadawc i
odbiorc ).
(ii) pojemno ograniczona – nadawca jest blokowany gdy odbiorca nie odbierze n komunikatów nadawca nie
wie czy komunikat doszedł bo mo e on by składowany w ł czu;
(iii) pojemno potencjalnie nieograniczona;
Aby zsynchronizow ł cza (ii) i (iii) trzeba wysła potwierdzenie odbioru, nadawca mo e si wstrzyma a do
jego otrzymania.
Jest to komunikacja asynchroniczna (wysyłamy i czekamy na potwierdzenie).
17
T. F.
Zarz dzanie pami ci operacyjn
/*zakładamy, e pami operacyjna to tablica bitów zaczynaj ca si od 0 a do ko ca pami ci (taka pami
zorganizowana w sposób płaski*/
jest
wi zanie adresów:
załó my, e pod adresem 10 mamy program komputerowy:
09 /* mieci */
10 ładuj rejestr
19 --liczba oznacza miejsce w pami ci sk d chcemy pobra liczb (zajmuje ona 1 bit)
12 zwi ksz rejestr (1 bit)
13 zapisz rejestr 20 (1+1 bit)
15 wykonaj przerwanie programowe (1 bit)
17 skocz do
21
19 3 (jednostka danych)
20 0 (jednostka danych)
21 zako cz program
22 /* mieci */
Program wczytuje do rejestru liczb z komórki 19 zwi ksza rejestr i wynik zapisuje do komórki 20, wykonuje
przerwanie programowe i skacze do 21 po czym ko czy prac .
Program ten nie mo e by ładowany od innego miejsca w pami ci ni 10 bo odwołuje si do konkretnych
komórek (inaczej wykonywałby kod z komórek u ywanych przez inne programy, lub zmieniałby dane(lub kod)
innych).
Program musi by załadowany do okre lonego miejsca w pami ci wyznaczonego przez kompilator, nie mo na
go zmieni , chyba e zmodyfikuje si warto ci komórek 10,13,17.
realokacja – zmiana odwoła do adresów pami ci nieadekwatnych do miejsca do którego załadowali my
program.
Gdyby był system jednoprogramowy mogliby my załadowa program do miejsca 10, ale i tu nie ma pewno ci,
e programy stale rezyduj ce w pami ci nie s tu umieszczone (mog zajmowa wi cej lub mniej pami ci).
W systemach wieloprogramowych, wielozadaniowych jest wi kszy problem bo nie wiemy czy w czasie
ładowania miejsce 10 nie jest zaj te przez inny program, bo zaj ta pami ci gle si zmienia. Musimy wi c mie
sposób na zmian adresów.
sposoby wi zania adresów:
1. wi zanie przy kompilacji – oznacza to, e kompilator okre la miejsce w które program ma by załadowany
(w DOS-ie takie programy maj rozszerzenie com). To miejsce pami ci jest zapisane w ich kodzie.
Adresy w DOS składaj si z 2 cz ci:
segment 16 bit
offset
16 bit
Prawdziwy adres oblicza si ze wzoru: segment*16+offset=1 MB +64KB (maksymalnie)
Dzi ki temu, e adresy programów com maj segment równy 0 to mog pracowa tylko na ko cówce offset.
Pracuj wi c na 16 bitach pami ci, mog wi c obsługiwa wi c maksymalnie 216=64 KB kodu. Dzi ki temu
mo na zało y , e w miejscu na programy com nie ma niczego w pami ci.
2. wi zanie adresów czasie ładowania:
Sposób ten jest charakterystyczny dla programów typu exe. S.O. ładuj c program u ywa dowolnego wolnego
obszaru pami ci, a nast pnie zmienia odwołania adresów w kodzie tak, aby działał on poprawnie. Ka dy
program jest wyposa ony w informacje które elementy jego kodu musz by zmienione, nale y program
poprawi – zrealokowa .
Kod zaczyna si od 0, ale w nagłówku s dane 1,4,8 – numery komórek (licz c od komórki 0) które trzeba
zmieni . Realokacja jest tu wykonywana tylko raz przy ładowaniu. W systemach w których dochodzi do
dynamicznego zwalniania pami ci st d mo e on zmieni swój adres dlatego pojawiło si :
3. Wi zanie w czasie wykonania.
Realokacja jest wykonywana wraz a ka d poło enia programu w pami ci w ci gu com-exe s to programy
PE – portable executable (przeno ne exe).
18

Podobne dokumenty