diff --git a/ws23.q b/ws23.q new file mode 100644 index 0000000000000000000000000000000000000000..62bbe68d35113d8a6cf3039dcf94ebf97ca261ad --- /dev/null +++ b/ws23.q @@ -0,0 +1,32 @@ +0 Beim Blockieren in einem Monitor muss der Monitor freigegeben werden. Warum? (Februar 2023) +- Weil kritische Abschnitte immer nur kurz belegt sein dürfen. + Für die Performanz eines Programms ist das sicher vorteilhaft, jedoch hat das nichts mit der Frage zu tun. +- Weil sonst die Monitordaten inkonsistent sind. + Nein, gegenseitiger Auschluss wäre sonst auch gegeben. ++ Weil ein anderer Thread die Blockierungsbedingung nur aufheben kann, wenn er den Monitor vorher betreten kann. + Ja, vergleiche z. B. blockierende Warteschlange. Würde ein konsumierender Thread nicht den Monitor freigeben, so könnte kein produzierender Thread ein Element einfügen. +- Weil der Thread sonst aktiv warten würde. + Nein, der Thread wartet passiv auf den Monitor. +. + +0 Welche Aussage zum Thema Synchronisation ist richtig? (Februar 2023) +- Die V-Operation kann auf einem Semaphor nur von dem Thread aufgerufen werden, der zuvor auch die P-Operation aufgerufen hat. + Nein, P und V können von beliebigen, auch unterschiedlichen, Threads aus aufgerufen werden. ++ Durch den Einsatz von Semaphoren kann ein wechselseitiger Ausschluss erzielt werden. + Ja, eine Semaphore mit initialem Wert von 1 (binäre Semaphore) implementiert *mutual exclusion*, wenn P und V immer paarweise nacheinander aufgerufen werden. +- Ein Semaphor kann ausschließlich für mehrseitige Synchronisation (*multilateral synchronisation*) verwendet werden. + Nein, das würde bedeuten, dass man damit nur Synchronisationsmechanismen implementieren kann, bei denen jeder Zugriff und nicht nur Entnahmezugriffe auf das Betriebsmittel dem wechselseitigen Ausschluss unterliegt. (vgl. [10.1 S.14]) Jedoch lässt sich z. B. eine blockierende Warteschlange mit nichtblockierender Entnahme implementieren, bei welcher die Semaphore nur Konsumenten bei einer leeren Warteschlange blockiert. +- Einseitige Synchronisation (*unilateral synchronisation*) erfordert immer Betriebssystemunterstützung. + Nein, diese kann zum Beispiel ohne Betriebssystemaufrufe durch ein *spin lock* realisiert werden. +. + +0 Welche der folgenden Aussagen zu statischem bzw. dynamischem Binden ist richtig? (Februar 2023) +- Änderungen am Code einer dynamischen Bibliothek (z. B. Bugfixes) erfordern immer das erneute Binden aller Programme, die diese Bibliothek benutzen. + Ja. Programme, die eine dynamische Bibliothek einbinden müssen (zumindest in der Theorie) nur neugestartet werden, nachdem diese ausgetauscht wurde, wonach sie durch den dynamischen Binder neu gebunden werden. +- Beim statischen Binden werden alle Adressen zum Ladezeitpunkt aufgelöst. + Nein, das passiert hier bereits beim Binden. ++ Beim dynamischen Binden erfolgt die Adressauflösung beim Laden des Programms oder zur Laufzeit. + Ja, beim Laden werden die Adressen der verwendeten Symbole durch den *dynamic linker* aufgelöst. Zur Laufzeit können jedoch noch Bibliotheken nachgeladen werden (`dlopen(3)`). +- Statisch gebundene Programme können zum Ladezeitpunkt an beliebige virtuelle Speicheradressen platziert werden. + Nein. Das kann, muss aber nicht so sein. Dynamische Bibliotheken müssen hingegen *position-independent-code* enthalten, um in den Adressbereich des Zielprogramms geladen werden zu können. +. \ No newline at end of file