8
votes

Différence entre le processus et le fil

On m'a posé une question lors d'une interview aujourd'hui. Ils ont d'abord demandé comment fournir la synchronisation entre le fil. Ensuite, ils ont demandé comment fournir la synchronisation entre le processus, car je leur ai dit, la variable à l'intérieur de chaque processus ne peut pas être partagée avec d'autres processus, ils m'ont donc demandé d'expliquer comment deux processus peuvent communiquer entre eux et comment fournir la synchronisation. entre eux, et où déclarer la variable partagée? Maintenant, l'entretien est terminé, mais je veux connaître la réponse, quelqu'un peut-il m'expliquer? Merci.


5 commentaires

Une attente partagée, telle qu'un mutex nommé ou un sémaphore, serait de synchroniser des appels d'accueillir un processus.


La vraie communication inter-processus est très plate-forme dépendante. Habituellement, vous esquivez qu'en communiquant des prises réseau entre les processus. Je serais personnellement tenté de donner à la gribade quelque peu, mais très correcte d'une réponse de l'entreprise "Acheter une licence de terre cuite". :)


OK, par exemple, mutex ou sémaphore, cela signifie donc que nous avons besoin d'une variable de sémaphore, de sorte que ces processus peuvent y accéder et le vérifier. Alors, où le déclarer? à l'intérieur de chaque processus?


Soyez prudent: le mutex croisé et les sémaphores ne sont pas pris en charge directement en Java. La classe Java SEMAPHORE est un outil pure dans le processus. Plus généralement, la plupart des systèmes d'exploitation fournissent un mécanisme de sémaphore de synchronisation croisée, mais ce n'est pas facilement accessible depuis le code Java.


Je pense qu'un point important de cette question est la question de la question concernant Java en particulier ou sur des mécanismes plus généraux?


10 Réponses :


1
votes

La synchronisation est destinée aux filets que cela ne fonctionnera pas pour des processus en Java. Il n'y a pas d'utilité d'entre eux qui travaillent dans des processus, car les processus ne partagent aucun État qui devraient être synchronisés. Une variable dans un processus n'aura pas les mêmes données qu'une variable dans l'autre processus


1 commentaires

Oui, je comprends votre réponse, les processus ne partagent aucun État, mais je me demande si deux processus accéderont à la même mémoire partagée? Dans ce cas, envisagerons-nous la synchronisation?



1
votes

à partir d'un point de vue du système, un thread est défini par son " état " et le pointeur d'instructions " ".

Le pointeur d'instructions ( EIP ) contient l'adresse de la prochaine instruction à exécuter.

Un fil " état " peut être: les registres (EAX, EBX, etc.), les signaux , le ouvert Fichiers , le code , la pile la pile , les données gérées gérées par ce fil (variables, tableaux, etc.) et aussi le < fort> tas .

un processus est un groupe de fils qui partagent une partie de leur " état ": ce pourrait être le code , le Données , le tas . J'espère que je réponds à votre question;)

EDIT: Les processus peuvent communiquer via les IPCS (communications entre traitements). Il y a 3 mécanismes: Mémoire partagée , File d'attente de messages . La synchronisation entre les processus peut-être faites avec les sémaphors

threads Synchronisation peut-on faire avec mutexes ( pthread_mutex_lock, pthread_mutex_unlock, etc )


5 commentaires

Oui merci. Mais ma question est de savoir comment deux processus peuvent communiquer entre eux? Et la situation existe-t-elle: deux processus accèdent à une mémoire de part? Si oui, comment fournir la synchronisation?


Je leur explique le problème du producteur et du consommateur, à l'aide de la serrure, du sémaphore, mais ils ont demandé comment fournir la synchronisation entre les processus, j'ai répondu qu'ils déclarent une variable commune, elles ont donc demandé depuis que la variable de chaque processus ne peut pas être partagée avec d'autres. déclarer la variable commune?


Notez que vos noms de registre (EIP, EAX, EBX) sont dépendants du système (X86 dans votre cas), tandis que le reste de votre réponse est assez universel.


