IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration système Discussion :

petite précision concernant l'appel de fork()


Sujet :

Administration système

  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut petite précision concernant l'appel de fork()
    Bonjour,

    lors de l'appel de fork(), les processus père et fils disposent de leur propre espace de données.
    En revanche, ils partagent le même code. Je désirerais un complément d'information sur ce point:
    quand on dit le même code, çà signifie que chacun possède en mémoire son propre espace de code et que ce code est identique ou bien que chaque processus exécute le code au même endroit auquel cas ce code doit être réentrant .

    Merci pour vos lumières.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2004
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 060
    Points : 1 609
    Points
    1 609
    Par défaut
    Salut,

    En général, quand tu utilises fork, cette commande est suivi de deux blocs de code : le bloc du processus père (qui se terminera après le processus fils, pour éviter de créer un processus zombie), et un bloc de code pour le processus fils.
    La structure (simple) ressemble à celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
       pid_fils=fork();
     
       if (pid_fils == 0)
       {
          /* Processus fils */
          return 0;
       }
       else
       {
          /* Processus père */
          wait(NULL);
          return 0;
       }
    wait(NULL) permet d'attendre que le fils se termine avant de terminer le processus père

    En espérant t'avoir un peu aidé....
    Chaval
    __________________
    "Monsieur le chat voudriez-vous, s'il vous plait, demanda Alice, me dire de quel côté dois-je aller ?
    Ca dépend de l'endroit où vous voulez vous rendre, répondit le chat"
    Lewis Carrol

  3. #3
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut
    merci pour ta réponse.

    mais je voudrais précisément savoir si le code correspondant est unique et exécuté par les 2 processus ou dupliqué.

    Ou d'une autre façon, après l'appel de fork, le compteur ordinal du processeur est-il identique pour les 2 processus ou bien différent.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2004
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 060
    Points : 1 609
    Points
    1 609
    Par défaut
    j'avais mal compris.
    si ma mémoire est bonne, le code et l'environnement du processus sont dupliqués
    Chaval
    __________________
    "Monsieur le chat voudriez-vous, s'il vous plait, demanda Alice, me dire de quel côté dois-je aller ?
    Ca dépend de l'endroit où vous voulez vous rendre, répondit le chat"
    Lewis Carrol

  5. #5
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut
    si ma mémoire est bonne, le code et l'environnement du processus sont dupliqués
    J'aimerais assez trouver un article de référence sur ce sujet. Je possède l'excellent "Programmation en C sous linux" et j'ai (mal?) cherché sur le net, mais je n'ai pas trouvé ce que je voulais.

    A+

  6. #6
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    En fait, c'est un peu les deux à la fois...
    Tu peux considérer que tout est dupliqué. Cependant, Linux est assez intelligent pour partager les pages mémoire si elle ne sont pas écrites par un des deux processus. Ce mécanisme, c'est ce qu'on appel le Copy-On-Write.

    Pour ce qui est du compteur ordinal, oui, il a la même valeur dans les deux processus après le fork. Même si le code exécutable est dupliqué, les deux copies d'une même fonction doivent se trouver à la même adresse mémoire.
    Imagine que tu possède un pointeur de fonction dans tes données. Il faut qu'après fork ce pointeur soit toujours valide pour les deux processus.


    Mais attention. Le fait que tu demandes si les deux compteurs ordinaux ont la même valeur pour savoir si le code exécutable est partagé me laisse penser que tu n'as pas tout à fait compris comment est géré la mémoire virtuelle.
    Chaque processus, de son point de vue, a accès à 4Go de mémoire. (4Go parce que 32 bits.)
    Si un processus A va lire le contenu de la mémoire à l'adresse 0x08050000, il ne va pas lire la même chose qu'un processus B qui lit le contenu de la mémoire à l'adresse 0x08050000.
    Et ce, parce que ce sont des adresses logiques. Ce ne sont pas des adresses physique de mémoire. Cette traduction entre les deux est faite via un mécanisme de table géré par la MMU.

    Je pense qu'avec ces quelques explications tu auras quelques mots-clé supplémentaires pour trouver de plus amples informations.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  7. #7
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut
    merci pour toutes ces précisions.

    et pour conclure sur le point qui m'interpelait, j'en déduis donc qu'il existe 2 instance de code en mémoire.

    Mais pourquoi dupliquer le code puisque ce segment est en lecture seule?
    A+

  8. #8
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Comme déjà dit, la copie n'est pas vraiment effectuée tant que tu n'écris pas dedans.
    De plus, il existe en fait deux projection mémoire de ton exécutable. Une accessible en lecture et exécution qui contient en fait le code réellement exécuté, et l'autre accessible en lecture et écriture qui ne sert qu'à stocker les variables globales et static.

    Mais ce sont bien deux projections de ton même programme. Et tu peux changer leurs droits d'accès avec mprotect pour écrire dans la première (à tester tout de même pour voir si je ne dis pas de bêtises).
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  9. #9
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut
    Ok, merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petite erreur concernant les parenthèses
    Par bugland dans le forum Langage
    Réponses: 14
    Dernier message: 04/01/2007, 10h21
  2. Petite précision sur les pointeurs
    Par Fonzy007 dans le forum C
    Réponses: 2
    Dernier message: 07/12/2006, 11h25
  3. Imports : petites précisions
    Par Faiche dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2006, 15h42
  4. [XPath] petite précision sur type de syntaxe
    Par Royd938 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/06/2006, 12h13
  5. Réponses: 11
    Dernier message: 21/06/2005, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo