W jaki sposób szyna pamięci współdzielonej jest używana do odczytu i zapisu danych współdzielonych między wątkami bezpiecznie i poprawnie?

1

Chciałbym zrozumieć na wysokim poziomie, w jaki sposób magistrala pamięci współdzielonej obsługuje wiele jednoczesnych odczytów i zapisuje współdzielone dane z wielu wątków działających w wielu procesorach?

P.S: Nie potrzebuję szczegółów, ponieważ oczywiście będzie to specyficzne dla implementacji. Potrzebuję tylko ogólnego przeglądu tego, co dzieje się za kulisami.

Geek
źródło
1
Czy utknąłeś gdzieś ze swoimi własnymi badaniami? Jakie jest twoje dotychczasowe zrozumienie?
Dave
@DaveRook O ile rozumiem, magistrala pamięci jest wymagana do komunikacji między procesorem a pamięcią RAM (główna pamięć). To się nazywa udostępniony ponieważ będzie używany przez wiele rdzeni w tym samym czasie. Pytanie dotyczy w szczególności sposobu korzystania z tej współużytkowanej magistrali bez uszkadzania współdzielonych danych, które przepływają między nimi. Szukam tutaj odpowiedzi na wysokim poziomie.
Geek
Teraz to lepsze pytanie :)! Sugeruję, aby edytować swój oryginalny post, mając nadzieję, że otrzymasz więcej odpowiedzi.
Dave
@DaveRook zaktualizował pytanie zgodnie z Twoją sugestią. Miejmy nadzieję, że teraz otrzyma wiele odpowiedzi wysokiej jakości.
Geek

Odpowiedzi:

1

„Autobus” to zestaw przewodów między komponentami, a nie sam komponent. Tak więc okablowanie między procesorem a jego pamięcią nazywane jest magistralą pamięci; okablowanie do kart rozszerzeń to magistrala PCI itp.

Możliwe jest posiadanie wielu komponentów napędzających autobus, chociaż tylko jeden może je prowadzić jednocześnie, a jego sygnały są dostarczane do wszystkich innych komponentów w autobusie. Element sterujący dostępem do magistrali nazywa się magistralą mistrz . Może być możliwa zmiana komponentu, którym jest master magistrali arbitraż .

W systemie wielordzeniowym spójność pamięci podręcznej jest ważna. Kiedy jeden rdzeń zapisze się na magistrali pamięci współdzielonej, inne rdzenie będą podejrzeć magistrala (zbadaj zapis, nawet jeśli przechodzi z innego rdzenia do pamięci). Jeśli zapis dotyczy lokalizacji buforowanej przez ten rdzeń, rdzeń eksmisji lub zastąpi wpis pamięci podręcznej. W ten sposób nie ma przestarzałych informacji.

pjc50
źródło
„Możliwe jest posiadanie wielu komponentów napędzających autobus, chociaż tylko jeden może je obsługiwać jednocześnie, a jego sygnały są dostarczane do wszystkich innych komponentów w autobusie”. - Jakie są różne elementy napędzające magistrala pamięci ?
Geek
@Geek W chipsetach PC nie sądzę, żebyśmy kiedykolwiek mieli więcej niż jednego. Kiedyś był to „mostek północny” (kontroler / koncentrator pamięci), teraz jest to kontroler pamięci wbudowany w procesor. Nie zawsze tak było. W klasycznych minikomputerach, takich jak oryginalny PDP-11, pamięć po prostu siedziała na Unibusie wraz z urządzeniami I / O, a zarówno CPU, jak i urządzenia DMA mogły je „napędzać”. Prosty protokół arbitrażu magistrali zapewniał, że tylko jedno urządzenie mogło to zrobić w jednym czasie, a także było wykorzystywane do implementacji przerwań ważnych priorytetów (BR, poziomy żądania magistrali).
Jamie Hanrahan
1