Ouais je sais, mais c'était pour un exemple but seulement.


@Ratzip Une chose que j'ai faite auparavant est de mettre en œuvre une sychronisation entre SMPS en FPGA. Je pense que c'est très similiaire à votre problème. Le but est d'utiliser un mutex «matériel» accessible par les deux processeurs. Il y a un grand noyau IP de Mutex pouvant être créé dans SOPC Builder.



2
votes

Pour communiquer entre deux processus, je suppose que vous pouvez utiliser un serversion et une prise pour gérer la synchronisation des processus. Vous liez à un port spécifique (Acquérir le verrou) et si un processus est déjà lié, vous pouvez vous connecter au socket (bloc) et attendre que la prise de serveur soit fermée.

private static int KNOWN_PORT = 11000;//arbitrary valid port
private ServerSocket socket;
public void acquireProcessLock(){
   socket = new ServetSocket(KNOWN_PORT);
   INetAddress localhostInetAddres = ...
   try{
      socket.bind(localhostInetAddres );
   }catch(IOException failed){
      try{
       Socket socket = new Socket(localhostInetAddres ,KNOWN_PORT);
       socket.getInputStream().read();//block
      }catch(IOException ex){ acquireProcessLock(); } //other process invoked releaseProcessLock()
   }
}
public void releaseProcessLock(){
  socket.close();
}


5 commentaires

Je leur ai également répondu à l'aide de la prise pour communiquer entre elles. Mais ils ne sont pas satisfaits. Et ils répètent la question à nouveau et encore, alors toute autre pensée?


Méfiez-vous, cependant, que OS-ES interdit parfois la seconde liaison au même port à partir de différents processus ou utilisateur.


@Piotr merci pour ça. Je me suis réuni un peu rapidement mais je suis sûr qu'il y aurait des problèmes spécifiques au système d'exploitation. @Ratzip Je suppose que vous voulez dire deux JVM distincts fonctionnant sur deux processus distincts. Si tel est le cas, ils partageraient la même mémoire (évidemment virtuelle) mais que l'un ni l'autre n'a des pointeurs à une mémoire Anothers. Vous ne pouvez donc pas synchroniser des objets sous des processus distincts. Étaient-ils à la recherche de quelque chose de spécifique quand ils ont dit que vous ne pouvez pas utiliser des prises et io?


Ils ont demandé comment deux processus peuvent communiquer entre eux et être synchronisé. Ceci est la question. Par peut-être que deux processus peuvent être synchronisés le sens du fil. Donc, je leur ai dit qu'un processus attend une autre valeur de mise à une variable commune, puis il peut le chercher. Ils ont demandé où déclarer la variable commune car la variable ne peut pas être partagée par des processus?


Ils ont peut-être cherché quelque chose de vraiment spécifique, mais de manière générale. Deux processus ne peuvent pas se synchroniser sur un morceau de mémoire partagé que vous verriez dans le code Java comme synchroniser (MyObject) {...}. Deux procédés ne connaissent pas le tas de ces personnes et faire référence à la mémoire virtuelle.



6
votes

Je pense que l'intervieweur (s) peut ne pas utiliser la terminologie appropriée. Un processus fonctionne dans son propre espace et a été mentionné dans des réponses séparées, vous devez utiliser des mécanismes spécifiques au système d'exploitation pour communiquer entre le processus. Ceci s'appelle IPC pour la communication inter-processus.

L'utilisation de sockets est une pratique courante, mais peut être grossièrement inefficace, en fonction de votre application. Mais si vous travaillez avec pure Java, cela peut être la seule option car les sockets sont universellement pris en charge.

La mémoire partagée est une autre technique, mais qui est spécifique au système d'exploitation et nécessite des appels spécifiques au système d'exploitation. Vous devriez utiliser quelque chose comme JNI pour une application Java pour accéder aux services de mémoire partagée. L'accès à la mémoire partagée n'est pas synchronisé, vous devrez donc probablement utiliser des sémaphomes pour synchroniser l'accès entre plusieurs processus.

