Bez blokady IPC w systemie Linux dla procesorów wielordzeniowych

9

Próbuję znaleźć sposób na napisanie aplikacji bez blokady IPC na Linuksie, w C, z procesorami wielordzeniowymi.

Załóżmy, że mam proces 1 i proces 2, które zapisują w FIFO lub w pamięci współdzielonej. Następnie proces 3 i proces 4 będą czytać z tej pamięci współdzielonej lub FIFO.

Czy jest to możliwe dzięki algorytmowi bez blokady?

Twoje wskazówki są bardzo mile widziane.

poli
źródło
Czy możesz podać jakieś wskazówki lub odniesienia do dokumentacji zewnętrznej dotyczącej komunikacji bez blokady? Co dokładnie oznacza ten termin?
Giorgio
Jeśli dobrze rozumiem, problemem są równoczesne zapisy (1, 2) i równoczesne odczyty (3, 4). Synchronizacja między pisarzami a czytnikami jest już objęta algorytmem opisanym na połączonej stronie.
Giorgio

Odpowiedzi:

2

Widziałem odniesienie do używania buforów pierścieniowych i kontrolowałem dostęp do wskaźników lokalizacji, aby wyeliminować lub zmniejszyć potrzebę blokad. Nie eliminuje to jednak potrzeby czekania i powinno działać tylko wtedy, gdy bufor pierścieniowy ma jednego pisarza i jednego czytnika. W twoim przypadku potrzebujesz co najmniej dwóch buforów.

Mechanizm, jaki rozumiem, to:

  • pisarz czeka, aż pojawi się wolne miejsce (ostatnie + 1! = bieżące)
  • program zapisujący zapisuje w buforze pierścieniowym.
  • pisarz aktualizuje wskaźnik ostatniego wpisu.

  • czytnik czeka, aż w buforze dzwonka będzie dostępny wpis (ostatni! = bieżący).

  • czytnik przetwarza wpis.
  • czytnik zwiększa aktualny wskaźnik.

W zależności od użytego czasu oczekiwania może to albo dodać opóźnienie dla nowych elementów w pustej kolejce, albo spalić wiele cykli procesora w pętli oczekiwania. Kolejność aktualizacji wskaźnika i ścisłe oddzielenie dostępu do zapisu ma zasadnicze znaczenie dla tego działania. Program piszący może zapisać wpis bufora pierścieniowego tylko przed zwiększeniem wskaźnika, aby był dostępny dla czytnika.

BillThor
źródło
Znalazłem to również na wikipedii, wygląda interesująco, chociaż nie próbowałem tego concurrencykit.org
pol.
1

Tak, to możliwe. W naszym projekcie wykorzystujemy jeden z algorytmów kolejki bez blokady. Ale te algorytmy nie są tak naprawdę oczywiste. Jeśli chcesz je dogłębnie zrozumieć, powinieneś być przygotowany na kilka miesięcy.

Dmitry Poroh
źródło
0

Komunikacja między procesami nie może być bez blokady. Tylko między wątkami. O ile mi wiadomo.

DeadMG
źródło
Myślę, że „blokada bez blokady” jest atrybutem mechanizmu, a nie użytkownika. Różnica między wątkami i procesami staje się dość niewielka, gdy dodajesz do miksu takie rzeczy, jak pamięć współdzielona.
tylerl