Name und Unbenannter Semaphor

8

Ich versuche, die Ähnlichkeiten und Unterschiede zwischen benannten und unbenannten Semaphoren zu verstehen, also führte meine Google-Suche zu mir dies . Ich hatte jedoch eine Frage zu dem Wortlaut auf der Seite, es heißt:

  • Unbenannte Semaphore können von mehr als einem Prozess verwendet werden
  • Benannte Semaphore sind sharable durch mehrere Prozesse
Machen diese beiden Wörter einen wichtigen Unterschied zwischen diesen beiden Arten von Semaphoren oder sind sie irrelevant?

So weit ist hier, was ich habe:

%Vor%

Das ist alles, was ich aus dieser Definition herauslesen konnte. Ist das alles und sind sie richtig? Oder fehlt mir ein wichtiges Konzept?

    
Richard 30.10.2012, 18:58
quelle

3 Antworten

15

Denken Sie an wer auf den Semaphor zugreifen kann.

Unbenannte Semaphore (die keinen Namen oder Handle haben, um sie zu finden) müssen in einem bereits bestehenden, vereinbarten Speicherort vorhanden sein. Normalerweise ist dies (1) geteilter Speicher (von Kindern nach fork geerbt) im Fall von untergeordneten Prozessen; oder (2) Shared Memory, globale Variable oder der Heap in dem Fall, in dem sie zwischen Threads eines einzelnen Prozesses geteilt werden. Das Wesentliche hierbei ist, dass der Code in Eltern, Kind oder Threads bereits die Adresse des Semaphors kennt.

Benannte Semaphore sind für nicht verwandte Prozesse notwendig. Zum Beispiel könnten ein Produzent und ein Verbraucher von zwei verschiedenen Entwicklern geschrieben werden und als völlig unabhängige Prozesse laufen. Aber sie müssen einige Ressourcen teilen, die durch einen Semaphor geschützt werden müssen. Der benannte Semaphor gibt ihnen einen Weg zum Semaphor.

In Wirklichkeit können Sie einen benannten Semaphor in allen Szenarien verwenden, aber sie kommen mit etwas mehr Gepäck, weil Sie mit den Pfaden und Berechtigungen umgehen müssen und solche, die nicht notwendig sind, wenn die Programme verwandt sind und bereits wissen, wie man auf einen unbenannten zugreift Semaphor. Es ist zum Beispiel ein wenig albern, einen benannten Semaphor zu verwenden, um eine Ressource zwischen Threads freizugeben. Die Threads haben bereits Zugriff auf denselben Speicher, in dem sich ein unbenannter Semaphor befinden könnte.

    
Duck 30.10.2012, 22:06
quelle
5

Die angenommene Antwort ist falsch (genau wie die andere von @electron). Unbenannte POSIX-Semaphore können von nicht verwandten Prozessen verwendet werden. Sie müssen nur die Datenstruktur im Shared Memory speichern, auf die die relevanten Prozesse zugreifen können, und sie mit dem Shareable-Flag auf 1 setzen, wie hier gezeigt (schamlos kopiert von Ссылка ):

%Vor%

Ein anderer Prozess, der diesen geteilten Speicher in seinen Adressraum abbildet, kann auf denselben Semaphor zugreifen und mit dem ursprünglichen Prozess synchronisieren. Siehe auch die POSIX-Spezifikation von sem_init () und deren Linux-Manpage .

    
stefanct 17.11.2015 01:50
quelle
-1

Benannter Semaphor hat eine actual name in file system und kann shared durch mehrere nicht verwandte Prozesse sein.

Unbenannte Semaphore können nur von threads verwendet werden, die zum gleichen Prozess gehören.

Semaphore werden mit der Funktion

erstellt %Vor%

wo

ptr_semaphore : ein Zeiger auf Semaphor

flag : Eine Flagge, die den Grad der Freigabe angibt

initial_value : der Anfangswert der Semaphore

Wenn Sie flag=0 an sem_init() übergeben, dann kann Semaphor wird nur von Threads freigegeben, die zu dem Prozess gehören, der den Semaphor erstellt hat. Dadurch wird unbemannter Semaphor erstellt.

%Vor%

Wenn Sie einen Wert ungleich Null übergeben, wird allow andere Prozesse auch auf den Semaphor zugreifen . Daher wird Semaphor genannt.

%Vor%     
Prateek Joshi 28.07.2015 12:52
quelle

Tags und Links