A) Podany program dla jednego producenta i jednego konsumenta będzie działał poprawnie, ponieważ, producent i konsument będą naprzemiennie korzystać ze współdzielonego zasobu i dopóki jeden z nich nie wywoła polecenia sem_signal, drugi będzie czekał na semaforze na swoją kolej.
B) Tu szukałem miejsca w którym program się wykrzaczy(killerski przeplot), ale nie mogłem znaleźć, więc zostawiłem to pytanie, a pod koniec dopisałem, że dla wielu producentów i konsumentów program również będzie działał poprawnie, gdyż w sekcji krytycznej jednocześnie będzie naprzemiennie tylko jeden producent lub konsument.
#define size 10
Int Findempty(int tab[])
{
Int i;
For (i = 0; i < size; i++)
If (tab[i] == 0) return i;
Return -1;
}
#define size 10
Int findfull(int tab[])
{
Int i;
For (i = 0; i < size; i++)
If (tab[i] != 0) return i;
Return -1;
}
Dopisałem jeszcze: przyjmujemy, że tablica pusta jest uzupełniona zerami, a zapisywane w niej dane są różne od zera.
Można go zastosować w taki sposób, że współdzielony zasób sieciowy (np. drukarka sieciowa) będzie obiektem(procesem – już nie pamiętam co napisałem) który czeka na spotkanie, natomiast użytkownicy chcący skorzystać z tego zasobu to zadania, które idą na spotkanie. W ten sposób mamy pewność, że zasób będzie jednocześnie wykorzystywany tylko przez jednego użytkownika, gdyż jeżeli proces(zasób) będzie na spotkaniu z jednym zadaniem, to nie obsłuży drugiego spotkania, dopóki nie zakończy pierwszego.
Wpłynie pozytywnie, ponieważ przy wykorzystaniu algorytmu FCFS nie wystąpią zagłodzenia. FCFS to algorytm analogiczny do kolejki FIFO(first In first out), oznacza to, że każdy z procesów, jeżeli zgłosi chęć wykorzystania zasobu, to ma gwarancję, że w skończonym okresie czasu zostanie obsłużony, dzięki czemu nie powstaną zagłodzenia.
Tego nawet nie ruszyłem, bo nie miałem pojęcia.
Przede wszystkim semafory Dijkstry to semafory dwustanowe (binarne). Nie posiadają one sprecyzowanej kolejności wzbudzania procesów i nie można sprawdzić ich stanu. W obecnych semaforach mamy dowolną ilość stanów przez co semafor nie są one tylko opuszczone lub podniesione (mogą być częściowo opuszczone). Jest określony sposób wzbudzania procesów po użyciu funkcji Signac (np. FIFO) i możemy sprawdzić ich stan.
Ponieważ programy współbieżne są programami niedeterministycznymi. Podczas każdego uruchomienia programu może wystąpić inny przeplot funkcji przez co nie zawsze dojdzie do zakleszczenia. Dodatkowo dla każdego uruchomienia procesy mogą potrzebować dostępu do innych zasobów które współdzielą z innymi procesami.