E:BFIFO - Extended Broadcasting FIFO
czyli Rozszerzona Kolejka Rozgłoszeniowa FIFO.

Zadanie polega na zmodyfikowaniu działania kolejki FIFO. W rzeczywistości, utworzony zostanie nowy mechanizm, który będzie dziedziczył niektóre własności FIFO, niektóre modyfikował, jeszcze inne rozszerzał.

Przypomnę najpierw zasadę działania kolejki FIFO, oraz jej podstawowe własności, aby łatwiej było wskazać najważniejsze punkty modyfikacji.

Jak widać, chociaż FIFO umożliwia komunikację wielu procesów (w odróżnieniu od PIPE) niespokrewnionych to bez dodatkowej synchronizacji jest to właściwość prawie bezużyteczna.

Jednak niewątpliwymi zaletą tego mechanizmu są: jego prostota oraz możliwość przesyłania dużych ilości danych. Bardziej zaawansowane mechanizmy IPC jak kolejki komunikatów służą do przesyłania, jak nazwa wskazuje - komunikatów i mają nałożone duże ograniczenia, jeżeli chodzi o ilość przesyłanych danych, zaś pamięć dzielona jest mechanizmem "surowym" jeżeli chodzi o dostęp. Jak wynika z testów (R.Stevens "Programowanie zastosowań sieciowych w systemie UNIX") FIFO jest najsłabszym mechanizmem pod względem efektywności i dlatego nie zawsze warto go stosować, lecz pomińmy chwilowo ten aspekt.

TWOJE ZADANIE polega na utworzeniu nowego mechanizmu komunikacji międzyprocesowej, którego konstrukcję oprzesz na kolejce FIFO. Będzie to mechanizm rozgłoszeniowy (broadcasting). Mechanizm ten powinien posiadać następujące własności:

  1. Umożliwia korzystanie z jednej kolejki jednocześnie wielu procesom piszącym i wielu procesom czytającym - tak samo jak przy FIFO.
  2. Procesy piszące nie są zawieszane w oczekiwaniu na opróżnienie kolejki, ich żądanie zapisu realizowane jest w całości, bez zawieszenia lub przerwania - inaczej niż w FIFO.
  3. Zapewniona jest spójność zapisu, czyli strumień danych zapisany przez proces będzie spójny bez względu na to, ile procesów jednocześnie pisze - inaczej niż w FIFO.
  4. Procesy czytające przy próbie odczytu większej ilości danych niż jest jeszcze nie odczytana dostają to, co jest - tak samo jak przy FIFO.
  5. Procesy czytające nie konkurują o dane. Ponieważ jest to mechanizm rozgłoszeniowy, to każdy proces odczytuje te same dane. Każdy z nich w dogodnym dla siebie momencie.
  6. Umożliwia przeskoczenie bez czytania pewnej ilości danych w kolejce.

Moje komentarze, zapewne ułatwią zrozumienie powyższych intencji:

  1. Oczywiste.
  2. Chodzi o to, żeby proces nie mógł zapełnić kolejki pisząc. Oczywiście w pewnych rozsądnych granicach, powiedzmy kilkadziesiąt - kilkaset kB jeżeli będziesz przechowywał te dane w pamięci i np. kilka - kilkanaście MB jeżeli będziesz przechowywał te dane na dysku. (Sugeruję jednak korzystanie z pamięci, by uczynić ten mechanizm szybszym od np. gniazd w dziedzinie Unixa, które przechowują swe dane właśnie na dysku.) Rzecz też w tym, żeby proces nie musiał czekać na opróżnienie kolejki, ani sprawdzać czy jest miejsce w kolejce. To powinno być zmartwieniem mechanizmu/systemu operacyjnego. Z drugiej strony zauważ, że chcemy te same dane udostępniać wielu procesom, a nie wiemy kiedy one zechcą coś odczytać, jak również kiedy dołączą się nowi czytelnicy. Pamięć mamy niestety o ograniczonym rozmiarze. Toteż najstarsze komunikaty powinny być zapewne usuwane. (Możesz ewentualnie pomyśleć o przeniesieniu ich na dysk, byłoby to ciekawe rozszerzenie, aczkolwiek o niewielkim stopniu trudności.) Pomyśl co z dołączającymi się czytelnikami, możesz np. zabronić im dołączania się w pewnych momentach.
  3. Oczywiste. Chodzi o to, żeby dane zapisane przez proces stanowiły jeden kawałek, nawet gdy pisze jednocześnie wiele procesów, a system je wywłaszcza.
  4. Oczywiste. Zrób, aby działało to dokładnie tak jak przy FIFO.
  5. Oczywiste. Analogiczne do np. odczytu z pliku przez wiele procesów.
  6. Cel tego jest następujący: być może programista będzie chciał oznaczać pakiety, zapisane w kolejce. Wtedy proces, po przeczytaniu nagłówka decyduje czy chce ten pakiet odczytać czy nie. Jeżeli nie, to chciałby go przeskoczyć bez czytania - jest to zabieg czysto optymalizacyjny, ale dodanie tej operacji nie powinno być trudne.

Testy
Gdy już uruchomisz swój program:


Autor: Marcin Polak, III rok Informatyki UW