Algorithmus Erzeuger-Verbraucher -, erfüllt alle Puffer

Lese ich die bekannten Betriebssystem-Konzepte-Buch (Avi Silberschatz, Peter Baer Galvin, Greg Gagne) Ausgabe 9: http://codex.cs.yale.edu/avi/os-book/OS9/

In dem Buch, in Kapitel 5 "Prozess-Synchronisierung", dort ist das folgende Beispiel:

Nehmen wir an, wir wollten eine Lösung für die consumer-producer
problem, der füllt alle Puffer. Wir können dies tun, indem er eine ganze Zahl
Zähler, der verfolgt, die Anzahl der Puffer voll. Zunächst
Zähler wird auf 0 gesetzt. Es ist erhöht durch den Hersteller nach
erzeugt einen neuen Puffer und verringert durch den Verbraucher, nachdem es
verbraucht ein Puffer.

Sowie die algorithmen für dieses problem sind wie folgt:

Produzent Algorithmus:

while (true)
{
    /* produce an item in nextproduced */

    while (counter == BUFFER_SIZE) ; 
    /* do nothing */

    buffer[in] = next_produced; 
    in = (in + 1) % BUFFER_SIZE; 
    counter++; 
}

Verbraucher-Algorithmus:

while (true)
{
    while (counter == 0) ; /* do nothing */

    next_consumed = buffer[out];

    out = (out + 1) % BUFFER_SIZE;  
    counter--; 
    /* consume the item in next consumed */
}

Finden Sie diese algorithmen in den Folien von der Prozess-Synchronisation Kapitel: http://codex.cs.yale.edu/avi/os-book/OS9/slide-dir/PPT-dir/ch5.ppt

Ich nicht verstehen, wie diese algorithmen werden soll, füllen Sie den Puffer. Soweit ich sehe, Sie füllen nur ein Puffer. Bin ich richtig oder bin ich etwas fehlt? Diese algorithmen bereits erwähnt in dem Buch, das seit 2007 zumindest, so nehme ich an, dass es kein Fehler ist, aber ich nicht richtig verstanden?

Jede Erklärung ist willkommen.

  • Ich verstehe nicht, wie Sie denken, Sie würden nur füllen/verbrauchen einen Puffer. Sie Durchlaufen, bis die Anzahl der Puffer gefüllt ist oder konsumiert wird, ist BUFFER_SIZE oder 0, beziehungsweise.
  • Naja, wie ich verstanden habe, ist der Produzent-Algorithmus für Beispiel, es erhöht den Zähler variable jedes mal, wenn es produziert ein Element (egal, wenn der aktuelle Puffer gefüllt ist oder nicht), wird diese variable für mich, entspricht nicht der Anzahl der Puffer... es sollte Inkrement nur, wenn der aktuelle Puffer wird gefüllt und wir wollen beginnen, füllen Sie eine neue keine?
  • Die while (counter == BUFFER_SIZE); im Produzenten-Algorithmus, wenn es füllt, der erste Puffer wird es weiter Loopen, bis der Verbraucher verbraucht ein Element, so wird es nie beginnen, füllen Sie einen zweiten Puffer. Vielleicht bin ich etwas fehlt hier notwendig.
  • Warum würde es weiter looping es, wenn es nur gefüllt, eine Puffer? Es wird nur weiterhin die Schleife, wenn ALLE Puffer voll sind. Das ist es, was count == BUFFER_SIZE bedeutet.
  • Also die BUFFER_SIZE Wert ist die Größe ALLER Puffer zusammen (die Summe der Größen aller Puffer) und nicht die Größe von nur einem Puffer?
  • Ohhhh, ich sehe, Ihr Missverständnis jetzt! BUFFER_SIZE ist schlecht benannt, denke ich. Es ist nicht die Größe der einzelnen Puffer oder Puffer zusammen, sondern einfach die Gesamtzahl der Puffer. Es sollte aufgerufen werden, NUMBER_OF_BUFFERS.
  • Nein, es ist nicht schlecht, die Namen. Rami falsch interpretiert es als ITEM_SIZE aber es ist von der Größe buffer[].
  • Sorry Jungs, ich bin mehr verwirrt jetzt, so BUFFER_SIZE ist die Anzahl der Elemente, die einen Puffer enthalten kann? oder die Anzahl der Puffer? kann mir jemand helfen mit einem Beispiel. Dank einer million
  • Ich glaube, ich habe es, die next_produced variable füllen der Puffer voll ist, direkt, also die buffer[] ist ein array von "BUFFER_SIZE"' buffers, each-Schleife im producer produzieren eine next_produced Sache, die füllen direkt eine ganze Puffer (element) int buffer[] array. Ist es das, was es ist?
  • Ja, genau das ist es!
  • Hallelujah 🙂 vielen Dank! Das problem ist in der Semantik der Variablen, in Abschnitt 3 des Buches die variable BUFFER_SIZE verwendet wird, in einem anderen Beispiel mit unterschiedlicher Bedeutung, denke ich. Danke nochmal

InformationsquelleAutor Rami | 2014-05-10
Schreibe einen Kommentar