Moduł pamięci (moduł DIMM) może wykonywać tylko jedną czynność: odczyt lub zapis. Jest to podyktowane protokołem na złączu krawędziowym DIMM; po wysłaniu polecenia odczytu lub zapisu do modułu DIMM nie może on nawet „usłyszeć” kolejnego, dopóki poprzednie polecenie nie zostanie zakończone.

Wszystkie moduły DIMM na wspólnej magistrali pamięci będą wspólnie miały to ograniczenie czasowe. Ale na wielu platformach PC są dwie lub trzy pamięci kanały , a cała pamięć RAM na jednym kanale może wspólnie wykonywać tylko jedną rzecz na raz.

W przypadku maszyn NUMA (tych z wieloma gniazdami procesora i „prywatną” pamięcią dla każdego gniazda) wszystko to jest mnożone przez nCPU. tj. każdy procesor może uzyskać dostęp do swojej lokalnej pamięci niezależnie od tego, co robi inny procesor jego pamięć. Jednak wszystkie procesory mogą nadal uzyskiwać dostęp do całej pamięci RAM, po prostu potrzebuje trochę więcej czasu, aby przejść przez inny procesor.

Zasadniczo do kodu aplikacji należy wdrożenie wszelkich wymagań serializacji dotyczących dostępu do współdzielonych danych. Odbywa się to przy pomocy systemu operacyjnego, który zapewni różne obiekty synchronizacji i funkcje do korzystania z aplikacji. Obiekty te mają nazwy takie jak semafory (nazwa zapożyczona z sygnału kolejowego), muteksy (skrót od „wzajemnego wykluczenia”) itp. W zależności od systemu operacyjnego mogą one implementować pojedynczo, n-na-czasie, Ekskluzywny odczyt a współdzielony odczyt itp., semantyka. Funkcje te zazwyczaj obejmują „czekanie” lub „blokowanie”: wątek próbuje np. zdobyć muteks, który z założenia „chroni” wspólny zasób. Jeśli mutex jest już własnością jakiegoś innego wątku, drugi (i _n_th) wątek żądający jest zablokowany, tzn. Czeka i nie wraca z wywołania pozyskiwania, dopóki poprzedni właściciel go nie zwolni.

Do aplikacji należy stosowanie tych technik w razie potrzeby; system operacyjny nie może wymagać tego np. musisz mieć określony muteks przed uzyskaniem dostępu do danych, które miał chronić muteks. Jest to obszar projektowania programu, który może być bardzo trudny zarówno do uzyskania prawidłowego, jak i wysokiej wydajności.

Podsystemy wyższego poziomu, takie jak bazy danych, mają wbudowane kodowanie danych, którymi zarządzają, i prezentują programistom interfejs, który „mówi” w kategoriach elementów bazy danych, a nie obiektów synchronizacji: programista wywołuje funkcje, aby zablokować wiersz tabeli lub pojedyncza komórka lub zestaw wierszy, a może cała tabela podczas wykonywania aktualizacji. Poniżej bazy danych silnik będzie korzystał z urządzeń systemu operacyjnego, jak opisano wcześniej.

Wewnętrznie system operacyjny zazwyczaj realizuje te funkcje synchronizacji za pomocą pewnego rodzaju atomowej operacji testowania i modyfikacji, która jest zaimplementowana w podsystemie pamięci. Przez „atomowy” mam na myśli to, że raz rozpoczęta operacja jest gwarantowana, zanim zakończy się jakakolwiek inna operacja atomowa w zaatakowanej pamięci. Przykładem powszechnie używanym w systemie Windows jest instrukcja „zablokowane porównanie i wymiana”. x86 / x64 faktycznie udostępnia całą serię takich instrukcji, pracujących na różnych rozmiarach danych.

Istnieją metody, które umożliwiają bezpieczny dostęp szeregowy do współdzielonych danych bez użycia takich technik, ale działają tylko w kilku szczególnych przypadkach (np. „Tylko jeden czytnik i tylko jeden pisarz”) lub dla niektórych typów danych.

Jamie Hanrahan
źródło