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