Mir wurde heute im Vorstellungsgespräch eine Frage gestellt. Zuerst wurde gefragt, wie man die Synchronisierung zwischen Threads. Dann fragten sie, wie man Synchronisation zwischen Prozessen ermöglicht, weil ich ihnen gesagt habe, dass die Variablen innerhalb eines Prozesses nicht mit anderen Prozessen geteilt werden können, also baten sie mich zu erklären, wie zwei Prozesse miteinander kommunizieren können und wie man Synchronisation und wo die gemeinsame Variable deklariert werden soll? Jetzt ist das Gespräch beendet, aber ich möchte die Antwort wissen, kann mir das jemand erklären?Danke.
Antworten
Zu viele Anzeigen?Ich denke, dass der/die Interviewer vielleicht nicht die richtige Terminologie verwenden. Ein Prozess läuft in seinem eigenen Bereich, und wie bereits in anderen Antworten erwähnt wurde, müssen Sie betriebssystemspezifische Mechanismen verwenden, um zwischen den Prozessen zu kommunizieren. Dies wird als IPC (Inter-Process Communication) bezeichnet.
Die Verwendung von Sockets ist eine gängige Praxis, kann aber je nach Anwendung sehr ineffizient sein. Wenn Sie jedoch mit reinem Java arbeiten, kann dies die einzige Option sein, da Sockets universell unterstützt werden.
Gemeinsamer Speicher ist eine weitere Technik, die jedoch betriebssystemspezifisch ist und betriebssystemspezifische Aufrufe erfordert. Für den Zugriff auf Shared-Memory-Dienste müssten Sie für eine Java-Anwendung etwas wie JNI verwenden. Der Zugriff auf den gemeinsamen Speicher ist nicht synchronisiert, so dass Sie wahrscheinlich Semaphore verwenden müssen, um den Zugriff zwischen mehreren Prozessen zu synchronisieren.
Unix-ähnliche Systeme bieten mehrere IPC-Mechanismen, und welcher davon verwendet wird, hängt von der Art Ihrer Anwendung ab. Gemeinsam genutzter Speicher kann eine begrenzte Ressource sein, so dass dies möglicherweise nicht die beste Methode ist. Wenn Sie nach diesem Thema googeln, erhalten Sie zahlreiche Treffer mit nützlichen Informationen zu den technischen Details.
Ein Prozess ist eine Sammlung von virtuellem Speicherplatz, Code, Daten und Systemressourcen. Ein Thread ist Code, der innerhalb eines Prozesses seriell ausgeführt werden soll. Ein Prozessor führt Threads und keine Prozesse aus, d. h. jede Anwendung hat mindestens einen Prozess, und ein Prozess hat immer mindestens einen Ausführungs-Thread, den so genannten primären Thread. Ein Prozess kann zusätzlich zum primären Thread mehrere Threads haben. Vor der Einführung mehrerer Ausführungsthreads waren alle Anwendungen so konzipiert, dass sie auf einem einzigen Ausführungsthread liefen.
Wenn ein Thread mit der Ausführung beginnt, läuft er weiter, bis er beendet oder von einem Thread mit höherer Priorität (durch eine Benutzeraktion oder den Thread-Scheduler des Kernels) unterbrochen wird. Jeder Thread kann separate Codeabschnitte ausführen, oder mehrere Threads können denselben Codeabschnitt ausführen. Threads, die denselben Codeblock ausführen, führen getrennte Stacks. Jeder Thread in einem Prozess teilt sich die globalen Variablen und Ressourcen des Prozesses.
Um zwischen zwei Prozessen zu kommunizieren, können Sie einen ServerSocket und Socket verwenden, um die Prozesssynchronisation zu verwalten. Sie würden sich an einen bestimmten Port binden (Sperre erwerben) und wenn ein Prozess bereits gebunden ist, können Sie sich mit dem Socket verbinden (blockieren) und warten, bis der Server-Socket geschlossen wird.
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();
}
Ich bin mir nicht sicher, ob dies wirklich die beste Methode ist, aber ich denke, es ist eine Überlegung wert.
Synchronisierung ist nur für Threads, es funktioniert nicht für Prozesse in Java. Es gibt keinen Nutzen, wenn sie prozessübergreifend arbeiten, da die Prozesse keinen gemeinsamen Status haben, der synchronisiert werden müsste. Eine Variable in einem Prozess hat nicht die gleichen Daten wie eine Variable in einem anderen Prozess.
Aus der Sicht des Systems wird ein Thread durch seine " estado " und die " Befehlszeiger ".
Der Befehlszeiger ( eip ) enthält die Adresse des nächsten auszuführenden Befehls.
Ein Thema " estado " kann sein: die Register (eax, ebx,etc), die Signale le geöffnete Dateien le Code le Stapel le Daten die von diesem Thread verwaltet werden (Variablen, Arrays usw.) und auch die Haufen .
A Prozess ist eine Gruppe von Threads, die sich einen Teil ihrer " estado ": es könnte die Code le Daten le Haufen . Ich hoffe, ich beantworte deine Frage ;)
EDIT: Die Prozesse können über die IPCs (Inter process communications) kommunizieren. Es gibt 3 Mechanismen: gemeinsamer Speicher , Nachrichtenwarteschlange . Die Synchronisation zwischen den Prozessen kann mit der Funktion Semaphern
Die Synchronisierung von Threads kann mit Mutexe ( pthread_mutex_lock, pthread_mutex_unlock, usw. )
- See previous answers
- Weitere Antworten anzeigen