Problem filozofa za ručkom

U informatici, problem filozofa za ručkom je veoma često korišćen primer problema u oblasti konkurentnog programiranja. Osmišljen je tako da ilustruje probleme sinhronizacije i tehnike za njihovo rešavanje.

Ilustracija problema filozofa za ručkom. Prikazani filozofi u smeru kazaljke na satu su redom: Platon, Konfučije, Sokrat, Volter i Dekart.

Problem je prvi formulisao Edsger Dajkstra 1965. godine, a ubrzo nakon toga mu je Toni Hor dao sadašnju formulaciju.[1][2][3]

Opis problema uredi

Pet filozofa (Platon, Konfučije, Sokrat, Volter i Dekart) sedi oko okruglog stola. Svaki filozof provodi svoj život tako što naizmenično razmišlja i jede. Na sredini stola je velika posuda sa špagetima. Pošto su špageti dugački i isprepletani, a filozofi nisu veoma spretni, moraju da koriste dve viljuške kada jedu. Nažalost, postoji samo pet viljušaka, između svaka dva susedna filozofa po jedna. Filozofi mogu da dohvate samo viljušku koja je neposredno levo i neposredno desno od njih.[4]

Primer rešenja uredi

Primer rešenja primenom semafora u konkurentnom Paskalu, kod koga je mrtvo blokiranje izbegnuto idejom da procesi ne izvršavaju kritične sinhronizacione operacije istim redosledom, odnosno da svaki filozof kada želi da jede uzima prvo neparnu viljušku:[5]

program DiningPhilosophers;
const N = 5;

var mutexfork : array[0..N-1] of semaphore;
    i : integer;

procedure think; 
begin
//misli...
end;

procedure eat;
begin
//jede...
end;

procedure Philosopher(i : 0..N-1);
var first, second : 0..N-1;
begin
    if (i mod 2 = 1) then begin
        first := i; //prva viljuska koju ce uzeti
        second := (i+1) mod N //druga viljuska koju ce uzeti
    end
    else begin
        first := (i+1) mod N //prva viljuska koju ce uzeti
        second := i //druga viljuska koji ce uzeti
    end;
    while (true) do begin
        think;
        wait(mutexfork[first]);
        wait(mutexfork[second]);
        eat;
        signal(mutexfork[first]);
        signal(mutexfork[second])
    end
end;

begin
    for i := 0 to N-1 do init(mutexfork[i], 1);
    cobegin
        Philosopher(0);
        //...
        Philosopher(N-1);
    coend
end.

Pored ovog postoje i brojne druge varijacije rešenja. Jedno od često korišćenih je rešenje kod kog se mrtvo blokiranje sprečava uvođenjem ograničenja na broj procesa koji mogu da pristupaju resursima (viljuškama). Po tom rešenju maksimalno četiri filozofa mogu da zatraže viljuške u isto vreme.[6]

Vidi još uredi

Reference uredi

  1. ^ Dijkstra, Edsger W. EWD-1000. E.W. Dijkstra Archive. Center for American History, University of Texas at Austin.  (original; transcription)
  2. ^ J. Díaz; I. Ramos (1981). Formalization of Programming Concepts: International Colloquium, Peniscola, Spain, April 19–25, 1981. Proceedings. Birkhäuser. str. 323 , 326. ISBN 978-3-540-10699-9. 
  3. ^ Hoare, C. A. R. (2004) [originally published in 1985 by Prentice Hall International]. „Communicating Sequential Processes” (PDF). usingcsp.com. 
  4. ^ Radivojević, Zaharije; Ikodinović, Igor; Jovanović, Zoran (2018). Konkurentno i distribuirano programiranje (drugo izdanje). Akademska misao. str. 30. 
  5. ^ Radivojević, Zaharije; Ikodinović, Igor; Jovanović, Zoran (2018). Konkurentno i distribuirano programiranje (drugo izdanje). Akademska misao. str. 34. 
  6. ^ Radivojević, Zaharije; Ikodinović, Igor; Jovanović, Zoran (2018). Konkurentno i distribuirano programiranje (drugo izdanje). Akademska misao. str. 35. 

Literatura uredi

  • Radivojević, Zaharije; Ikodinović, Igor; Jovanović, Zoran (2018). Konkurentno i distribuirano programiranje (drugo izdanje). Akademska misao, Beograd.

Spoljašnje veze uredi