web-dev-qa-db-fra.com

Forking vs Threading

J'ai déjà utilisé le filetage dans mes applications et je connais bien ses concepts, mais récemment dans ma conférence sur le système d'exploitation, je suis tombé sur fork (). Ce qui est similaire au filetage.

J'ai recherché la différence entre eux sur Google et j'ai appris que:

  1. Fork n'est rien d'autre qu'un nouveau processus qui ressemble exactement à l'ancien ou au processus parent, mais il s'agit tout de même d'un processus différent avec un ID de processus différent et ayant sa propre mémoire.
  2. Les fils sont des processus légers qui ont moins de frais généraux

Mais, il y a encore quelques questions dans mon esprit.

  1. Quand devriez-vous préférer fork () au filetage et vice-versa?
  2. Si je veux appeler une application externe en tant qu'enfant, dois-je utiliser fork () ou des threads pour le faire?
  3. Lors de la recherche Google, j'ai trouvé des gens disant que c'était une mauvaise chose d'appeler un fork () dans un thread. Pourquoi les gens veulent-ils appeler un fork () à l'intérieur d'un thread lorsqu'ils font des choses similaires?
  4. Est-il vrai que fork () ne peut pas tirer parti du système multiprocesseur car les processus parent et enfant ne s'exécutent pas simultanément?

La principale différence entre les approches de forking et de thread est celle de l'architecture du système d'exploitation. À l'époque où Unix a été conçu, forking était un système facile et simple qui répondait le mieux aux exigences du mainframe et du type de serveur, en tant que tel, il a été popularisé sur les systèmes Unix. Lorsque Microsoft a ré-architecturé le noyau NT à partir de zéro, il s'est concentré davantage sur le modèle de thread. En tant que tel, il existe encore aujourd'hui une différence notable: les systèmes Unix sont efficaces avec la fourche et Windows plus efficace avec les threads. Vous pouvez le voir notamment dans Apache qui utilise la stratégie de préfork sous Unix et le pool de threads sous Windows.

Plus précisément à vos questions:

Quand devriez-vous préférer fork () au filetage et vice-versa?

Sur un système Unix où vous effectuez une tâche beaucoup plus complexe que la simple instanciation d'un travailleur, ou si vous souhaitez le sandboxing de sécurité implicite de processus distincts.

Si je veux appeler une application externe en tant qu'enfant, dois-je utiliser fork () ou des threads pour le faire?

Si l'enfant fera une tâche identique au parent, avec un code identique, utilisez fork. Pour les sous-tâches plus petites, utilisez des threads. Pour des processus externes distincts, n'utilisez ni l'un ni l'autre, appelez-les simplement avec les appels d'API appropriés.

Lors de la recherche Google, j'ai trouvé des gens disant que c'était une mauvaise chose d'appeler un fork () dans un thread. Pourquoi les gens veulent-ils appeler un fork () à l'intérieur d'un thread lorsqu'ils font des choses similaires?

Pas tout à fait sûr, mais je pense qu'il est assez coûteux en termes de calcul de dupliquer un processus et beaucoup de sous-threads.

Est-il vrai que fork () ne peut pas tirer parti du système multiprocesseur car les processus parent et enfant ne s'exécutent pas simultanément?

Ceci est faux, fork crée un nouveau processus qui tire ensuite parti de toutes les fonctionnalités disponibles pour les processus dans le planificateur de tâches du système d'exploitation.

48

Un processus fourchu est appelé un processus lourd, tandis qu'un processus fileté est appelé un processus léger.

Voici la différence entre eux:

  1. Un processus bifurqué est considéré comme un processus enfant tandis qu'un processus fileté est appelé un frère.
  2. Le processus bifurqué ne partage aucune ressource comme le code, les données, la pile, etc. avec le processus parent, tandis qu'un processus fileté peut partager du code mais a sa propre pile.
  3. La commutation de processus nécessite l'aide du système d'exploitation, mais la commutation des threads n'est pas requise
  4. La création de plusieurs processus est une tâche gourmande en ressources, tandis que la création de plusieurs threads est une tâche moins gourmande en ressources
  5. Chaque processus peut s'exécuter indépendamment tandis qu'un thread peut lire/écrire les données d'un autre thread. Thread and process lectureenter image description here
26
Selvaperumal

fork() génère une nouvelle copie du processus, comme vous l'avez noté. Ce qui n'est pas mentionné ci-dessus est l'appel exec() qui suit souvent. Cela remplace le processus existant par un nouveau processus (un nouvel exécutable) et, en tant que tel, fork()/exec() est le moyen standard de générer un nouveau processus à partir d'un ancien.

par exemple. c'est ainsi que votre shell invoquera un processus à partir de la ligne de commande. Vous spécifiez votre processus (ls, disons) et les fourches Shell, puis exécutez ls.

Notez que cela fonctionne à un niveau très différent du filetage. Le threading exécute plusieurs lignes d'exécution intra-processus. Le fork est un moyen de créer nouvea processus.

12
Brian Agnew