Signaler

La fonction fork()

Posez votre question Anonyme09 - Dernière réponse le 17 août 2017 à 16:14 par Anonyme09
Bonjour,

Je voudrais savoir comment le système d’exploitation affecte les PID au processus père et fils.

J'ai ce programme et je n'arrive pas a comprendre comment on a affecté les PID

for(fork();(getpid()%2==0)&&(i<4); (i++,fork()))


Si on prend le pid du processus main 2400, on aurait

                    2400
2401 2402 2403 2404 2405 (1)
2406 2407 2408 2409 (2)
2410 2411 (3)
2412



Les fils du 2400 sont ceux de (1) normalement 2404 sera le processus fils du 2402 et pas 2400 ???

SVP aidez moi et merci par avance.
Utile
+0
plus moins
bonsoir, que ne comprends-tu pas?
les pid n'ont pas de signification, chaque processus du système doit simplement avoir un pid unique, différent des pid de celui de chacun des autres processus.
Anonyme09- 16 août 2017 à 00:32
Salut,

En fait, c'est un exercice

int i=0;

for(fork(); ((getpid()%2 ==0)&&(i<4); (i++,fork()));
while(wait(NULL)!=-1);


On suppose que le pid du processus correspond a ce programme est 2400 et la numérotation des processus est séquentielle

Donnez le résultat à l'exécution.

Normalement il nous donne l'arbre que j'ai présenté mais je n'ai pas compris comment affecter les PIDs.
Répondre
Donnez votre avis
Utile
+0
plus moins
'lut,
non seulement comme le dit yg_be les PID n'ont pas de réelle signification,
en plus, à moins que tu ne sois sur un UNIX(-like) temps réel (indice: ce n'est pas ton cas), l'attribution des PID est faite au hasard dans la hiérarchie des processus car tu n'as aucune garantie de quel process va fork() avant l'autre.
L'ordonnanceur (scheduler) se réserve le droit d'exécuter tel ou tel process dans l'ordre qu'il veut, potentiellement en parallèle dans le cas d'un système multi-cœur, avec un ordre d'exécution allant, pour un ensemble de processus connus, de quasi-prévisible (pour
SCHED_DEADLINE
) à beaucoup plus hasardeux pour Completely Fair Scheduler.
from human import idiocy
del idiocy
Anonyme09- 16 août 2017 à 13:51
l'algorithme d’ordonnancement est FIFO ou (FCFS)
Répondre
yg_be 3569Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 17 octobre 2017 Dernière intervention Anonyme09 - 16 août 2017 à 08:51
si c'est un exercice avec des suppositions, il suffit de le résoudre par raisonnement, non?
Répondre
Anonyme09- 16 août 2017 à 13:57
ce que je n'arrive pas à comprendre le fils du 2402 quand i=1, PID=2406 normalement PID=2404, non?
Répondre
KX 14861Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 17 octobre 2017 Dernière intervention - 16 août 2017 à 18:15
"ce que je n'arrive pas à comprendre le fils du 2402 quand i=1, PID=2406 normalement PID=2404, non?"
C'est aléatoire selon l'état du système au cours de l'exécution du programme.

Exemple simple : au moment où tu lances ton programme le système a déjà donné le PID 2404 à un autre programme. Il démarre ton programme avec le PID 2400 parce qu'il est disponible, mais jamais aucun fork ne permettra d'obtenir la valeur 2404 car elle est déjà utilisée par l'autre programme.
Et imaginons que tu continues à forker en boucle, par exemple tu en es à 2600 quand le programme qui utilisait le 2404 se termine, le système peut très bien te donner la valeur 2404 qui vient de se libérer... même si tu en étais à 2600 avant.

Le système s'en fiche de la valeur qu'il te donne, il fait ce qu'il veut du moment que chaque processus a un PID unique.
Alors quand tu fork en rafale il y a de fortes chances pour avoir des PID qui se suivent (dans la limite des stocks disponibles) car personne d'autres n'en fait la demande.

Exemple plus complexe : Si maintenant tu lances deux programme en même temps qui font tous les deux des forks en rafale,en regardant les résultats des deux programmes en même temps tu vas avoir des PID uniques (à un moment donné) mais comme les PID vont être répartis "aléatoirement" entre les deux programmes si tu regardes les PID d'un seul programme ça risque d'être chaotique car les PID "suivants" que tu pensais obtenir pour ton programme auront été attribués à l'autre programme s'il a été plus rapide...

En bref : il n'y a aucune logique là dedans si tu n'as pas une vision globale de l'ensemble des processus actifs sur le système d'exploitation... et ça n'a aucune importance, tu as un PID tu utilises sa valeur telle quelle est, il n'y a aucune propriété mathématique (suite de nombre par exemple) que tu pourras déduire des PID attribués par le système.
Répondre
Anonyme09- 17 août 2017 à 16:14
Merci bcp ^^
Répondre
Donnez votre avis
Utile
+0
plus moins
Un processus avec un pid pair fait : fork() N fois.
Un processus avec un pid impair a le test faux et s'arrête.
Pour le processus initial i vaut 0 1 2 3 4 donc N vaut 5, il aura 5 fils.
Pour un processus fils, i pars du i du père jusqu'à 4
pere pid2400,i=0  ->  fils pid2401,i=0  ->  pid2401,stop
pere pid2400,i=1  ->  fils pid2402,i=1
Mais ici 2 process sont en concurrence
fils pid2402,i=1  ->  petit-fils pidXXXX,i=1
pere pid2400,i=2  ->  fils pidYYYY,i=2
Impossible de savoir celui qui sera le premier! L'un produira le pid2403 qui s'arrête, et l'autre le pid2404. Mais sera-ce "petit-fils pid2404,i=1" ou "fils pid2404,i=2" ? C'est ce que tu as dis, on ne peut pas savoir si 2404 sera fils de 2400 ou de 2402.

L'exercice n'a pas de sens comme l'a déjà dit ElementW. C'est une grave erreur d'incompréhension de ce qu'est un processus!
Anonyme09- 16 août 2017 à 13:55
mais le fils du 2402 quand i=1, PID=2406 est ça ce que je n'arrive pas à comprendre normalement PID=2404
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Les PID sont uniques pour l'ensemble du système d'exploitation, donc d'autres programmes qui s'exécutent en même temps possèdent également des PID dont les valeurs ne pourront pas être données à ton programme.

La seule valeur importante dans le fork c'est le 0, ça te permet de distinguer si tu es dans le processus père ou le processus fils, pour le reste la valeur du PID n'a aucune importance, ils sont juste uniques pour les processus vivants à un instant donné.

À lire : que fait un fork ?
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !