so_3.pdf

(237 KB) Pobierz
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
Systemy operacyjne
Laboratorium
Ęwiczenie 3
Synchronizacja wĢtkw
Wymiana informacji miħdzy wĢtkami
Wstħp
Proces w systemie Windows moŇe uruchomię jeden lub wiħcej wĢtkw. WĢtki mogĢ byę
wykorzystane do odczytu lub zapisu danych w tle lub przeprowadzania dþugotrwaþych obliczeı. W
aplikacjach wielowĢtkowych pojawiajĢ siħ problemy synchronizacji wĢtkw, wspþdzielenia zasobw
i wymiany informacji miħdzy pracujĢcymi wĢtkami.
WielozadaniowoĻę w Windows
W Windows zrealizowano wielozadaniowoĻę z wywþaszczeniem. KaŇdy uruchomiony wĢtek
otrzymuje szczelinħ czasowĢ procesora. Aktualnie wykonywany wĢtek jest wstrzymywany,
gdy upþynie przydzielony mu czas. PoniewaŇ kaŇda szczelina czasowa jest krtka (okoþo 20
milisekund), sprawia to wraŇenie, Ňe wĢtki wykonujĢ siħ rwnoczeĻnie.
KaŇdy proces ma okreĻlonĢ klasħ priorytetu. KaŇdy wĢtek procesu ma okreĻlony poziom priorytetu.
Klasa i poziom priorytetu sĢ þĢczone przez system, tworzĢc priorytet podstawowy wĢtku. Oprcz
priorytetu podstawowego wĢtek posiada priorytet dynamiczny. Jest to priorytet uŇywany przez
algorytm kolejkowania do okreĻlenia, ktry wĢtek powinien otrzymaę czas procesora.
System tworzy kolejki wĢtkw oczekujĢcych na czas procesora. KaŇda kolejka zawiera wĢtki o
rwnym priorytecie. Gdy wĢtek wykorzysta swojĢ szczelinħ czasowĢ system wykonuje nastħpujĢce
czynnoĻci:
- zapamiħtuje stan wĢtku,
- umieszcza wstrzymany wĢtek na koıcu kolejki, do ktrej naleŇy,
- znajduje kolejkħ o najwyŇszym priorytecie, w ktrej jest gotowy wĢtek,
- przesuwa gotowy wĢtek na czoþo kolejki i wykonuje go.
WĢtki, ktre nie sĢ gotowe to:
- wĢtki utworzone jako wstrzymane,
- wĢtki zatrzymane w trakcie wykonywania
- wĢtki zatrzymane przez funkcje blokujĢce.
W pewnych przypadkach system zwiħksza priorytet wĢtku, aby zapewnię, Ňe zostanie mu
przydzielony czas procesora:
- gdy zostanie uaktywnione okno, system zwiħksza priorytet wĢtku, ktry utworzyþ to okno, aby byþ
wiħkszy niŇ priorytet okien, ktre sĢ w tle,
- gdy okno otrzyma meldunek, np. WM_TIMER, WM_MOUSEMOVE lub inny,
- gdy wĢtek zatrzymany przez funkcjħ blokujĢcĢ zostaje wznowiony
Priorytet nie jest zwiħkszany na staþe. Za kaŇdym razem, gdy wĢtek wykorzysta swojĢ szczelinħ
czasowĢ system redukuje poziom priorytetu, aŇ osiĢgnie on poczĢtkowy poziom.
Obiekty sþuŇĢce do synchronizacji
SĢ to obiekty, ktre mogĢ byę uŇywane przez funkcje blokujĢce w celu synchronizacji wĢtkw.
Zdarzenie
informuje jeden lub wiħcej oczekujĢcych wĢtkw, Ňe wystĢpiþo okreĻlone
zdarzenie,
Mutex
tylko jeden wĢtek moŇe byę wþaĻcicielem okreĻlonego obiektu typu Mutex,
co pozwala na wzajemnie wykluczajĢcy siħ dostħp do wsplnych zasobw,
Semafor
posiada licznik przyjmujĢcy wartoĻci miħdzy 0 a ustalonĢ wartoĻciĢ
maksymalnĢ, ograniczajĢc liczbħ wĢtkw, ktre rwnoczeĻnie mogĢ
korzystaę ze wsplnych zasobw,
Sekcja krytyczna
podobnie jak Mutex pozwala na dostħp do zasobw tylko jednemu
wĢtkowi, ale musi byę uŇywana przez wĢtki jednego procesu
2
Wszystkie obiekty, za wyjĢtkiem sekcji krytycznej, posiadajĢ nazwy (tak jak pliki na dysku), co
pozwala takŇe na synchronizacjħ miħdzy procesami. Obiekty synchronizacji mogĢ przyjmowaę dwa
stany:
dostħpny wĢtek, ktry przekaŇe dostħpny obiekt funkcji blokujĢcej nie zostaje
wstrzymany
niedostħpny wĢtek, ktry przekaŇe niedostħpny obiekt funkcji blokujĢcej zostaje
wstrzymany, aŇ stan obiektu zostanie zmieniony na dostħpny
WĢtki, ktrych wykonanie zostaþo wstrzymane przez funkcjħ blokujĢcĢ oczekujĢ na zmianħ stanu
obiektu synchronizacji na dostħpny. Wstrzymany wĢtek wykorzystuje czas procesora w bardzo
niewielkim stopniu.
Funkcje blokujĢce
WĢtek, ktry chce uzyskaę dostħp do wsplnego zasobu lub zaczekaę na inny wĢtek przekazuje obiekt
synchronizacji funkcji blokujĢcej. JeŇeli obiekt jest dostħpny, wĢtek kontynuuje dziaþanie, w
przeciwnym przypadku zostaje wstrzymany. SĢ dwa typy funkcji blokujĢcych: funkcje oczekujĢce na
zmianħ stanu pojedynczego obiektu synchronizacji i funkcje oczekujĢce na zmianħ stanu kilku
obiektw synchronizacji. Nie wolno uŇywaę funkcji blokujĢcych w wĢtku, ktry utworzyþ okno
gþwne aplikacji. Aplikacja, ktrej gþwny wĢtek zostaþ wstrzymany, nie odpowiada na meldunki
wysyþane przez system. W skrajnym przypadku doprowadza to do zawieszenia Windows 95.
Komunikacja miħdzy wĢtkami
WĢtki moŇna podzielię na dwa typy: wĢtki robocze, ktre nie tworzĢ okna i wĢtki ktre utworzyþy
okno, sþuŇĢce do wizualnej komunikacji z uŇytkownikiem. Wszystkie wĢtki jednego procesu
wspþdzielĢ przestrzeı adresowĢ i majĢ dostħp do zmiennych globalnych procesu. WĢtki mogĢ wiħc
przekazywaę miħdzy sobĢ dane za pomocĢ zmiennych globalnych lub wskaŅnikw. Dodatkowo, wĢtki
ktre posiadajĢ okno mogĢ otrzymywaę prywatne meldunki.
3
Klasy i funkcje wykorzystane w ęwiczeniu
Klasa CEvent
Klasa ta opisuje obiekt synchronizacji typu zdarzenie.
CEvent(BOOL StanPocz,BOOL ResetMan,char * Nazwa,SECURITY_ATTRIBUTES *Dostep);
Konstruktor, tworzy nowy obiekt. Wszystkie parametry sĢ opcjonalne.
Parametr
opis
StanPocz
JeŇeli TRUE , pierwszy wĢtek, ktry uŇyje tego obiektu w celu synchronizacji nie
zostanie wstrzymany. DomyĻlnie FALSE .
ResetMan
JeŇeli TRUE , obiekt jest zdarzeniem manualnym, w przeciwnym przypadku jest
zdarzeniem automatycznym. DomyĻlnie FALSE . Zdarzenie manualne pozostaje w stanie
okreĻlonym przez wywoþanie funkcji SetEvent lub c . Zdarzenie automatyczne
powraca do stanu niedostħpny, gdy ostatni wĢtek, ktry byþ na nim zatrzymany,
zostanie wznowiony. DomyĻlnie FALSE .
Nazwa
Nazwa obiektu dla systemu Windows. W przypadku synchronizacji wĢtkw nie trzeba
podawaę nazwy (taka jest domyĻlna wartoĻę).
Prawa dostħpu do zdarzenia. W Windows 9x ignorowane.
Dostep
SetEvent();
Funkcja zmienia stan obiektu na dostħpny. JeŇeli zdarzenie jest manualne, wywoþanie funkcji wznowi
wszystkie wĢtki wstrzymane przez ten obiekt. Zdarzenie automatyczne wznowi tylko jeden wĢtek,
system nastħpnie zmieni stan zdarzenia na niedostħpny. JeŇeli Ňaden wĢtek nie jest wstrzymany,
zdarzenie pozostaje w stanie dostħpny.
PulseEvent();
Funkcja zmienia stan obiektu na dostħpny, zwalnia czekajĢce wĢtki, a nastħpnie ustawia stan zdarzenia
na niedostħpny. JeŇeli zdarzenie jest manualne, wywoþanie funkcji wznowi wszystkie wĢtki
wstrzymane przez ten obiekt. Zdarzenie automatyczne wznowi tylko jeden wĢtek, system nastħpnie
zmieni stan zdarzenia na niedostħpny.
ResetEvent( );
Funkcja zmienia stan obiektu na niedostħpny. WĢtki uŇywajĢce zdarzenia do synchronizacji zostanĢ
wstrzymane. Funkcji nie uŇywa siħ z zdarzeniach automatycznych.
Klasa CCriticalSection
Klasa ta opisuje obiekt synchronizacji typu sekcja krytyczna. Konstruktor klasy nie przyjmuje Ňadnych
parametrw.
Lock();
Funkcja zajmuje obiekt synchronizacji. JeŇeli obiekt jest dostħpny funkcja wraca natychmiast i wĢtek
kontynuuje dziaþanie, jeŇeli obiekt jest niedostħpny funkcja wstrzymuje wĢtek, ktry jĢ wywoþaþ.
Unlock();
Zwalnia obiekt i uruchamia kolejny wĢtek wstrzymany funkcjĢ Lock .
4
835555946.001.png
Klasa CSingleLock
Klasa opisuje funkcjħ blokujĢcĢ oczekujĢcĢ na zmianħ stanu pojedynczego obiektu synchronizacji.
CSingleLock( CSyncObject* pObiekt, BOOL ZajmijObiekt );
Konstruktor, tworzy nowy obiekt. Parametr ZajmijObiekt jest opcjonalny.
Parametr
opis
WskaŅnik do obiektu synchronizacji.
pObiekt
ZajmijObiekt
JeŇeli TRUE , konstruktor przejmie obiekt synchronizacji wskazany przez pierwszy
parametr (tzn. wywoþa funkcjħ Lock ). DomyĻlnie FALSE .
Lock(DWORD TimeOut);
JeŇeli obiekt synchronizacji zwiĢzany z funkcjĢ blokujĢcĢ jest dostħpny funkcja wraca natychmiast i
wĢtek kontynuuje dziaþanie, jeŇeli obiekt jest niedostħpny funkcja wstrzymuje wĢtek na podany czas
(domyĻlnie jest to nieskoıczonoĻę). JeŇeli po upþywie podanego czasu obiekt synchronizacji nie
bħdzie dostħpny, funkcja zwrci wartoĻę 0.
Unlock();
Zwalnia obiekt synchronizacji zwiĢzany z funkcjĢ blokujĢcĢ i uruchamia kolejny wĢtek wstrzymany
funkcjĢ Lock .
Klasa CWnd
Klasa opisuje okno widoczne na ekranie. W ęwiczeniu mogĢ byę potrzebne funkcje wymienione niŇej.
PostMessage( UINT message, WPARAM wParam, LPARAM lParam);
Wysyþa meldunek do okna. Funkcja umieszcza meldunek w kolejce meldunkw i nie czeka na jego
obsþugħ przez okno.
Parametr
opis
message
Liczba naturalna, kod meldunku
Dowolna liczba caþkowita, domyĻlnie 0
wParam
lParam
Dowolna liczba caþkowita, domyĻlnie 0
UINT SetTimer(UINT ID, UINT Czas, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT,
UINT, DWORD) );
Funkcja uruchamia czasomierz.
Parametr
opis
ID
Identyfikator czasomierza, niezerowa liczba naturalna
Czas
Czas w milisekundach odmierzany przez czasomierz
Adres funkcji, ktra bħdzie wywoþywana, gdy upþynie czas okreĻlony przez drugi
parametr. JeŇeli ten parametr ma wartoĻę 0, okno otrzymuje meldunek WM_TIMER
co okreĻlony czas.
lpfnTimer
5
835555946.002.png 835555946.003.png 835555946.004.png
Zgłoś jeśli naruszono regulamin