Co to jest blokada pamięci?

Historycznie rzecz biorąc, wszystkie programy komputerowe były pisane w sposób całkowicie sekwencyjny. Jest to łatwe do przeczytania, napisania i zrozumienia. Jest również prosty do wykonania przez komputer i wymaga stosunkowo prostego sprzętu. Przy takim paradygmacie projektowania jedyne dwa sposoby na zwiększenie wydajności systemu to napisanie wydajniejszego kodu i zwiększenie szybkości procesora. Zwiększenie wydajności kodu może być możliwe, ale generalnie jest to złożony proces o często ograniczonych wynikach.

Przez dziesięciolecia wydajność mogła spadać, czekając na nowe, wydajniejsze procesory. Zgodnie z prawem Moore'a wydajność procesorów z grubsza podwaja się co dwa do trzech lat. Niestety, większość tych wzrostów wydajności wynikała z używania coraz mniejszych węzłów produkcyjnych. Nowoczesna technologia walczyła o zmniejszanie rozmiaru węzłów w historycznym tempie, dzięki trudnościom materialnym pracującym w skali nanometrów.

Aby obejść ten problem, współcześni architekci procesorów zdecydowali się dodać wiele rdzeni procesorów do procesorów. Każdy rdzeń procesora może działać niezależnie w innym zadaniu. Chociaż nie mogą łączyć tego samego problemu, mogą pracować nad dwoma problemami jednocześnie. Ta fundamentalna zmiana w architekturze zapewnia dużo dodatkowej wydajności, ale nie przynosi bezpośrednich korzyści poszczególnym procesom, chociaż zmniejsza rywalizację o czas procesora.

Aby skorzystać z wielordzeniowych procesorów, kod musi być napisany w sposób wielowątkowy. Każdy wątek może być następnie uruchamiany współbieżnie, skalując korzyść w zakresie wydajności na podstawie liczby dostępnych wątków i rdzeni procesora. Jednak robienie tego prowadzi do nowego wyzwania, „warunków wyścigu”.

Uwaga: niektóre zadania nie mogą być wielowątkowe, podczas gdy inne mogą być wielowątkowe. Ewentualne korzyści w zakresie wydajności zależą od wykonywanej pracy.

Warunki wyścigu

Oprogramowanie wielowątkowe może wykorzystywać wiele rdzeni. Niebezpieczeństwa czają się w tych wodach, gotowe złapać w pułapkę niedoświadczonego programistę. Sytuacja wyścigu może wystąpić, gdy dwa różne wątki wchodzą w interakcję z tym samym bitem pamięci.

Prostym przykładem mogą być dwa wątki próbujące jednocześnie sprawdzić i zwiększyć zmienną. Powiedzmy, że a=0 . Następnie dwa różne wątki wykonują swoje funkcje iw pewnym momencie sprawdzają a i zwiększają je o jeden. Ogólnie rzecz biorąc, można oczekiwać, że wynikiem dwóch wątków dodających jeden do zera będzie dwa. W większości przypadków tak powinno być. Możesz uzyskać inny wynik, jeśli oba wątki przejdą przez tę konkretną funkcjonalność dokładnie we właściwym czasie.

W tym przypadku pierwszy wątek odczytuje wartość . Zanim pierwszy wątek będzie mógł zwiększyć wartość a , drugi wątek ją odczyta. Teraz pierwszy wątek dodaje jeden do zera, ale drugi wątek już uważa, że ​​wartość wynosi zero, dodając jeden do zera. W rezultacie ostateczna wartość a wynosi 1, a nie 2.

Wyścig do najgorszego scenariusza

Chociaż powyższy przykład może nie brzmieć szczególnie źle, może mieć dramatyczne skutki. Co jeśli wartość a wybiera tryb pracy maszyny? Co jeśli określone tryby pracy tej maszyny mogą być niebezpieczne, a nawet zagrażać życiu?

Warunki wyścigu również nie muszą być takie proste. Na przykład może się zdarzyć, że jeden wątek odczyta sekcję pamięci w tym samym czasie, gdy inny wątek zapisuje do niej. W takim przypadku wątek odczytu może uzyskać dziwną mieszankę danych zarówno przed, jak i po. Powiedzmy, że test jest prostym testem typu prawda/fałsz.

Jeśli zmienna miała wartość true na początku odczytu, ale była w trakcie zastępowania słowem fałsz, wynikiem operacji odczytu może być coś w rodzaju „trlse”. To nie jest „prawda” ani „fałsz”. Brak jednej z dwóch opcji w wyborze binarnym prawie na pewno spowodowałby awarię aplikacji. To uszkodzenie pamięci może prowadzić do wielu problemów z bezpieczeństwem, takich jak odmowa usługi i eskalacja uprawnień.

Blokowanie wyścigu

Wiedza o tym, które bity pamięci w programie są współużytkowane przez różne wątki, jest niezbędna, aby zapobiec sytuacji wyścigu. Nic nie trzeba robić, jeśli zmienna jest zawsze kontrolowana i dostępna tylko przez jeden wątek. Jeśli dwa lub więcej wątków może uzyskać dostęp do zmiennej, musisz upewnić się, że wszystkie operacje na tym elemencie pamięci są wykonywane niezależnie od siebie.

Ta niezależność jest osiągnięta dzięki zamkowi. W kodzie programu musisz umieścić blokadę podczas pisania funkcji, która działa na współdzielonej pamięci. Ta blokada blokuje innym wątkom dostęp do tego fragmentu pamięci, dopóki blokada nie zostanie zwolniona.

