Commits

Paweł Wieczorek committed a411806

Comments (0)

Files changed (1)

 \maketitle
 
 \tableofcontents
+\newpage
+\section{Wstęp.}
 
-\section{Wstęp.}
+Dokument stanowi opis realizacji biblioteki wątków użytkownika. Celem
+biblioteki było pokonanie wyzwania programistycznego polegającego
+na~zrealizowaniu wątków użytkownika z wywłaszczeniami bez użycia wstawek
+z~językiem maszynowym. Na zaimplementowany model miał wpływ ustandaryzowany
+interfejs biblioteki wątków - PTHREAD.
 
 \subsection{Budowa.}
 
 \item \T{stack mechanism} - mechanizm obsługi stosu wątków
 \begin{itemize}
 \item \T{ansi} - używający pary procedur \T{malloc}, \T{free}
-\item \T{unix} - używający UNIXowych wywołań \T{mmap}, \T{munmap}
+\item \T{unix} - używający UNIX-owych wywołań \T{mmap}, \T{munmap}
 \end{itemize}
 \end{itemize}
 
 \end{verbatim}}
 
 Na~teście widać, że przykładowy program nie może być uruchomiony z~katalogu
-\T{examples} bo ma w~nim biblioteki.
+\T{examples} bo nie ma w~nim biblioteki.
 
 
 \subsection{Przetestowane platformy i przenośność.}
 Solaris. Natomiast dla emulowanej platformy sparc nie udało się znaleźć
 przyczyny nieprawidłowego działania tego mechanizmu na~systemie NetBSD-4.0.
 
-\subsection{Maszyny z wieloma procesorami lub rdzeniami.}
+\subsection{Maszyny z wieloma procesorami.}
 
 Ponieważ wątki są implementowane po stronie użytkownika to system operacyjny
 nie wie o~ich istnieniu. Dlatego program mimo wątków może używać tylko
 \T{yield}). Ograniczenia czasowe są powodem nie zaimplementowania tego
 mechanizmu, lecz wszystkie niezbędne elementy do~jego tworzenia są gotowe
 \footnote
-{Ten model jest protszy niż zrealizowany opierający się o wywłaszczenia.}.
+{Ten model jest prostszy niż zrealizowany opierający się o wywłaszczenia.}.
 
 Dodatkową modyfikacją jaką można wykonać byłaby modułowość programu planisty,
 wtedy biblioteka mogłaby służyć do~testowania różnych algorytmów zarządzania
 zadaniami - programista by pisał wtyczkę, która by kontrolowała działające
 wątki.
 
+Do samego zarządzania wątkami opartego o~wywłaszczenia należy wykonać jeszcze
+procedury anulowania wątku (patrz \T{pthread\_cancel} w standardzie).
+
+Bibliotekę można uczynić bardziej funkcjonalną dodajać dodatkowe procedury
+realizujące wejście-wyjście. Ponieważ obecnie mogą one zostać przerwane
+przed dostarczenie sygnału. Realizacja takich nakładek wydaje się  być prosta
+- powinna korzystać z nieblokujących deskryptorów oraz dodać dodatkowe zadanie
+administracyjne planisty sprawdzające operacje wej-wyj.
 \section{Zarządzanie wątkami.}
 
 Niniejszy rozdział opisuje interfejs biblioteki, każda omawiana stała i~funkcja
 \end{verbatim} }
 
 Każdy wątek jest związany z obiektem \T{attr\_t} opisującym jego
-atrybuty. Obecnie w~implementacji jedyne ustawialen atrybuty to
+atrybuty. Obecnie w~implementacji jedyne ustawia len atrybuty to
 segment stosu, stąd też nie będą one omówione. 
 
 Za tworzenie wątku odpowiedzialna jest procedura \T{create}, która
 
 \end{verbatim}}
 
