PROCESSPROGRAMMERING
Föreläsning 10 (8.11.2005)
Innehåll:
- Producent – konsument problemet
Jonny Karlsson 25.10.2005
En producent och en konsument
Konsumenten måste kunna konsumera alla tal som producerats av producenten även
om produktionen går snabbare än konsumtionen.
Lösning: användning av semaforer (utan semaforskydd skrivs minnesbufferns poster
över innan konsumenten hinner läsa alla poster.
Jonny Karlsson 25.10.2005
En producent och en konsument
Det behövs 2 heltalssemaforer
• TOM initialiseras till N=antalet platser i buffern
• FULL initialiseras till 0
Pseudokod för producentprocessen:
/* delat minne */
int buffer[N], in=0, ut=0;
/*semaforer*/
initsemaphore TOM = N;
initsemaphore FULL = 0;
while(1)
{
producera(tal);
P(TOM);
buffer[in] = tal;
in = (in + 1) % N;
V(FULL);
}
Jonny Karlsson 25.10.2005
En producent och en konsument
Pseudokod för konsumentprocessen:
while(1)
{
P(FULL);
tal = buffer[ut];
ut = (ut + 1)%N;
V(TOM);
}
Jonny Karlsson 25.10.2005
Flera konsumenter och producenter
Problem:
Alla producenter använder samma index-variabel för att placera
heltal i kön. Alla konsumenter använder samma index-variabel för
att hämta heltal från kön.
Lösning:
Använd en binär semafor för att kontrollera att endast en
producent kommer åt kön/minnesbuffern på en samtidigt.
Använd likaså en binär semafor för att kontrollera att endast en
konsument får läsa värden ur kön samtidigt.
Jonny Karlsson 25.10.2005
Flera konsumenter och producenter
Pseudokod för producent-processerna:
/* delat minne */
int buffer[N],in=0,ut=0;
/* 4 semaforer /*
initsemaphore TOM=N;
initsemaphore FULL=0;
initsemaphore SEMIN=1;
initsemaphore SEMUT=1;
while(1)
{
producera(tal);
P(TOM);
P(SEMIN);
buffer[in]=tal;
in=(in+1)%N;
V(SEMIN);
V(FULL);
}
Jonny Karlsson 25.10.2005
Flera konsumenter och producenter
Pseudokod för producent-processerna:
while(1)
{
P(FULL);
P(SEMUT);
tal = buffer[ut];
ut=(ut+1)%N;
V(SEMUT);
V(tom);
konsumera(tal);
}
För mer detaljerad beskrivning av konsument-producent probemet
se föreläsningskompendium sid 29-31
Jonny Karlsson 25.10.2005