Wodurch wird bestimmt, ob eine ausführbare Datei gleichzeitig in verschiedenen unabhängigen Prozessen ausgeführt werden kann?

Wodurch wird bestimmt, ob eine ausführbare Datei gleichzeitig in verschiedenen unabhängigen Prozessen ausgeführt werden kann?

Ich habe geposteteine Fragedarüber, wie man eine ausführbare Datei (einen PDF-Viewer) unter Wine unabhängig in mehreren Prozessen ausführt (unabhängig bedeutet, dass keine Kommunikation zwischen ihnen stattfindet, es handelt sich nicht um paralleles Rechnen). Ich habe gehört, dass der PDF-Editor (eine erweiterte Version des Viewers) einiger Unternehmen das nicht kann.

Fragen

  • Daher frage ich mich, was dazu führt, dass eine ausführbare Datei unabhängig in mehreren Prozessen ausgeführt werden kann oder nicht.
  • Wird es vom Programm selbst oder von einigen Bibliotheken implementiert?
  • Kann das Betriebssystem das nicht möglich machen?

Antwort1

Dies wird mit ziemlicher Sicherheit vom Programm selbst implementiert und kann vom Betriebssystem wahrscheinlich nur für die rudimentärsten Programme erzwungen werden.

Wenn Sie jedoch die Art und Weise kennen, nach der das Programm entscheidet, dass es bereits ausgeführt wird, und Sie diese Art und Weise beeinflussen können, können Sie eine ausführbare Datei tatsächlich dazu bringen, einen neuen Prozess zu starten (oder nicht).

Einige Anwendungen machen dies besonders einfach, wie z. B. Emacs. Die Standardmethode zum Ausführen von Emacs besteht darin, bei jedem Aufruf einen neuen Prozess zu starten. Sie können Emacs aber auch explizit im Servermodus ausführen und dann emacsclientexplizit ausführen, um dem vorhandenen Server mitzuteilen, dass er eine neue Datei besuchen soll.

Als Gegenbeispiel bietet Firefox eine Befehlszeilenoption -no-remote, die den Start eines neuen Prozesses erzwingt, während die Standardeinstellung darin besteht, wenn möglich mit einem bereits laufenden Prozess zu interagieren.

Viele einfache selbst entwickelte Anwendungen prüfen durch eine einfache Abfrage, ob bereits eine andere Version von ihnen ausgeführt wird ps. Dies kann auf verschiedene Weise umgangen werden. Das Problem bei industrietauglicher Software besteht darin, dass der Benutzer fast nie weiß, wie eine bestimmte Anwendung entscheidet, ob sie bereits verwendet wird oder nicht. Selbst unter Unix, wo Sie alle offenen Dateien überprüfen können, mit denen eine ausführbare Datei interagiert, gibt es keine Garantie dafür, dass Sie herausfinden können, welche (wenn überhaupt) für die Aufzeichnung der Tatsache verantwortlich ist, dass die Anwendung ausgeführt wird.

Antwort2

Ein Prozess ist eine Instanz eines Programms. Ein Programm kann mehrfach instanziiert werden, d. h. es können mehrere Prozesse mit demselben geladenen ausführbaren Code erstellt werden.Ich möchte eine Zeile zitieren ausDen Linux-Kernel verstehenvon Daniel P. Bovet und Marco Cesati:

Es ist wichtig, Programme von Prozessen zu unterscheiden; mehrere Prozesse können dasselbe Programm ausführengleichzeitig, während derselbe Prozess mehrere Programme ausführen kannder Reihe nach.

Im Grunde bedeutet dies, dass ein ProgrammlaufenIn mehreren Fällen kann eine einzelne Instanz nur einen ausführbaren Code gleichzeitig laden. Von dort aus können wir also sagen, dassNichtsverhindert, dass ein Programm in mehreren Instanzen ausgeführt wird, da es absolut keinen Grund gibt, dies zu verbieten. Natürlich teilen diese Prozesse nichts außer ihrem Ausführungscode. Speicherseiten, Dateideskriptoren (die identische Dateien betreffen können) usw. sind von einem Prozess zum anderen völlig unabhängig.