-\section{Pomocnicze nakładki na wywołania systemowe.}
+\subsection{Usypianie wątku na określony czas.}
+
+{\small\begin{verbatim}
+void pwuthread_util_sleep(int s);
+void pwuthread_util_usleep(int us);
+\end{verbatim}}
+
+Wątek nie może prosić o uśpienie system operacyjny, ponieważ w zależności
+od działąnia systemu - może to albo zablokować cały proces (wszystkie wątki)
+albo uśpić proces jedynie do~następnego wywołania programu planisty\footnote{
+Na systemach UNIX-owych jest domyślnie realizowany drugi scenariusz - proces jest budzony
+przy dostarczeniu sygnału, a wywołanie systemowe blokujące proces zwraca błąd
+\T{EINTR}.}. W związku z tym za usypianie poszczególnych wątek musi być
+odpowiedzialny program planisty - wymione procedury emulują procedury
+\T{sleep} oraz \T{usleep} z języka C.
+
+%\section{Pomocnicze nakładki na wywołania systemowe.}
 
 %\section{Zarządzanie kooperatywne}
 
 implementacja podstaw planisty
 \item \T{support/unix\_stack.c} -
 procedury zarządzające stosem za~pomocą wywołania \T{mmap}
+\item \T{support/ansi\_stack.c} -
+procedury zarządzające stosem za~pomocą procedury \T{malloc}
 \item \T{support/unix\_time\_gettimeofday.c} -
 procedury zarządzające czasem, używające wywołania \T{gettimeofday}
 \end{itemize}
 \item \T{Q\_run} - kolejka wątków działających (bit \T{RUN})
 \item \T{Q\_wait} - kolejka wątków oczekujących na wybudzenie (bit \T{WAIT})
 \item \T{Q\_sleep} - kolejka wątków uśpionych na czas (bit \T{SLEEP})
-\item \T{Q\_detached} - kolejka martwych wątków oczekujących na zwolnienie zasobów (bit \T{DETACHED})
-\item \T{Q\_zombie} - kolejka wątków, które zakończyły stan działania, lecz potrzebne są ich deskryptorów (bit \T{ZOMBIE})
+\item \T{Q\_detached} - kolejka martwych wątków (bit \T{DETACHED})
+\item \T{Q\_zombie} - kolejka żywych trupów, które zakończyły stan działania,
+    lecz potrzebne są ich deskryptorów (bit \T{ZOMBIE})
 \end{itemize}
 
-Nowoutworzone wątki trafiają do~kolejki \T{Q\_run}. Po zakończeniu działania
-wątek może zostać przeniesiony do~dwóch kolejek, w~zależnośći od
+Nowo utworzone wątki trafiają do~kolejki \T{Q\_run}. Po zakończeniu działania
+wątek może zostać przeniesiony do~dwóch kolejek, w~zależności od
 tego czy był \emph{odłączony}. Odłączenie informuje bibliotekę, że na~wynik
 działania danego wątku nikt nie będzie oczekiwał i~jego zasoby można zwolnić
 w~każdej chwili, wątek można odłączyć za~pomocą procedury
-\T{detach}. Kolejka \T{Q\_detached} jest zaimplementowaa
+\T{detach}. Kolejka \T{Q\_detached} jest zaimplementowana
 w~celach pomocniczych, ponieważ wątek nie może zwolnić sam swoich zasobów,
 bo z~nich korzysta. Dlatego odpowiedzialność za ich zwalnianie została
 przeniesiona do~zadań administracyjnych planisty.
 
+Wątek może być tylko w jednej z kolejek \T{wait}, \T{sleep}, \T{detached},
+    \T{zombie} jednocześnie.
+
 Nieodłączony wątek po swojej śmierci jest przeniesiony do~kolejki żywych
 trupów (\emph{zombie}). Dopiero gdy inny wątek wywoła procedurę
 \T{join} wątek zostanie odłączony.
 
 \subsubsection{Sekcja krytyczna}
 
