Problem 5 Ucztujących Filozofów

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
merry_007
Piegowaty Guziec
Piegowaty Guziec
Posty: 1
Rejestracja: 18 sty 2018, 12:57
Płeć: Mężczyzna

Problem 5 Ucztujących Filozofów

Post autor: merry_007 » 18 sty 2018, 13:30

Witam,

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
ODPOWIEDZ

Wróć do „Programowanie”