Semaphoren richtig setzen in einer Theorie Aufgabe

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
MiCsoft
Beiträge: 18
Registriert: So Nov 08, 2020 8:18 pm

Semaphoren richtig setzen in einer Theorie Aufgabe

Beitrag von MiCsoft » Mi Aug 10, 2022 8:26 pm

Hallo zusammen,

hab folgende Aufgabe (ist rein Theoretisch):

Ein Händler hat ein Lager für Kaffeesäcke und Tassen.
Beliefert wird er von einem Lieferant, der bei jeder Lieferung eine Tasse und ein Kaffeesack bringt.
Ein Ausfahrer A1 bringt je Fahrt eine Tasse zum Kunden, ein Ausfahrer A2 je Fahrt einen Kaffeesack.
Zum Be- und Entladen muss eine Laderampe benutzt werden.

Folgende Bedingungen müssen erfüllt werden:

Zur Rampe kann jeweils nur ein Prozess (Lieferant, A1, A2) fahren
A1 darf nur zur Rampe fahren, wenn noch eine Tasse im Lager ist. Analog zu A2.
Das Lager hat eine beschränkte Kapazität, es kann höchstens 20 Stück aufnehmen
Der Lieferant darf nur zur Rampe fahren, wenn er seine Lieferung vollständig abladen kann
Zu Beginn sei das Lager leer und die Rampe frei

Liste alle benötigen Semaphoren auf und erkläre ihren Zweck:

Ich dachte hier an folgende Semaphoren:

Code: Alles auswählen

RampenSemaphore(1) => Dieser Semaphore soll gewerleisten das immer nur ein Process die Rampe erhält
TassenSemaphore(0) => Dieser Semaphore soll signalisieren das es Tassen gibt
KaffeesackSemaphore(0) => wie TassenS.
MaxSemaphore(20) => Dieser Semaphore soll die Kapazität simulieren.
Füge in den aufgelisteten Pseudocode des Ablaufs der beteiligten Prozesse an entsprechenden Stellen den Aufruf der Semaphore da:

Code: Alles auswählen

Process Lieferant {                                  
    while(true) {                                       
      <zur Rampe fahren>;                           
      <1 Tasse entladen>;                          
      <1 Kaffeesack entladen>;                      
      <Rampe verlassen>;                                           
    }                                                           
}

Process A1 {
while(true) { 
<zur Rampe fahren>; 
<1 Tasse aufladen>; 
<Rampe verlassen>; 
}}

Process A2 {
while(true) {
<zur Rampe fahren>;
 <1 Kaffesack aufladen>;
 <Rampe verlassen>;
}}
Mein erster Versuch mit diesen 4 Semaphoren wäre beim Lieferant folgender:

Code: Alles auswählen

Process Lieferant {
    while(true) {
        MaxSemaphore.P(2); //Hier kommen 2 Exemplare ins Lager (Lager ist am Anfang leer)
        TassenSemaphore.V(); //Hier wird jetzt eine Tassen Objekt ins Lager gelegt
        KaffeesackSemaphore.V(); //ebenfals wie oben
        RampenSemaphore.P(); //Hier betritt nun der Lierferant die Rampe
        <zur Rampe fahren>;
        <1 Kaffeesack entladen>;
        <1 Tasse entladen>;
        <Rampe verlassen>;
        RampenSemaphore.V();
    }
}
Doch mit diesem MaxSemaphore komme ich nicht weiter! Irgendwas stimmt nicht :shock:

Kann mir jemand weiterhelfen?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Semaphoren richtig setzen in einer Theorie Aufgabe

Beitrag von Xin » Mi Aug 10, 2022 9:02 pm

MiCsoft hat geschrieben:
Mi Aug 10, 2022 8:26 pm
hab folgende Aufgabe (ist rein Theoretisch):

Ein Händler hat ein Lager für Kaffeesäcke und Tassen.
Beliefert wird er von einem Lieferant, der bei jeder Lieferung eine Tasse und ein Kaffeesack bringt.
Ein Ausfahrer A1 bringt je Fahrt eine Tasse zum Kunden, ein Ausfahrer A2 je Fahrt einen Kaffeesack.
Zum Be- und Entladen muss eine Laderampe benutzt werden.
Gut, dass das theoretisch ist, in der freien Wirtschaft würde ich Optimierungspotential sehen. :-)
MiCsoft hat geschrieben:
Mi Aug 10, 2022 8:26 pm
Doch mit diesem MaxSemaphore komme ich nicht weiter! Irgendwas stimmt nicht :shock:

Kann mir jemand weiterhelfen?
Ich würde sagen als erstes verlinke ich mal Wie formuliere ich eine Frage.

Erwartungshaltung und was passiert stattdessen.

Ansonsten hatte ich mit Semaphoren lange nix mehr zu tun. Hier wäre meine Vorstellung aber, dass es eine Semaphore gibt: Die Rampe. Du meldest Dich an, weil Du Liefern oder Abholen möchtest und die Semaphore fügt Dich in die Liste ein. Die Semaphore guckt nun, wer Du bist: Wenn Du liefern willst, wird geprüft ob das Lager voll ist und wenn nicht, ob die Rampe frei ist. Wenn Du Abholen willst, guckt die Semaphore, ob Deine Ware im Lager ist und ob die Rampe frei ist.
Der Status des Lagers ist eher die Frage, wer wird priorisiert. Wenn jemand die Rampe verlässt, muss aus der Warteliste der richtige entblockt werden. Wenn 20 Tassen da sind und kein Kaffee, muss der Tassen-Ausfahrer priorisiert werden, weil der Kaffee-Ausfahrer nunmal nichts kriegt und der Lieferant nicht liefern kann, weil das Tassenlager voll ist. Steht der Tassen-Ausfahrer im Stau müssen alle Warten, bis er wieder da ist und sofort die leere Rampe vorfindet.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten