www.wikidata.de-de.nina.az
Ein Semaphor von altgriechisch sῆma sema deutsch Zeichen und ferein pherein tragen also etwa Signalgeber ist eine Datenstruktur die aus einer Ganzzahl und den atomaren Nutzungsoperationen Reservieren Probieren und Freigeben besteht Sie eignet sich insbesondere zur Verwaltung beschrankter zahlbarer Ressourcen auf die mehrere Prozesse oder Threads zugreifen sollen wie etwa Erzeuger und Verbraucher sowie zur Koordination asynchroner Ablaufe Im Gegensatz zu einem Lock bzw einem Mutex mussen die Aktivitatstrager die reservieren und freigeben nicht identisch sein Inhaltsverzeichnis 1 Funktionsweise 2 Namensherkunft 3 Wechselwirkungen parallel ablaufender Prozesse 4 Losung von Dijkstra 5 Anwendungsbeispiele 5 1 Einsatz in Konkurrenzsituationen 5 2 Einsatz in Kooperationssituationen 5 3 Passing the Baton Pattern 6 Implementierung 7 Verwandte Themen 8 Literatur 9 Weblinks 10 EinzelnachweiseFunktionsweise BearbeitenMeist wird die Ganzzahl Zahler beim Start des Semaphors mit dem Zahlenwert der maximal verfugbaren Ressourcen initialisiert bzw der maximalen Zahl der Prozesse die gleichzeitig die Ressource nutzen konnen Ein Prozess der auf die Ressource zugreifen will muss vorher die Operation Reservieren Probieren aufrufen und danach wenn er die Ressource nicht mehr benotigt die Operation Freigeben Bei jeder Reservierung wird der Zahler um 1 heruntergezahlt bei Freigabe wird er wieder um 1 erhoht Der Zahler darf nicht unter 0 fallen Wenn eine Reservierung bei Zahlerstand 0 erfolgt wartet der reservierende Prozess bis ein anderer Prozess Ressourcen freigegeben hat Es gibt auch Implementierungen die ins Negative zahlen Damit kann angezeigt werden wie viele Prozesse auf eine Freigabe warten Semaphore konnen bei der Programmierung zur Prozesssynchronisation eingesetzt werden also zur Losung von Aufgaben bei denen die parallele Ausfuhrung mehrerer Prozesse Threads eine zeitliche Abstimmung der Ausfuhrungen erfordert Sie dienen im Allgemeinen dazu bei einer beschrankten Anzahl von Ressourcen eine Reihenfolge herzustellen in der viele Threads sich diese knappen Elemente teilen z B Ressource CPU Kern Anzahl 4 Dies kann auch zur Kapselung von Zugriffen auf gemeinsame Daten verwendet werden Ressource Zugriffsrecht auf die Daten Anzahl immer nur einer gleichzeitig Auch zur Kommunikation zwischen Threads konnen Semaphore verwendet werden Sie dienen dann meist als Zahler fur verfugbare Informationspakete Hierbei wird der Semaphor mit 0 Pakete verfugbar gestartet und dann hochgezahlt und wieder bis auf 0 herunter Namensherkunft Bearbeiten nbsp Verlassenes Eisenbahnsignal Semaphor Das Wort Semaphor geht auf die Formsignale mechanischer Eisenbahnsignale zuruck 1 Die dort verwendeten Semaphore zeigen an ob ein Zug eine Ressource belegt also ob ein Gleisabschnitt befahren werden darf oder nicht Wechselwirkungen parallel ablaufender Prozesse BearbeitenBei der parallelen oder zeitlich verzahnten Ausfuhrung von Prozessen treten implizite oder explizite Wechselwirkungen auf Bei impliziten Wechselwirkungen ist einem Prozess nicht bewusst dass durch die Ausfuhrung von Aktionen ein anderer Prozess beeinflusst wird Dies ist z B dann der Fall wenn ein Prozess einen Systemdienst aufruft den das Betriebssystem nicht sofort vollstandig bearbeiten kann weil andere Prozesse die erforderlichen Betriebsmittel belegt haben Der Prozess kann erst dann seine Aktionen weiter fortsetzen wenn der Systemdienst ausgefuhrt worden ist Hier wird die Prozesswechselwirkung als blockierender Funktionsaufruf sichtbar Spezielle Vorkehrungen gegen eine Blockierung aufgrund impliziter Wechselwirkungen muss und kann ein Prozess nicht treffen Explizite Wechselwirkungen zwischen Prozessen sind Konkurrenz Prozesse stehen in Konkurrenz zueinander wenn sie gleichzeitig auf ein Betriebsmittel z B Speicherstruktur Verbindung Gerat zugreifen das nur in beschrankter Anzahl zur Verfugung steht und bei dem die Nutzung eines Exemplars nur exklusiv durch einen Prozess moglich ist da es andernfalls zu fehlerhaften Ergebnissen oder inkonsistenten Zustanden kommt d h wenn es kritische Abschnitte in den Programmen der Prozesse gibt Kooperation Prozesse kooperieren wenn sie ihre Aktionen bewusst aufeinander abstimmen z B weil sie in einer Auftraggeber Auftragnehmerbeziehung stehen Sowohl das Reservieren als auch das Freigeben mussen atomare Operationen sein Kann eine Reservierung nicht befriedigt werden so kann sie einfach blockieren Erlangung der Ressource via Race Condition unter den Wartenden der Semaphor eine Warteschlange fuhren i A blockierend oder ablehnen nicht blockierend Haufig ist vom Betriebsmittel nur ein Exemplar vorhanden sog wechselseitiger Ausschluss der Semaphor bewirkt dann eine Abstimmung der zeitlichen Ausfuhrung der Prozessaktionen Im Fall einer Konkurrenzsituation wird durch eine irgendwie gestaltete Sequentialisierung der Ausfuhrung der kritischen Abschnitte erreicht dass das Betriebsmittel nicht von mehreren Prozessen beliebig verandernd benutzt wird Im Fall einer Kooperationssituation wird ebenfalls durch eine der Situation entsprechende Sequentialisierung erreicht dass die Zusammenarbeit der Prozesse gegeben ist z B dass ein Auftragnehmer nicht schon versucht anzufangen etwas zu bearbeiten obwohl der Auftraggeber noch keinen Auftrag erteilt hat Losung von Dijkstra BearbeitenSemaphore als Mechanismus fur die Prozesssynchronisation wurden von Edsger W Dijkstra konzipiert und 1965 in seinem Artikel Cooperating sequential processes vorgestellt Ein Semaphor ist eine Datenstruktur mit einer Initialisierungsoperation und zwei Nutzungsoperationen Die Datenstruktur besteht aus einem Zahler und einer Warteschlange fur die Aufnahme blockierter Prozesse hier ein Beispiel in C typedef struct semaphor int zaehler Queue queue Warteschlange Semaphor Zahler sowie Warteschlange sind geschutzt und konnen nur uber die Semaphoroperationen verandert werden Die Wirkung der Nutzungsoperation kann wie folgt zusammenfassend beschrieben werden Semaphore regeln Wechselwirkungssituationen von Prozessen durch Zahlen Semaphore realisieren ein passives Warten der Prozesse wenn eine Weiterausfuhrung nicht gestattet werden kannMit der Initialisierungsoperation wird der Zahler auf einen nicht negativen Wert 0 und die Warteschlange i d R auf leer gesetzt void init Semaphor s int v s gt zaehler v s gt queue gt empty s gt queue Wird ein Semaphor zur Organisation von Konkurrenzsituationen eingesetzt so erfolgt eine Initialisierung mit einem positiven Wert Ein Semaphor fur eine Kooperationssituation wird hingegen mit 0 initialisiert siehe Anwendungsbeispiele Die Nutzungsoperationen wurden von Dijkstra mit P und V bezeichnet Dies sind Initialen niederlandischer Worter bzw Kofferworter fur prolaag probeer te verlagen versuche zu senken und verhoog 2 Weitere verbreitete Erklarungen sind passeer passieren proberen uberprufen 3 und vrijgeven freigeben verhogen erhohen 3 Programmierschnittstellen verwenden mnemonisch deutlichere Bezeichnungen wie wait warten acquire erlangen oder down unten fur die P Operation und signal signalisieren release freigeben post abschicken 4 oder up oben fur die V Operation Bei einem Aufruf der P Operation wird der Zahler dekrementiert Ist der Zahler danach grosser gleich 0 so setzt der Prozess seine Aktionen fort Ist der Zahler jedoch kleiner als 0 kehrt der Kontrollfluss nicht aus der Operation zuruck Der aufrufende Prozess wird blockiert und in die Warteschlange des Semaphors eingereiht Bei einem Aufruf der V Operation wird der Zahler inkrementiert Es wird ein Prozess aus der Warteschlange entnommen und entblockiert falls die Warteschlange nicht leer ist Der entblockierte Prozess setzt dann seine Aktionen mit denen fort die dem P Aufruf folgen der den Prozess blockierte Die hier erlauterte Funktionsweise der Semaphoroperationen erlaubt eine einfache Ermittlung ob es Prozesse gibt die am Semaphor blockiert sind ist der Semaphorzahler kleiner als 0 so gibt es noch blockierte Prozesse Diese Prozesse riefen die P Operation auf als der Zahler bereits kleiner gleich 0 war Die Uberprufung wird hier zwecks Verdeutlichung der Wirkung der V Operation auf andere Prozesse explizit notiert Konkrete Implementierungen konnen eine Prufung auf nicht leere Warteschlange auch in die Warteschlangenmethode verlagern down void P Semaphor s s gt zaehler s gt zaehler 1 if s gt zaehler lt 0 selbst blockieren s gt queue Blockieren des Prozesses Einreihung in Warteschlange up void V Semaphor s s gt zaehler s gt zaehler 1 if s gt zaehler lt 0 einen entblocken s gt queue Entblockieren eines Prozesses aus der Warteschlange Semaphore deren Zahler aufgrund der Initialisierung und der Verwendung eine 1 als grossten positiven Wert annehmen konnen werden oftmals auch als binare Semaphore bzw Mutex locks bezeichnet 5 Semaphore deren Zahler grossere positive Werte als 1 annehmen konnen werden zahlende Semaphore genannt Beide Operationen mussen unteilbare atomare Aktionen sein Dadurch ist garantiert dass nach dem Aufruf einer Operation eines Semaphors kein anderer Prozess auf den gleichen Semaphor durch einen Operationsaufruf modifizierend zugreifen kann bevor die zuerst aufgerufene Semaphoroperation vollstandig ausgefuhrt worden ist Die Unteilbarkeit ist notwendig um die Synchronisation zu organisieren und Wettlaufsituationen bei Ausfuhrung der Semaphoroperationen durch parallele Prozesse zu vermeiden Die obige Erlauterung der Arbeitsweise ist eine von mehreren moglichen Diese unterscheiden sich durch die Reihenfolge der Prufung auf Blockierung Entblockierung und der Operation Inkrement Dekrement In einigen Darstellungen nimmt der Zahler keine negativen Werte an Der oben beschriebene Zahlerwert ergibt sich indem man vom Tatsachlichen die Lange der Warteschlange subtrahiert In diesem Fall wird die Bezeichnung binarer Semaphor dann offensichtlich Die Wirkung der Operationen auf Prozesse ist jedoch unabhangig von der Art der Realisierung Der obigen Erlauterung wurde wegen einer einfachen Interpretation des Zahlers der Vorzug gegeben Ist der Zahler grosser als 0 so gibt sein Wert an wie viele Prozesse noch ohne Blockierung die P Operation aufrufen konnen Ist der Zahler negativ so gibt sein Absolutwert an wie viele Prozesse die P Operation aufgerufen haben und dabei blockiert wurden Semaphore beheben den Nachteil des aktiven Wartens anderer Synchronisationslosungen wie spezielle Maschinenbefehle oder Spinlocks da ein Prozess blockiert wird bis der Blockadegrund entfallen ist Die Definition lasst offen welcher blockierte Prozess im Rahmen der Ausfuhrung der V Operation der Warteschlange entnommen wird Ein Semaphor der eine echte Warteschlange nach dem Windhundprinzip engl first come first served garantiert wird manchmal als starker Semaphor bezeichnet Ein schwacher Semaphor garantiert hingegen nicht die chronologisch richtige Abarbeitung der Warteschlange So wird z B beim Echtzeitbetrieb das Entblockieren von Prozessen an deren Prioritat statt an deren Blockierungszeitpunkt gebunden Anwendungsbeispiele BearbeitenEinsatz in Konkurrenzsituationen Bearbeiten In einem kritischen Abschnitt ka A verandert Prozess A eine Datenstruktur die der Prozess gemeinsam mit einem Prozess B nutzt Prozess B verandert die Datenstruktur in seinem kritischen Abschnitt ka B Ein Semaphor in Ausschlussfunktion wird eingesetzt um zu erreichen dass sich die Prozesse A und B niemals gleichzeitig in ihren kritischen Abschnitten befinden Hierzu wird der Semaphor mit 1 initialisiert es wird also ein binarer Semaphor eingesetzt Gemeinsam von A und B genutzter Semaphor mutex Initialisierung init mutex 1 Es gibt 1 Ressourcen Exemplar Recht auf Betreten eines kritischen Abschnitts Prozess A Prozess B P mutex P mutex versuche Betreten Recht zu reservieren blockierend ka A ka B V mutex V mutex freigeben des Betreten Rechts Benotigen Prozesse jeweils exklusiv ein Betriebsmittel das nur in beschrankter Anzahl zur Verfugung steht so wird mittels eines zahlenden Semaphors erreicht dass ein Prozess dann blockiert wird wenn alle Betriebsmittel in Benutzung sind Der Semaphor wird mit der Anzahl verfugbarer Betriebsmittel initialisiert Semaphor zur Betriebsmittelverwaltung s available Initialisierung init s available n Prozess P s available Anzeige des Nutzungswunschs warte bis fur mich reserviert wurde Nutzung des Betriebsmittels V s available Anzeige des Nutzungsabschlusses freigeben Einsatz in Kooperationssituationen Bearbeiten Prozess A enthalt einen Programmabschnitt C I in dem eine Datenstruktur initialisiert wird die dann von Prozess B in einem Programmabschnitt C V verarbeitet wird Offensichtlich muss C I unter allen Umstanden vor C V ausgefuhrt werden Es wird ein Semaphor in Signalisierungsfunktion eingesetzt Gemeinsam von A und B genutzter Semaphor s inform Initialisierung init s inform 0 Prozess A Prozess B C I P s inform V s inform C V Prozess B versucht zu reservieren und muss warten bis Prozess A mittels Freigabe s inform auf 1 Datensatz verfugbar hochgezahlt hat Passing the Baton Pattern Bearbeiten Das von Gregory R Andrews vorgeschlagene Passing the Baton Pattern 6 7 8 deutsch Staffelstab Algorithmus 9 ist ein allgemeines Schema zur Losung vieler generischer Programmierprobleme bei denen mehrere nebenlaufige Prozesse um dieselbe Ressource mit komplexen Bedingungssynchronisationen konkurrieren z B Erfullung bestimmter Prioritatskriterien oder Vermeidung von Verhungern Bei einer gemeinsam genutzten Ressource erfordert das Pattern eine private Semaphore priv initialisiert auf 0 fur jeden beteiligten Prozess oder jede Klasse von Prozessen und eine einzige Semaphore mutex fur den gegenseitigen Ausschluss initialisiert auf 1 Der Pseudocode fur jeden Prozess lautet void Prozess int proc id int res id Ressource Erwerben proc id res id lt Die Ressource res id benutzen gt Ressource Freigeben proc id res id Die Funktionen fur das Erwerben und Freigeben der Ressource sind wie folgt aufgebaut void Ressource Erwerben int proc id int res id P mutex if lt die Bedingung fur den Zugriff auf res id ist nicht erfullt fur proc id gt lt erfassen dass proc id fur res id blockiert ist gt V mutex P priv proc id lt erfassen dass proc id fur res id nicht mehr blockiert ist gt lt erfassen dass proc id auf res id zugreift gt Staffelstab Weitergeben proc id res id siehe unten void Ressource Freigeben int proc id int res id P mutex lt erfassen dass proc id auf res id nicht mehr zugreift gt Staffelstab Weitergeben proc id res id siehe unten Beide Operationen verwenden die Funktion Staffelstab Weitergeben void Staffelstab Weitergeben int proc id int res id if lt die Bedingung fur den Zugriff auf res id ist von mindestens einem blockierten Prozess erfullt gt int p lt Wahl eines blockierten Prozesses um ihn zu reaktivieren gt V priv p else V mutex Anmerkungen Das Pattern wird Passing the Baton genannt weil ein Prozess der die Ressource freigibt sowie ein frisch reaktivierter Prozess hochstens einen anderen angehaltenen Prozess aktiviert d h sozusagen den Staffelstab an ihn weitergibt Die mutex Semaphore wird nur dann freigegeben wenn ein Prozess sich selbst blockiert wahrend der Funktion Ressource Erwerben oder wenn es innerhalb der Operation Staffelstab Weitergeben nicht moglich ist einen anderen blockierten Prozess zu reaktivieren Implementierung BearbeitenEine Implementierung der Semaphormechanismen ist konzeptionell im Betriebssystem anzusiedeln da sie eng mit der Prozessverwaltung zusammenarbeiten muss Eine Realisierung der Unteilbarkeit auf Monoprozessorsystemen kann dann z B mittels Unterbrechungssperre erfolgen Im Fall von Multiprozessorsystemen ist eine Klammerung der Anweisungsfolgen der Semaphoroperationen durch Spinlocks erforderlich Eine Realisierung durch das Betriebssystem ermoglicht ferner dass mehrere Prozesse mit ihren eigentlich disjunkten Adressraumen einen Semaphor gemeinsam nutzen konnen Werden Semaphore von einem Thread Paket das im Benutzeradressraum lauft User Level Threads angeboten so gestaltet sich die Realisierung der Unteilbarkeit aufwandiger Sie muss beliebige Unterbrechungen berucksichtigen und hangt davon ab welche Informationen uber User Level Threads im Kern vorliegen Verwandte Themen BearbeitenMutex Oberbegriff fur Verfahren die wechselseitigen Ausschluss von Datenzugriffen ermoglichen Monitor ein programmiersprachliches Konzept zur Prozesssynchronisation Jacketing die Moglichkeit einen blockierenden Systemaufruf zu umgehen Bolt Variable Variante des Semaphors zur flexibleren Realisierung eines Read Write Lock Literatur BearbeitenAndrew S Tanenbaum Moderne Betriebssysteme Pearson Studium IT Dritte aktualisierte Auflage Addison Wesley Verlag 2009 ISBN 978 3 8273 7342 7 S 1248 englisch Originaltitel Modern Operating Systems James H Anderson Yong Jik Kim Ted Herman Shared memory mutual exclusion major research trends since 1986 In Distrib Comput Band 16 Nr 2 3 Springer Verlag September 2003 ISSN 0178 2770 S 75 110 doi 10 1007 s00446 003 0088 6 M Raynal D Beeson Algorithms for mutual exclusion MIT Press Cambridge MA 1986 ISBN 0 262 18119 3 Weblinks BearbeitenImplementierung von Semaphoren in FreeBSD Kernel Implementierung von Semaphoren in FreeBSD API Schnittstellenspezifikation bzw API uber Semaphoren in FreeBSD sem init 3 sem post 3 sem wait 3 sem getvalue 3 sem destroy 3 sem 4 Einzelnachweise Bearbeiten Semaphores Basic Concepts In The Linux Programmer s Guide cs utexas edu E W Dijkstra Archive niederlandisch a b Abraham Silberschatz Peter B Galvin Greg Gagne Operating system concepts 7 Auflage John Wiley amp Sons Hoboken NJ 2005 ISBN 0 471 69466 5 6 5 Semaphores S 200 englisch pubs opengroup org Abraham Silberschatz Peter B Galvin Greg Gagne Operating system concepts 7 Auflage John Wiley amp Sons Hoboken NJ 2005 ISBN 0 471 69466 5 6 5 Semaphores S 201 englisch Gregory R Andrews Foundations of Multithreaded Parallel and Distributed Programming Addison Wesley 1999 englisch Richard H Carver Kuo Chung Thai Modern Multithreading Implementing Testing and Debugging Multithreaded Java and C Pthreads Win32 Programs Wiley 2005 englisch https greenteapress com wp semaphores Christian Maurer Nonsequential and Distributed Programming with Go Springer 2021 englisch Abgerufen von https de wikipedia org w index php title Semaphor Informatik amp oldid 236866137