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.
c
linux
multithreading
poli
źródło
źródło
Odpowiedzi:
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 aktualizuje wskaźnik ostatniego wpisu.
czytnik czeka, aż w buforze dzwonka będzie dostępny wpis (ostatni! = bieżący).
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.
źródło
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.
źródło
Komunikacja między procesami nie może być bez blokady. Tylko między wątkami. O ile mi wiadomo.
źródło