295 votes

Processus de vs Thread

Récemment, j'ai été posées lors de l'entrevue quoi la différence entre processus et thread. Vraiment je ne savais pas la réponse. J'ai pensé pendant une minute, et a donné de très étrange réponse.

Les Threads partagent la même mémoire.. de processus. Après avoir répondu à cette enquêteur a donné un sourire mal et a tiré questions suivantes à moi:

Q. connaissez-vous les segments sur lesquels le programme est divisé?

Ma réponse: yep(pensais que c'était facile) de la Pile, de Données, de Code, de Tas

Q. Alors, dites-moi quel segment thread partager?

Je ne pouvais pas répondre, cela a fini en disant tout.

Svp quelqu'un peut-il corriger et impressionnant de réponses pour la différence entre processus et thread?

216voto

Greg Hewgill Points 356191

Vous êtes à peu près correct, mais threads partagent tous les segments à l'exception de la pile. Les Threads sont indépendants les piles d'appels, cependant la mémoire dans d'autres piles de threads est toujours accessible et, en théorie, vous pourriez organiser un pointeur vers la mémoire dans un autre thread local du cadre de pile (bien que vous devriez trouver un meilleur endroit pour mettre cette mémoire!).

60voto

Jorge Córdoba Points 18919

À partir de Wikipédia (je pense que ça ferait une très bonne réponse pour l'interviewer :P)

Threads différents des traditionnels système d'exploitation multitâche les processus en ce que:

  • les processus sont généralement indépendantes, alors que les threads exister en tant que sous-ensembles d'un processus
  • les processus d'importantes informations d'état, alors que plusieurs threads dans un processus d'action de l'état ainsi la mémoire et d'autres ressources
  • les processus ont des espaces d'adressage différents, alors que les threads partagent leurs adresse de l'espace
  • processus interagissent uniquement par le biais fournies par le système inter-processus les mécanismes de communication.
  • Le changement de contexte entre les threads d'un même processus est généralement plus rapide que le changement de contexte entre les processus.

59voto

Robert S. Barnes Points 17244

Quelque chose qui a vraiment besoin d'être souligné, c'est que, il y a deux aspects à cette question - l'aspect théorique et la mise en œuvre d'aspect.

Tout d'abord, regardons l'aspect théorique. Vous avez besoin de comprendre ce qu'un processus est en théorie pour comprendre la différence entre un processus et un thread et ce qui est partagé entre eux.

Nous avons la suite de l'article 2.2.2 Le Classique Modèle de Thread dans les Systèmes d'Exploitation Modernes 3e par Tanenbaum:

Le modèle de processus est basé sur deux concepts: la ressource le regroupement et l'exécution. Il est parfois utile de les séparer; c'est là que les threads sont en....

Il continue:

Une façon de regarder un processus, c'est que c'est une façon de groupe de ressources liées à l'ensemble. Un processus a un espace d'adressage contenant le programme de texte et de données, ainsi que d'autres ressources. Ces des ressources peuvent inclure les fichiers ouverts, les processus enfants, dans l'attente d'alarmes, les gestionnaires de signaux, de la comptabilité, de l'information, et plus encore. En les mettant ensemble sous la forme d'un processus, ils peuvent être gérés plus facilement. L'autre concept, un processus est un thread d'exécution, généralement raccourcir à juste thread. Le thread a un compteur de programme, qui maintient la trace de l'instruction à exécuter suivant. Il a les registres, qui tenir son travail actuel variables. Il a une pile qui contient le l'historique d'exécution, avec une image pour chaque procédure appelée mais non encore de retour. Bien qu'un thread doit s'exécuter dans un certain processus, la fil et ses processus sont des concepts différents, et peuvent être traités séparément. Les processus sont utilisés pour regrouper des ressources; les fils sont les entités dont l'exécution est programmée sur le CPU.

En outre, il fournit le tableau suivant:

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

Le ci-dessus est ce que vous avez besoin pour les threads de travail. Comme d'autres l'ont souligné, les choses comme les segments d'OS à charge de la mise en œuvre de détails.

30voto

Alex Budovski Points 8932

Dire à l'enquêteur qu'il dépend entièrement de la mise en œuvre de l'OS.

Windows x86 par exemple. Il y a seulement 2 segments [1], le Code et les Données. Et ils sont mappés à l'ensemble de 2 GO (linéaire, utilisateur) de l'espace d'adresse. Base=0, Limit=2 GO. Ils aurait fait un x86 mais ne permet pas un segment à la fois en Lecture/Écriture et d'Exécution. Donc, ils ont fait deux, et ensemble CS à point pour le code descripteur, et le reste (DS, ES, SS, etc) au point à l'autre [2]. Mais deux points de la même chose!

La personne que vous interviewer avait fait un postulat caché qu'il/elle n'avait pas d'état, et c'est un truc stupide pour tirer.

Donc en ce qui concerne

Q. Alors, dites-moi quel segment fil partager?

Les segments sont pas à la question, au moins sur Windows. Threads partagent l'ensemble de l'espace d'adressage. Il est à seulement 1 segment de pile, SS, et il indique exactement les mêmes choses que les DS, ES, et CS n' [2]. I. e. l'ensemble sanglante de l'espace utilisateur. 0-2 GO. Bien sûr, cela ne signifie pas que les threads ont seulement 1 pile. Naturellement, chacun a sa propre pile, mais x86 segments ne sont pas utilisés à cette fin.

Peut-être *nix fait quelque chose de différent. Qui sait. La prémisse de la question est basée sur a été brisé.


  1. Au moins pour l'utilisateur de l'espace.
  2. D' ntsd notepad: cs=001b ss=0023 ds=0023 es=0023

16voto

Kevin Peterson Points 4456

Threads partagent le code et les segments de données et le tas, mais ils ne partagent pas la pile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X