Muszę zrobić na uczelnie projekt rozwiązujący problem 5 Filozofów przy użyciu kolejki komunikatów ( rozwiązanie asymetryczne).
Treść:
Do rozwiązania problemu należy zastosować pamięć dzieloną.
Dla problemu 5 Filozofów -będzie to tablica widelców, której elementy przyjmują wartości całkowite <0;5>, gdzie 0 –oznacza wolny widelec, 1-5–oznacza numer filozofa, który używa danego widelca.Program główny powinien wypisywać stan tablicy widelców. Projekt powinien się składać z głównego programu, który tworzy i inicjuje mechanizmy synchronizacji procesów, następnie tworzy procesy potomne zgodnie z tematem zadania, czeka na ich zakończenie i zamyka mechanizmy synchronizacji. W przypadku problemu 5 filozofów należy uruchomić 5 procesów filozofów, każdy z nich wykonuje pętlę, w której realizuje swoje zadania –myślenie i jedzenie.
Niestety nie mam pojęcia jak się za to zabrać. Z kolejek komunikatów miałem tylko jedne zajęcia, na których zostało wyjaśnione jak w teorii działa kolejka komunikatów, i dostałem przykładowe pliki z implementacją kolejki i pamięci dzielonej. Niewiele z tego zrozumiałem, a po przewertowaniu internetu jestem niewiele mądrzejszy.
Po 1. Nie wiem jak stworzyć pamięć dzieloną, tak, żeby była to tablica, i jak na niej poźniej pracować.
Po 2. Nie mam zielonego pojęcia w jaki sposób napisać program dla filozofów.
Póki co mam coś takiego (program główny):
Kod: Zaznacz cały
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdlib.h>
#define P 5 // liczba procesow filozof
#define MAX 5 // rozmiar kolejki
#define MAX2 7 // rozmiar kolejki + dwa pola na indeksy zapis/odczyt
#define WOLNY 0 // komunikat: wolny widelec
#define FILOZOF_1 1 // komunikat: filozof 1 uzywa widelca
#define FILOZOF_2 2 // komunikat: filozof 2 uzywa widelca
#define FILOZOF_3 3 // komunikat: filozof 3 uzywa widelca
#define FILOZOF_4 4 // komunikat: filozof 4 uzywa widelca
#define FILOZOF_5 5 // komunikat: filozof 5 uzywa widelca
struct bufor{ // struktura komunikatu
long mtype; // typ komunikatu
int mvalue; //tresc komunikatu
};
int main()
{
key_t klucz, kluczm; // klucze do kolejki komunikatow i pamieci dzielonej
int msgID; // id kolejki komunikatow
int shmID; // id pamieci dzielonej
int i;
struct bufor komunikat;
if ( ( klucz = ftok(".", 777)) == -1 )
{
printf("Blad ftok (main) \n");
exit(1);
}
msgID = msgget(klucz, IPC_CREAT | IPC_EXCL | 0666); // tworzenie kolejki komunikatow
if (msgID==-1)
{
printf("blad kolejki komunikatow\n");
exit(1);
}
kluczm = ftok(".", 707); // klucz dla pamieci dzielonej
shmID = shmget(kluczm, MAX2*sizeof(int), IPC_CREAT | IPC_EXCL | 0666); // tworzenie pamieci dzielonej
komunikat.mtype=WOLNY;
komunikat.mvalue=0;
for( i = 0; i < MAX; i++)
{
if( msgsnd( msgID, &komunikat, sizeof(int), 0) == -1 ) // wysylanie komunikatu o tresci wolny do kazdego elementu tablicy widelcow
{
printf("blad wysylania komunikatu o tresci WOLNY\n");
exit(1);
}
printf("wyslany komuniat nr:%d o tresci : WOLNY\n",i);
}
for (i = 0; i < P; i++)
switch (fork()) // uruchamianie procesow filozofow
{
case -1:
printf ("Blad fork (mainprog)\n");
exit(2);
case 0:
execl("./filozof","filozof",NULL);
}
for (i = 0; i<P; i++)
{
wait(NULL);
}
//zwalnianie zasobow
msgctl(msgID,IPC_RMID,NULL);
shmctl(shmID,IPC_RMID,NULL);
printf("MAIN: Konec.\n");
}
Bardzo proszę o pomoc. Może ktoś już kiedyś robił coś takiego i mógłby podesłać jak to ma wyglądać ??
Albo ktoś może mógłby mi pomóc z tym.
Pozdrawiam