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:
Mais, il y a encore quelques questions dans mon esprit.
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.
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:
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.