Model spójności jest tylko pewnego rodzaju opisem „matematycznym” własności systemu. Jego implementacja wymaga zaprojektowania odpowiedniego protokołu spójności czyli algorytmu rozproszonego dostarczającego gwarancji modelu spójności. Konstrukcja protokołu musi uwzględnić lokalizację replik i mechanizmów ich aktualizacji.
Zwiększanie efektywności przetwarzania może być rozpatrywane w dwóch kontekstach. Przy wzrastającej liczbie żądań pojedynczy serwer może być niewystarczający. Należy w takiej sytuacji system skalować w sensie liczbowym, wprowadzając serwery-repliki. Umożliwi to współbieżne wykorzystanie mocy obliczeniowych tych jednostek przez wielu klientów. Oczywiście należy zadbać, aby w miarę możliwości obciążenie serwerów było równomierne.
Z drugiej strony systemy rozproszone mogą wymagać skalowania w sensie geograficznym, co może zaowocować zbliżeniem się serwerów do użytkowników końcowych. W efekcie będą oni obserwować mniejsze opóźnienia komunikacyjne. Trzeba jednak pamiętać, że serwery muszą utrzymywać dane w stanie spójnym. Jeżeli są odległe od siebie, to koszty komunikacji związanej z synchronizacją danych będą odpowiednio wyższe, a w skrajnym przypadku mogą przekraczać zyski z lokalizacji bliżej klienta.
Zwielokrotnienie obiektu musi być pewien sposób nadzorowane tak, aby uniknąć problemów ze spójnością. Jednym z możliwych rozwiązań jest np. wymuszenie wykonywania metod na poszczególnych kopiach w tej samej kolejności. Przy założeniu determinizmu przetwarzania w obiektach, stan końcowy po serii wywołań tych samych metod z tymi samymi argumentami powinien być identyczny. Synchronizację taką można przeprowadzić na dwa sposoby. W pierwszym podejściu (rysunek a) obiekt replikowany jest świadomy istnienia innych kopii i sam współuczestniczy w koordynacji aktualizacji poszczególnych kopii. System operacyjny w takim rozwiązaniu nie musi wspierać w żaden sposób zwielokrotniania. Wywołania metod są synchronizowane samodzielnie przez obiekt. Zaletą tego podejścia jest możliwość adaptacji strategii zwielokrotniania do faktycznych potrzeb danego obiektu bez potrzeby rekonfiguracji całego systemu.
Druga metoda (rysunek b) zakłada, że obiekty nie są świadome zwielokrotniania, co oznacza, że cały ciężar zarządzania spójnością spada na warstwę pośrednią (ang. middleware ). System musi w tym przypadku zagwarantować globalne uporządkowanie wszystkich wywołań metod na wszystkich obiektach, co nie zawsze jest konieczne. Jest natomiast wygodne dla programistów samych obiektów, ponieważ nie muszą ich programować w żaden specjalny sposób.
Pierwsze polega na wykonywaniu zdalnego dostępu do danych. W podejściu tym każdy dostęp do współdzielonego obiektu, zlokalizowanego fizycznie w pamięci lokalnej innego węzła, odbywa się przez sieć. Wymaga to oczywiście przesłania komunikatów, co wiąże się ze znacznymi opóźnieniami. Zaletą tego podejścia jest jego prostota. W systemie jest jedna kopia danych, do której się wszyscy odwołują.
Drugie rozwiązanie próbuje zaradzić sytuacji, gdy do obiektu odwołuje się bardzo często pojedynczy proces lub grupa procesów zlokalizowanych na innym komputerze niż sam obiekt. Jeżeli założymy, że możliwa jest zmiana fizycznej lokalizacji współdzielonego obiektu (relokacja ), czyli umieszczenie go w pamięci lokalnej węzła, w którym pojawiło się żądanie dostępu, to potencjalnie możemy znacząco skrócić czas kolejnych dostępów do tych danych. Podejście to będzie opłacalne w przypadku aplikacji, w których występują zgrupowane, seryjne odwołania do obiektów z pojedynczych węzłów. W takiej sytuacji opłacalne będzie ponoszenie kosztów przenoszenia (potencjalnie dużego) obiektu między węzłami.
Trzecie rozwiązanie polega na zastosowaniu zwielokrotniania ; obiekt logiczny może być jednocześnie zlokalizowany fizycznie w pamięci lokalnej wielu węzłów, co umożliwia równoległy dostęp do tego obiektu w wielu węzłach. Podstawowym problemem jest w tym przypadku sygnalizowana wcześniej spójność danych.
Innym problemem związanym ze stosowaniem relokacji jest kwestia właściwego doboru rozmiaru i struktury obiektu . Utrzymywanie małych obiektów umożliwia podział wspólnych danych na serwery, w których występują odwołania do nich. Z drugiej jednak strony z każdym obiektem związane są pewne struktury danych przechowujące informację zarządzającą (bieżący adres, tryb dostępu, właściciel itp.). Stosowanie dużych obiektów nie obciąża systemu dużymi kosztami administracyjnymi, ale wymaga sporych nakładów podczas przenoszenia obiektów z węzła na węzeł. W efekcie mamy tu do czynienia z kompromisem między zyskiem związanym z lokalnym dostępem a kosztami związanymi z zarządzaniem i relokacją obiektów. Pewnym rozwiązaniem jest stosowanie podejścia strukturalnego (hierarchicznego) do tworzenia obiektów. Obiekt jako całość może mieć wyodrębnione swoje – w miarę niezależne – części, które mogą być przemieszczane w oderwaniu od obiektu głównego.
Ostatnim istotnym problemem relokacji jest problem migotania , polegający na nieustannym przenoszeniu obiektu między dwoma lub większą liczbą węzłów, z powodu występujących na tych węzłach odwołań. Sytuacja taka może mieć miejsce, gdy procesy naprzemiennie odwołują się do wspólnych danych. W tym przypadku bardziej opłacalne może się okazać pozostawienie obiektu w jednym z tych węzłów i realizowanie pozostałych odwołań zdalnie. Chcąc uniknąć takiego przypadku, system musi monitorować charakterystykę odwołań do obiektu i szacować prawdopodobieństwo lokalizacji przyszłych odwołań.
Po utworzeniu kopii na serwerze, na którym zażądano dostępu do danych, następuje udostępnienie nowej kopii procesowi. Posiadanie wielu kopii danych pozwala wykonywać do nich dostęp współbieżnie na wielu serwerach. Daje to szczególnie dobre efekty w sytuacji, gdy wykonywany jest dostęp typu odczyt. Z reguły dostępy nie modyfikujące stanu obiektów dominują, co jest przesłanką do tworzenia dodatkowych kopii danych. Wprowadzenie modyfikacji wymaga bowiem zsynchronizowania wszystkich kopii dla uniknięcia niespójności danych.
Podobieństwo do relokacji występuje również w kwestii tworzenia kopii obiektów i ich aktualizacji. W przypadku zwielokrotniania podobnie występuje problem doboru odpowiedniego rozmiaru obiektu, a także jego struktury.
Zaletą zwielokrotniania jest to, że w zasadzie eliminuje problem migotania. Jeżeli dane są potrzebne w wielu miejscach jednocześnie (do odczytu), to wystarczy utworzyć odpowiednią liczbę kopii i dalsze przetwarzanie może być kontynuowane bez potrzeby komunikacji.
Problemem specyficznym dla zwielokrotniania jest natomiast spójność danych. Istnienie wielu kopii jest korzystne z punktu widzenia procesów czytających, ale staje się sporym problemem dla systemu, gdy zachodzi konieczność aktualizacji tych wszystkich replik.
Rozwiązaniem, które jest skrajnie odmienne od przedstawionego powyżej jest zarządzanie danymi na poziomie elementarnych zmiennych. Zaletą tego podejścia jest ścisłe powiązanie z logiką aplikacji i językiem programowania. Zmienne z reguły są jednostkami niepodzielnymi, których modyfikacje mogą być w prosty sposób przekazane do innych węzłów poprzez kopiowanie. Podstawowa wada tej metody to bardzo duży narzut administracyjny wynikający z małego rozmiaru zmiennych. Dane służące do zarządzania dzielonymi zmiennymi mogą zajmować więcej miejsca niż same zmienne.
Pewnym kompromisem w tym względzie jest podejście obiektowe, w którym rozmiar obiektu jest różny, w zależności od złożoności jednostki. Obiekt może zawierać wewnątrz prostą zmienną (np. licznik), ale może równie dobrze reprezentować np. całą bazę danych. Efektywne zarządzanie zwielokrotnianiem obiektów wymaga jednak aby system w jakiś sposób „rozumiał” obiekty, a więc potrafił automatycznie uzyskać informacje dotyczące semantyki poszczególnych metod (np. tylko do odczytu, modyfikująca itd.).
Unieważnianie (ang. invalidation ) polega na zmianie statusu zdalnych kopii danych tak, aby nie mogły już być wykorzystywane, co efektywnie może być traktowane jako usunięcie repliki. Komunikaty unieważniające są małe ponieważ muszą zawierać jedynie identyfikator strony, która ma ulec unieważnieniu. Zaletą unieważniania jest brak konieczności dalszej komunikacji z serwerem w przypadku wprowadzania następnych modyfikacji – kopia przestała bowiem już istnieć. Unika się w ten sposób również przesyłania aktualizacji, które być może nigdy nie zostałyby wykorzystane (odczytane) przez innych użytkowników, co powodowałoby jedynie zwiększenie obciążenia komunikacyjnego w systemie. Wadą natomiast jest konieczność wysłania następnego komunikatu z aktualną kopią danych, jeżeli dane te faktycznie są jednak potrzebne.
Drugim podejściem stosowanym w protokołach koherencji jest aktualizacja (ang. update protocol ). Polega ona na każdorazowym przesyłaniu komunikatu aktualizującego stan repliki. Komunikat taki może zawierać całość zaktualizowanego stanu obiektu lub jedynie zmianę względem poprzedniej wersji. W podejściu tym przesyłane komunikaty są większe, bo muszą zawierać również aktualizowane dane. Komunikaty muszą również być wysyłane praktycznie po każdej aktualizacji, chyba, że z własności modelu wynika, że dane te nie będą wykorzystywane, co pozwala na zgrupowanie kilku aktualizacji w jednym komunikacie (grupowanie takie może też dotyczyć kilku aktualizacji różnych obiektów). Zaletą tego rozwiązania jest natychmiastowa dostępność zaktualizowanych replik w poszczególnych węzłach. Może się jednak zdarzyć, że aktualizacje te nie będą w ogóle odczytywane.
Jednym z istotnych problemów związanych z zarządzaniem rozproszoną pamięcią jest kwestia lokalizacji stron. W systemie IVY zaimplementowano i przetestowano trzy rozwiązania. Pierwsze, najprostsze, polega na zastosowaniu scentralizowanego zarządzania, w którym dedykowany węzeł przechowuje całość informacji o aktualnym położeniu poszczególnych stron pamięci. Rozwiązanie to sprawdza się dobrze, gdy w systemie działa taki dedykowany system i gdy liczba serwerów nie jest zbyt duża. Przy większej liczbie węzłów centralny serwer w sposób naturalny staje się wąskim gardłem.
Drugie rozwiązanie problemu lokalizacji polega na rozłożeniu zadania odwzorowywania stron na wiele serwerów. Rozkład ten jest statyczny: na podstawie numeru strony oblicza się identyfikator węzła, który jest zarządcą tej strony (np. modulo liczba węzłów). Dzięki temu rozwiązaniu każdy serwer wie do kogo wysyłać komunikat z zapytaniem o lokalizację strony. Statystycznie rzecz biorąc każdy węzeł powinien być podobnie obciążony zadaniem odwzorowywania stron. Lokalizacja wymaga w tym przypadku tyle samo komunikatów co w przypadku podejścia scentralizowanego. Wadą tego rozwiązania jest pewna jego statyczność: dodanie nowego serwera jest trudne do zrealizowania, bo wymagałoby zmiany przypisań stron do serwerów.
Trzecie rozwiązanie to zastosowanie dynamicznej lokalizacji. Jest to podejście oparte na wskaźnikach naprowadzających, opisywanych na wykładzie dotyczącym nazewnictwa. Każdy węzeł posiada tablicę odwzorowującą lokalizację poszczególnych stron. Tablica ta nie koniecznie zawiera aktualne i prawdziwe informacje. Jest to informacja o prawdopodobnej lokalizacji stron. Lokalizacja strony polega na wysłaniu zapytania do serwera, który jest podejrzewany o jej przechowywanie. Jeżeli jest to prawdą, odesłany zostanie komunikat z potwierdzeniem. Jeżeli nie, zapytanie zostanie przesłane do węzła, który jest podejrzewany przez węzeł właśnie odpytywany, itd. Na rysunku węzły oznaczone są etykietami w kwadratach. Węzeł S1 wysyła zapytanie do S2, bo podejrzewa właśnie S2 o posiadanie poszukiwanej strony. S2 jednak jej nie posiada i przekazuje zapytanie do S3, bo podejrzewa właśnie S3. S3 faktycznie stronę posiada i odpowiada węzłowi S1.
Wskaźniki naprowadzające sprawdzają się dobrze w przypadku niedużej liczby węzłów. Ponieważ ścieżki wskazujące ulegają skróceniu przy każdym odpytywaniu (S1 aktualizuje swoje wskazanie z S2 na S3), średnia długość ścieżki, którą w praktyce przebiegają zapytania pozostaje krótka. Wynika to również z częstego odwoływania się do stron.
Realizacja operacji dostępu do danych w przypadku stosowania rozproszonej statycznej lokalizacji wygląda bardzo podobnie. Jedyna różnica polega na wyborze węzła, który pełni rolę zarządcy. Komunikat lokalizujący stronę wysyłany jest do węzła, któremu przypisano funkcję zarządzania odpowiednią stroną, a nie do centralnego zarządcy.