Systèmes de type UNIX fournit plusieurs Mechansims IPC et lequel à utiliser dépend de la nature de votre application. La mémoire partagée peut être une ressource limitée, il peut donc ne pas être la meilleure méthode. Googling sur ces sujets fournit de nombreux hits offrant des informations utiles sur les détails techniques.


0 commentaires

0
votes

Vérifiez Cluster à terre cuite ou DSO Clustering Documentation Pour voir comment ce problème peut être résolu (manipulation de bytecode, maintenance la sémantique de la spécification de langue Java sur Putfield / getfield-Niveau, etc.)


0 commentaires

-2
votes

Je suppose que les processus peuvent communiquer via une tierce partie: un fichier ou une base de données ...


0 commentaires

3
votes

Un processus est une collection d'espaces de mémoire virtuelle, de code, de données et de ressources système. Un fil est le code qui doit être exécuté en série dans un processus. Un processeur exécute des threads, non des processus, chaque application dispose d'au moins un processus et qu'un processus a toujours au moins un fil d'exécution, connu sous le nom de fil principal. Un processus peut avoir plusieurs threads en plus du fil principal. Avant l'introduction de plusieurs threads d'exécution, les applications ont toutes été conçues pour fonctionner sur un seul fil d'exécution.

Lorsqu'un thread commence à exécuter, il continue jusqu'à ce qu'il soit tué ou jusqu'à ce qu'il soit interrompu par un fil avec une priorité plus élevée (par une action de l'utilisateur ou le planificateur de fil du noyau). Chaque thread peut exécuter des sections de code distinctes ou plusieurs threads peuvent exécuter la même section du code. Les threads exécutant le même bloc de code maintiennent des piles séparées. Chaque thread dans un processus partage les variables et les ressources mondiales du processus.


0 commentaires

0
votes

La réponse la plus simple est le processus désigne un programme sous exécution et un programme n'est rien que de la collecte de fonctions. où le thread est la partie du processus car tous les threads sont des fonctions. D'une autre manière, nous pouvons dire qu'un processus peut avoir plusieurs threads. Toujours d'OS attribue la mémoire d'un procédé et que la mémoire est désroguée parmi les threads de ce processus.Os ne répartit pas la mémoire pour les threads.


0 commentaires

-1
votes

Process:

  • Un processus n'est qu'un programme sous exécution.
  • Chaque processus a sa propre espace d'adresses mémoire.
  • Le processus est utilisé pour les tâches lourdes, c'est-à-dire une exécution essentiellement des applications.
  • Coût de la communication entre le processus est élevé.
  • La commutation d'un processus à un autre nécessite un certain temps pour sauver et charger des registres, des cartes mémoire, etc.
  • processus est une approche du système d'exploitation.

    threads:

    • Un thread est un sous-processus léger.
    • thread Partagez le même espace d'adressage.
    • coût de la communication entre le fil est faible.

      REMARQUE: Au moins un processus est requis pour chaque thread.


0 commentaires

0
votes

Dans une phrase, les processus sont conçus plus indépendamment que les fils sont.
Leurs principales différences peuvent être décrites au niveau de la mémoire. Différents processus ne partageent rien les un parmi les autres, du registre, de la mémoire stock à la mémoire du tas, qui les rendent en sécurité sur leurs propres pistes. Cependant, normalement threads sont conçus pour partager une mémoire de tas courante, ce qui fournit une manière plus étroitement connectée pour plusieurs processus informatiques de calcul. Créer un moyen plus efficace d'occuper des ressources de calcul.

E.g. Si je calcule avec 3 processus, je dois les laisser terminer leurs emplois et attendre leurs résultats au niveau du système, au moment de la moyenne, les registres et la mémoire de pile sont toujours repris. Cependant, si je le fais avec 3 threads, alors si le thread 2 termine heureusement son travail plus tôt, car le résultat informé avait déjà été stocké dans le pool de mémoire de tas courante, nous pouvons simplement le tuer sans attendre que d'autres livrent leurs résultats, Et ces ressources libérés des registres et de la mémoire stock peuvent être utilisées à d'autres fins.


0 commentaires