Zgodnie z this pytanie odpowiedź wydaje się, że LOCK CMPXCHG na x86 faktycznie powoduje pełną barierę. Można przypuszczać, że to właśnie pod maską generuje się Unsafe.compareAndSwapInt()
. Staram się dowiedzieć, dlaczego tak jest: z protokołem MESI, po aktualizacji linii pamięci podręcznej, czy procesor może po prostu unieważnić tylko tę linię pamięci podręcznej na innych rdzeniach, zamiast dezaktywować WSZYSTKIE bufory magazynu/obciążenia rdzenia, który wykonał CAS? Wydaje mi się, że jest to marnotrawstwem ...Porównaj i zamień na x86 - dlaczego jest to pełna bariera?
Odpowiedz
Twoja odpowiedź, o ile widzę, jest w komentarzach - pamięci podręczne aktualizacji MESI, a nie Store/Load buffers
. Ale blokada LOCK CMPXCHG
mówi: locked operations serialize all outstanding load and store operation
- to dlatego należy opróżnić bufor Store/Load z tego CPU (a nie inne, jak szczegółowe here).
Obecny procesor musi wykonać operację atomową na najnowszej wartości - która może znajdować się w buforze Store/Load, dlatego konieczne jest ogrodzenie, aby faktycznie ją spuścić.
Dostaję! musimy wyładować żartobliwie, że wymienimy linię pamięci podręcznej, fajnie! Jeszcze jedno - czy pełna bariera mem rzeczywiście powoduje, że inne bufory pamięci procesora mają być przepłukiwane w ? Lub tylko ten, na którym działa wątek? Innymi słowy, miałem wrażenie, że oczekujące zmiany z innych procesorów są w buforze obciążenia mojego procesora, więc bariera mem po prostu spuszcza te – Bober02
@ Bober02 Naprawdę zaktualizowałem odpowiedź, aby uczynić to nieco jaśniejszym - zgodnie z moim rozumieniem. – Eugene
- 1. Porównaj i zamień w C++
- 2. porównaj i zamień vs test i ustaw
- 3. Bariera pamięci i przykład java.util.concurrent.locks.Condition
- 4. ruby na szynach, zamień ostatni znak, jeśli jest to znak *
- 5. Cel kopalni pełna i ich pełna poleceń
- 6. Zmienne lotne i bariera pamięci w java
- 7. Pełna wysokość i pełna szerokość układ CSS
- 8. Dlaczego powinienem używać "rdtsc" inaczej na x86 i x86_x64?
- 9. Co to jest WebIDL i (dlaczego) jest to ważne?
- 10. Bariera rozwoju mobilnego do wejścia
- 11. Dlaczego powszechną praktyką jest podwojenie pojemności macierzy, gdy jest pełna?
- 12. Kolejka JMS jest pełna
- 13. Przykład C++ "bariera pamięci"
- 14. jak jest bariera pamięci w jądrze Linux jest używany
- 15. Co to jest CGSUpdateManager i dlaczego narzeka?
- 16. Czy ta pełna implementacja dodatku jest poprawna?
- 17. Pełna szerokość i wysokość SVG
- 18. Porównaj JSON i BSON
- 19. Dlaczego CLFLUSH istnieje w x86?
- 20. Dlaczego jest to wskaźnik
- 21. Co naprawdę robi bariera LoadLoad?
- 22. TF30042: Baza danych jest pełna
- 23. Wyszukaj i zamień na Regex zastępując zmienne
- 24. Co to jest obszar tabel i dlaczego jest używany?
- 25. JavaScript mecz i zamień na unicode
- 26. Android: Kursor Okno jest pełna
- 27. Wyszukaj i zamień na ukośnik w przód
- 28. Dziedziczenie - dlaczego jest to nielegalne?
- 29. Dlaczego to jest wyciek pamięci
- 30. Co to jest kopia seryjna? I dlaczego jest tak zaimplementowany?
Przy pełnej barierze wypłukasz wszystkie pominięte zmiany prognoz, zamiast jednej linii pamięci podręcznej, więc czy nie byłoby gorzej z pełną barierą? Ale oczywiście brakuje mi tutaj :) – Bober02
[Porównaj i zamień] (https://en.wikipedia.org/wiki/Compare-and-swap) na Wikipedii to obejmuje, * Porównuje zawartość lokalizacji pamięci do podanej wartości i, tylko jeśli są takie same, modyfikuje zawartość tej lokalizacji pamięci na nową podaną wartość. Odbywa się to jako pojedyncza operacja atomowa. Atomowość gwarantuje, że nowa wartość jest obliczana na podstawie aktualnych informacji; jeżeli w międzyczasie wartość zostałaby zaktualizowana przez inny wątek, zapis byłby nieudany. * Bez pełnej bariery może zostać przerwana (lub w inny sposób zaktualizowana) i może to unieważnić atomikę. –