NicoEISTI a écrit :
Bon, c'est clair, il faut que je dois créer un segment de mémoire partagée, et y mettre mon tableau de 5 entiers, pour que mes processus puissent y accéder. Vous pouvez me file un coup de main pour faire ça?
|
1) un premier processus crée un segment de mémoire partagée avec "shmget(clef, taille, option)". Cette fonction te renvoie un identifiant "id".
2) il te faut attacher ce segment avec "shmat(id)". Cette fonction te renvoie un "void*" pointant vers ta mémoire partagée que tu récupères dans un pointeur "pt" de type que tu veux
3) maintenant tu as à ta disposition un pointeur "pt" pointant vers une zone de "x" octets. Tu peux donc écrire dans cette zone où tu veux (à toi de ne pas aller là où il faut pas).
Et tout processus réalisant les opérations "1" et "2" pourra lui-aussi écrire au même endroit ou lire ce qu'il y a été mis (sauf que les autres processus qui veulent accéder à la zone n'auront pas besoin de spécifier la taille dans "shmget()" ).
Une fois tes opérations terminées, tu dois détacher ton pointeur "pt" de ta zone => shmdet(pt). Si t'as plus besoin de ta zone tu peux la supprimer => shmctl(id, IPC_RMID)
Maintenant je ne comprends pas trop pourquoi tes processus ont besoin de s'échanger des valeurs. Moi, quand j'ai écrit l'algo des philosophes, je n'ai utilisé que les sémaphores
1) je génère un tableau de P sémaphores, P étant le nombre de philosophes
2) je génère autant de processus que de philosophes. Chaque processus connait la taille du plat qu'il doit avaler et la taille de sa fourchette (définies au début du programme)
3) quand un philosophe veut manger, il prend en une seule opération
- son sémaphore
- le sémaphore de son voisin (de droite ou de gauche ça importe peu mais si tu décides la droite, tous prennent celui de droite)
Si l'opération est permise (2 sémaphores libres), le processus mange (sa quantité décroit) et garde son sémaphore qq secondes pour que tu puisses voir ton algo tourner. Si l'opération n'est pas permise ben tant pis, le philosophe attend.
4) une fois qu'il a fini sa cuillère, le processus rend les deux sémaphores en une seule opération. Dès que son plat est vide, il se termine.
Avec cet algo, aucun processus n'a besoin d'envoyer des infos à un autre. Chaque processus mange quand il peut et tous coopèrent.
Message édité par Sve@r le 27-02-2005 à 16:36:10
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.