Zamek nie należy do najbardziej eleganckich rozwiązań. Po pierwsze, ma narzuty pamięci. Może również wymusić zawieszenie wątku w oczekiwaniu na zwolnienie blokady. W zależności od sytuacji blokada może nie zostać zwolniona przez bardzo długi czas lub może nie zostać zwolniona wcale. W najgorszym przypadku odblokowanie blokady może zależeć od czegoś, co dzieje się w innym zablokowanym wątku, co prowadzi do impasu.

Niezbędne jest zoptymalizowanie wykorzystania zamków. Możesz kontrolować stopień szczegółowości blokady. Na przykład, jeśli edytujesz dane w tabeli, możesz zablokować całą tabelę lub tylko edytowany wiersz. Zablokowanie całego stołu byłoby blokadą o grubej ziarnistości. Minimalizuje obciążenie związane z wdrażaniem zbyt wielu blokad, ale zwiększa prawdopodobieństwo zablokowania innego wątku przez blokadę. Zablokowanie tylko wiersza byłoby blokadą drobnej ziarnistości. Jest to znacznie mniej prawdopodobne, aby kolidować z innymi wątkami, ale oznacza to, że potrzebne będą blokady rozdarcia, zwiększając całkowity narzut.

Wniosek

Blokada pamięci to narzędzie kodu, które służy do zapewnienia niepodzielności operacji w pamięci w środowisku wielowątkowym. Blokując fragment pamięci przed przystąpieniem do operacji na nim, można mieć pewność, że nie wystąpi żadne nieoczekiwane zachowanie spowodowane wyścigiem. Blokady pamięci wiążą się z obciążeniem pamięci, ale mogą również powodować blokowanie.

Blokowanie ma miejsce, gdy inny wątek próbuje działać na zablokowanej pamięci. Nić tam siedzi, zablokowana, dopóki blokada nie zostanie zwolniona. Może to powodować problemy, jeśli zwolnienie blokady wymaga wykonania czegoś przez inny wątek, ponieważ może zostać zablokowany, zanim będzie mógł spełnić warunek wstępny zwolnienia blokującej go blokady. Blokad pamięci można uniknąć, pisząc kody nieblokujące. Może to jednak być skomplikowane i mniej wydajne niż używanie blokad. Nie zapomnij zostawić swoich komentarzy poniżej.



Leave a Comment

Jak sklonować dysk twardy

Jak sklonować dysk twardy

We współczesnej epoce cyfrowej, gdzie dane są cennym zasobem, klonowanie dysku twardego w systemie Windows może być dla wielu kluczowych procesów. Ten obszerny przewodnik

Jak naprawić błąd ładowania sterownika WUDFRd w systemie Windows 10?

Jak naprawić błąd ładowania sterownika WUDFRd w systemie Windows 10?

Czy podczas uruchamiania komputera pojawia się komunikat o błędzie informujący, że nie udało się załadować sterownika WUDFRd na Twój komputer?

Jak naprawić błąd NVIDIA GeForce Experience o kodzie 0x0003

Jak naprawić błąd NVIDIA GeForce Experience o kodzie 0x0003

Czy na pulpicie pojawia się błąd NVIDIA GeForce o kodzie 0x0003? Jeśli tak, przeczytaj blog, aby dowiedzieć się, jak szybko i łatwo naprawić ten błąd.

How to Use Auto Clicker for Chromebook

How to Use Auto Clicker for Chromebook

Today, were going to delve into a tool that can automate repetitive clicking tasks on your Chromebook: the Auto Clicker. This tool can save you time and

Jak usunąć procesor graficzny z komputera z systemem Windows w 2023 r

Jak usunąć procesor graficzny z komputera z systemem Windows w 2023 r

Czy musisz usunąć GPU z komputera? Dołącz do mnie, gdy wyjaśnię, jak usunąć procesor graficzny z komputera w tym przewodniku krok po kroku.

Jak zainstalować dysk SSD NVMe na komputerze stacjonarnym i laptopie

Jak zainstalować dysk SSD NVMe na komputerze stacjonarnym i laptopie

Kupiłeś nowy dysk SSD NVMe M.2, ale nie wiesz, jak go zainstalować? Czytaj dalej, aby dowiedzieć się, jak zainstalować dysk SSD NVMe na laptopie lub komputerze stacjonarnym.

Co to jest bomba logiczna?

Co to jest bomba logiczna?

Bomba logiczna to incydent związany z bezpieczeństwem, w którym osoba atakująca przeprowadza opóźnioną akcję. Czytaj dalej, aby dowiedzieć się więcej.

Co to jest SoC?

Co to jest SoC?

Jeśli kiedykolwiek zajrzałeś do wnętrza wieży PC, możesz zobaczyć, że jest tam wiele różnych komponentów. Twój przeciętny laptop zawiera większość tych samych komponentów

Co to jest szyfrowanie asymetryczne?

Co to jest szyfrowanie asymetryczne?

Algorytmy szyfrowania asymetrycznego wykorzystują dwa różne klucze. Jeden klucz służy do szyfrowania, a drugi do deszyfrowania.

Steam Deck: Jak sformatować kartę SD

Steam Deck: Jak sformatować kartę SD

Steam Deck jest dostępny w trzech opcjach przechowywania: 64 GB eMMC, 256 GB NVMe SSD i 512 GB NVMe SSD. W zależności od biblioteki gier i rozmiaru gier