Ein weiterer Punkt erscheint mir wichtig, wenn es um Unix-ähnliche Systeme geht (gleiches Buch):

Unix-ähnliche Betriebssysteme übernehmenein Prozess-/Kernelmodell.Jeder Prozess hat die Illusion, dass er der einzige Prozess auf der Maschine ist, und es hat exklusiven Zugriff auf die Dienste des Betriebssystems.

Dies ist tatsächlich der Grund, warum Unix-Systeme Multiprocessing/Multiprogramming betreiben, oder zumindest ist dies die Strategie, auf der diese Funktion basiert. Aus genau diesem Grund gibt es für einen Prozess keine Möglichkeit,wissendass ein anderer Prozess, der genau denselben Code ausführt, wartet oder auf einer anderen CPU arbeitet.

Jeder Prozess weiß jedoch eines: Das System wird vom Kernel ausgeführt und die Dienste des Kernels stehen dem Prozess während der gesamten Zeit zur Verfügung, in der er auf einer CPU arbeitet. Dank dessen ist es einem Prozess möglich,Abfrageder Kernel über andere Prozesse, die als Instanzen derselben ausführbaren Datei laufen. Die erste Lösung, die mir einfällt, ist das Lesen des /procvirtuellen Dateisystems. Dieses FS fungiert als Schnittstelle zwischen dem Benutzer/der Anwendung und dem Kernel (da diese Dateien Kernelstrukturen und -daten darstellen). In diesem Dateisystem wird jedem Prozess ein Verzeichnis zugewiesen (benannt nach seiner PID), und in diesem Verzeichnis finden Sie einen Link namens exe. Hier ist beispielsweise bashdas Verzeichnis meines Prozesses, PID 22343:

lrwxrwxrwx /proc/22343/exe -> /bin/bash*

Wenn Sie jetzt das Dateisystem durchsuchen, können Sie Prozesse finden, die denselben ausführbaren Code ausführen, d. h. Prozesse, deren Link exeauf dieselbe ausführbare Datei verweist.

Da die Implementierung jedoch nicht auf allen Unix-Systemen /procgleich ist, versuchen Entwickler, eine portablere Lösung zu verwenden, die auf etwas basiert, das praktisch alle Unix-Systeme verstehen: normale Dateien. Dafür .pidsind Dateien normalerweise da.

Meistens finden Sie diese Dateien im /run. Beispiel:

-rw-r--r-- /run/acpid.pid
-rw-r--r-- /run/atd.pid
-rw-r--r-- /run/crond.pid

Diese Dateien werden von der Anwendung, zu der sie gehören, erstellt und dienen als Marker dafür, ob eine Instanz eines Programms ausgeführt wird oder nicht. Normalerweise besteht der Inhalt dieser Datei einfach aus der PID des laufenden Prozesses. In diesem Fall läuft bei mir ein acpidProzess mit der PID 1503, und genau das steht in der PID-Datei.

Da nun alle Prozesse desselben Programms denselben Ausführungscode verwenden, teilen sie sich auch ihre Konstanten (zumindest ihre Werte). Wenn also jede Instanz weiß, wo sie nach der PID-Datei suchen muss, ist die Programmierung eines Einzelinstanzprogramms recht einfach:

if (the pid file exists) then
    send a signal to the running process or just bring it on the foreground
    exit since the work is going to be handled by the already-running process
else
    actually start the program, the first instance
endif

Die Verwendung von Signalen im ersten Fall ist das Verhalten, das ich am häufigsten gesehen habe. Wenn Ihre Anwendung jedoch anspruchsvollere IPC (Sockets, Nachrichtenwarteschlangen usw.) verwendet, können Sie diese verwenden, um sie darüber zu informieren, dass der Benutzer etwas angefordert hat, das sie tun muss.

verwandte Informationen