-Niektóre proceduy uruchamiane przez wątki używają tych samych
+Niektóre procedury uruchamiane przez wątki używają tych samych
 danych co program planisty, stąd tez potrzebna jest forma zapewniająca
 spójność danych. W bibliotece jest to rozwiązanie przez specjalną
 sekcję krytyczną. Wejście do sekcji krytycznej odbywa się przez
 Planista oblicza ile czasu minęło od~ostatniego wywłaszczenia. Następnie
 ta wartość jest odejmowana od~budzików wszystkich wątków znajdujących
 się w~kolejce \T{Q\_sleep}. Przy wykryciu, że wątek śpi niemniej niż
-oczekiwano zostaje autoamtycznie wybudzany (przenoszony do kolejki
-\T{Q\_run}). Mogłoby się wydawać, że obliczenia ile czasu minęł
+oczekiwano zostaje automatycznie wybudzany (przenoszony do kolejki
+\T{Q\_run}). Mogłoby się wydawać, że obliczenia ile czasu minęło
 od~ostatniego wywłaszczenia jest zabiegiem zbędnym ponieważ wiadomo
 co jaki czas następuje wywłaszczenie. Gdyby jednak nie obliczać czasu
 to planista byłby wrażliwy wszelkie opóźnienia. Przykładowo, gdyby
 
 Zaimplementowane mechanizmy korzystają z~wspomnianej sekcji krytycznej
 planisty oraz z~założenia że działa jednocześnie jeden wątek (nie ma
-możliwośći użycia większej ilości procesorów/rdzenii, stąd to założenie).
+możliwości użycia większej ilości procesorów, stąd to założenie).
 
 Zamki typu \T{mutex} obsługują wewnątrz kolejkę FIFO, do której są dołączane
 wątki oczekujące na~wejście do sekcji krytycznej (na zamknięcie zamka).
 
 Zmienne warunkowe również operują na kolejkach FIFO zapamiętując wątki
 oczekujące na~zdarzenie. Ponieważ wątki są usypiane będąc wewnątrz
-sekcji krytycznej to zapamiętywany w~stukturze wątku
+sekcji krytycznej to zapamiętywany w~strukturze wątku
 jest również \T{mutex} za nią odpowiedzialny. Rozkaz obudzenia wątku
 jest implementowany przez przeniesienie go do kolejki wątków oczekujących
-na~jego zablokowanie. Można to zainterpretować tak, że aby powrócić
+na~jego zablokowanie. Można to zinterpretować tak, że aby powrócić
 do~sekcji krytycznej, w której wątek został uśpiony - biblioteka emuluje
 wywołanie \T{mutex\_lock} po jego wybudzeniu.
 
  \item[PTH] -
 Rozwijana do dziś biblioteka wątków. Implementuje interfejs \emph{PTHREAD}
 oraz własny. Jej autorom udało się zapewnić działanie na~bardzo wielu
-platformach, a~w~tym także na systemie Microsoft Windows.
+platformach, a~w~tym także na systemie Microsoft Windows. Biblioteka obsługuje
+koopertywny model zarządzania wątkami.
 
  \item[PTL] -
 Nie rozwijana dziś biblioteka wątków, implementująca interfejs \emph{PTHREAD}.
 Bibliotekę cechowała duża ilość nakładek na~wywołania systemowe, co czyniło
 ją bardzo praktyczną. Biblioteka posiadała innowacyjny debugger do~wątków,
 mianowicie program używający biblioteki stawał się także serwerem. Przygotowany
-program mógł się do niego podłączyć i~monitorować stan wątków.
+program mógł się do niego podłączyć i~monitorować stan wątków. Biblioteka
+obsługuje model wątków, opierający się o wywłaszczenia.
 
  \item[BSD] -
 W niektórych systemach wywodzących się z BSD dostępnych jest wiele różnych bibliotek implementujących