Problem 5 filozofów , Lotnisko

Awatar użytkownika
Pniaq
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 5 kwie 2006, o 18:01
Płeć: Mężczyzna
Lokalizacja: Dąbrowa Górnicza
Podziękował: 3 razy
Pomógł: 2 razy

Problem 5 filozofów , Lotnisko

Post autor: Pniaq »

Czy ktoś byłby w stanie krok po kroku omówić mi następujący programy?
Są to tzw. "Problem 5 filozofów" , oraz "Lotnisko"


#include
#include
#include
#include
#include
#include

#define semflag 0777

key_t klucz;

int semid;

void sem_wait(int id)
{
static struct sembuf buf={0,-1,0};
buf.sem_num=id;
if(semop(semid,&buf,1)==-1)
{
perror("ERRSEM:wait");
exit(1);
}
}

void sem_signal(int id)
{
static struct sembuf buf={0,1,0};
buf.sem_num=id;
if(semop(semid,&buf,1)==-1)
{
perror("ERRSEM:signal");
exit(1);
}
}

void podnies_widelec(int id)
{
sem_wait(id);
}

void odluz_widelec(int id)
{
sem_signal(id);
}

void usiadz_lokaj()
{
sem_wait(5);//
}

void odejdz_lokaj()
{
sem_signal(5);
}

int sem_init()
{
int i,status=0;
if((semid=semget(klucz, 6, semflag|IPC_CREAT|IPC_EXCL))==-1)//tworzymy zestaw zlozony z 6 semaforow 5 filozofow + lokaj
{
if(errno==EEXIST)
semid=semget(klucz,6,0);
}

for(i=0;i0);
semctl(semid,0,IPC_RMID,0);
exit(0);
}








LOTNISKO



#include
#include
#include
#include
#include
#include

#define Ar 4
#define N 20
#define K 1

static struct sembuf buf;

int na_lotnisku,w_powietrzu;

void samolot(int semid,int id)
{
while(1)
{
printf("Samolot %d: latam\n",id);
sleep(5);
printf("Samolot %d: czekam na zezwolenia na lądowanie\n",id);
buf.sem_num=0;
buf.sem_op=-1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Próba lądowania");
exit(1);
}
buf.sem_num=1;
buf.sem_op=-1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Zajmowanie pasa");
exit(1);
}
printf("Samolot %d: ląduje\n",id);
na_lotnisku=N-semctl(semid,0,GETVAL,0);
w_powietrzu==Ar-na_lotnisku;
printf("lotniskowiec: %d w powietrzu: %d\n",na_lotnisku,w_powietrzu);
sleep(2);
buf.sem_num=1;
buf.sem_op=1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Zwalnnianie pasa");
exit(1);
}
printf("Samolot %d: na lotniskowcu\n",id);
sleep(15);
printf("Samolot %d: czekam na zezwolenia na start\n",id);
buf.sem_num=1;
buf.sem_op=-1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Zajmowanie pasa");
exit(1);
}
printf("Samolot %d: startuje\n",id);
na_lotnisku=N-semctl(semid,0,GETVAL,0);
w_powietrzu==Ar-na_lotnisku;
printf("lotniskowiec: %d w powietrzu: %d\n",na_lotnisku,w_powietrzu);
sleep(2);
buf.sem_num=1;
buf.sem_op=1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Zwalnnianie pasa");
exit(1);
}
buf.sem_num=0;
buf.sem_op=1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Próba startowania");
exit(1);
}
}
}

int main(int arc,char **argv)
{
key_t klucz=ftok("/tmp",'a');
int i,semid=semget(klucz,2,0600|IPC_CREAT|IPC_EXCL);
if((semid==-1)&&(errno==EEXIST))semid=semget(klucz,2,0600);
w_powietrzu=Ar;
na_lotnisku=0;
semctl(semid,0,SETVAL,N);//ustaw pojemnosc lotniskowca
semctl(semid,1,SETVAL,1);//ustaw dostep do pasa
printf("nadlatuja samoloty\n");
for(i=0;i0);
semctl(semid,0,IPC_RMID,&buf);
exit(0);
}
Awatar użytkownika
Hamster
Użytkownik
Użytkownik
Posty: 98
Rejestracja: 5 lis 2006, o 20:07
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 16 razy

Problem 5 filozofów , Lotnisko

Post autor: Hamster »

Jak porobisz wcięcia to pewnie się zobaczy Na razie ejst to zlany tekst.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 638
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

Problem 5 filozofów , Lotnisko

Post autor: kadiii »

To są dwa problemy synchronizacyjne. O tych filozowach to poczytaj np. tu ... zof%C3%B3w
Jak zrozumiesz problem to będziesz też rozumiał te dwa programy. W skrócie to chodzi o niemożność wykonania dwóch czynności w jednym czasie, pojawiające się w ten sposób kolizje i możliwość kordynacji tego układu jedynie poprzez dodanie elementu do układu np.arbitra lub jak w Twoim przypadku semaforów-

Kod: Zaznacz cały

static struct sembuf buf;
, to ta struktura. Ale kod rzeczywiście nieczytelny, koszmar... pozdrawiam
ODPOWIEDZ