ZADANIE NR 2 – FAQ

2014-12-18

Czy powinno być Głosów nieważnych: j?
Nie, to moja pomyłka. Poprawka w treści oznaczona jest na czerwono.
Podobnie z K zamiast M w raporcie.
Czy każdy wątek może alokować osobną tablicę L * K?
Tak, ale przy takim podejściu proszę wprowadzić ograniczenie na maksymalną liczbę wątków lub rozmiar pamięci na takie bufory w formie stałej w programie serwer lub pliku nagłówkowym. Ograniczenie ma działać w taki sposób, że klienci będą czekać na obsłużenie jeśli w danej chwili nie można utworzyć kolejnego wątku. W razie gdyby miały się teraz pojawić pytania o wartość tej stałej - myślę że wartość rzędu 100 wątków będzie OK.
Co należy robić gdy klient komisja wykryje niezgodność pomiędzy swoimi danymi a potwierdzeniem od serwera?
Nie jest to wyspecyfikowane i macie tu Państwo dowolność w implementacji. W szczególności można ten fakt zignorować.

2014-12-20

Przetworzonych komisji: x / M
Czy w tym miejscu / oznacza dzielenie czy wypisanie znaku "slash"?
W tym miejscu chodzi o znak.
W jakim formacie należy wypisywać dane procentowe (frekwencję)? Z jaką dokładnością? Czy wypisywać znak %?
Należy wypisać wartość wyrażoną w procentach (czyli iloraz pomnożony przez 100), natomiast precyzji można użyć dowolnej (można w szczególności zaokrąglić do liczby całkowitej albo wypisywać w sposób domyślny); nie jest też określone czy znak % ma się pojawić: może (za liczbą), ale nie musi.
Czy komisja musi przesłać swoje zbiorcze wyniki w pojedynczym komunikacie?
Nie. Jeśli przyczyną takiej interpretacji jest zdanie Dla danej komisji m dopuszczalne jest tylko jednorazowe połączenie w celu przesłania wyników, to wyjaśniam, że nie chodzi tu o pojedynczy komunikat, tylko jedną "sesję" komunikacji.
Komisja nie może nadpisać wcześniej już przesłanych wyników (co tak naprawdę jest dla Państwa ułatwieniem, bo wyniki można dzięki temu sumować na bieżąco). W praktyce - program komisja uruchomiony z tym samym m, które już raz było wykorzystane, ma zakończyć się porażką po próbie komunikacji z serwerem.
Natomiast sesja komunikacji między komisją a serwerem może składać się z wielu komunikatów.

2014-12-21

Jakie limity rozmiaru komunikatu nas obowiązują?
Takie jak na students (ipcs -l): 8 KiB rozmiar komunikatu, 16 KiB rozmiar kolejki. Przy czym to drugie i tak nie powinno być kluczowe dla rozwiązania; po prostu trzeba mieć świadomość, że kolejki są skończone. Rozmiar komunikatu jest oczywiście istotny.
Czy raport może wstrzymywać wszystkie komisje, a komisja inne komisje i raporty?
Czy chodzi o zaimplementowanie rozwiązania klasycznego problemu czytelników i pisarzy (gdzie czytelnik = raport, pisarz = komisja)?
Nie do końca. Wiele komisji powinno móc współbieżnie przysyłać wyniki i tu dokonujemy ochrony na poziomie pojedynczych wartości.
Ze względu na wypisywanie zbiorczych statystyk przez każdy raport (nawet taki wypisujący tylko jedną listę) rzeczywiście nie bardzo jest jak uwspółbieżniać raporty z komisjami.
Czy mamy zapewnić atomowość aktualizacji wyników, tzn. czy raport może zaobserwować sytuację gdy (podczas odbierania wyników od komisji) część list została już zaktualizowana, a część jeszcze nie?
"Wyniki wypisywane w raporcie muszą być spójnym obrazem danych ..."
Jeśli to było niejasne, to już tłumaczę. Raport ma zawierać dane odpowiadające sytuacji, gdy pewna część komisji przesłała już swoje dane w całości, a reszta nie zaczęła ich jeszcze wysyłać. Sformułowanie było tak ogólne (jeśli przez to niejasne - przepraszam), aby nie wymuszać jednego sposobu rozwiązania (synchronizacji między procesami); chodzi tylko o zawartość danych.
Przypominam, że przy tym
  • mamy umożliwić współbieżne działanie wielu komisji (patrz odp. wyżej),
  • nie chcemy doprowadzić do zagłodzenia,
  • ani oczywiście do żadnego zastoju.
Czy można użyć tablic o stałych rozmiarach?
Wolałbym tablice alokowane dynamicznie na podstawie parametrów. 40 kB to nie jest jakiś gigantyczny rozmiar, ale te limity są do pewnego stopnia "przykładowe", a rozwiązanie powinno być bardziej ogólne.
Czy w przypadku kończenia serwera sygnałem SIGINT serwer może wysłać sygnał do klientów?
Tak, może.
Czy można użyć semaforów POSIXowych do eleganckiego rozwiązania problemu kończenia wątków serwera?
Tak, zgodziłem się na to. Ale do zasadniczej ochrony danych proszę użyć mechanizmów z pthread w nazwie.

2014-12-22

Czy można używać rozszerzeń GNU C / C99? Czy program musi kompilować się z flagą ANSI?
To ma być C (a nie C++), ale można używać najbardziej popularnych rozszerzeń GNU C i C 99 (np. deklaracja z inicjalizacją). Flagi ANSI być nie musi.
Czy trzeba jawnie zwalniać mutexy itp.?
Jeśli chodzi o moment kończenia serwera – nie trzeba. Większość zasobów, w tym pamięć, mutexy, rwlocki, zmienne warunkowe, wątki, jest zwalniana wraz z zakończeniem procesu. Inaczej jest z kolejkami, które muszą być usunięte jawnie (to naturalne, bo nie należą do żadnego procesu).
Trzeba natomiast jawnie zwalniać zasoby, które są w serwerze używane tymczasowo (np. tylko na czas obsługi jednego klienta), gdyż ich nie zwalnianie doprowadzi do wycieku zasobów i serwer nie będzie mógł działać "dowolnie długo".