Podsystem pamięci w nowoczesnym procesorze jest ograniczony do dostępu do pamięci w stopniu szczegółowości i wyrównania wielkości słowa; dzieje się tak z wielu powodów.
Prędkość
Nowoczesne procesory mają wiele poziomów pamięci podręcznej, przez które dane muszą być pobierane; obsługa odczytów jednobajtowych spowodowałaby, że przepustowość podsystemu pamięci byłaby ściśle związana z przepustowością jednostki wykonawczej (zwanej także procesorem); wszystko to przypomina, w jaki sposób tryb PIO został wyprzedzony przez DMA z wielu tych samych powodów na dyskach twardych.
Procesor zawsze odczytuje rozmiar słowa (4 bajty na 32-bitowym procesorze), więc gdy wykonasz niezrównany dostęp do adresu - na procesorze, który go obsługuje - procesor odczyta wiele słów. Procesor odczyta każde słowo pamięci, które mieści się w żądanym adresie. Powoduje to zwiększenie do dwukrotności liczby transakcji pamięci wymaganych do uzyskania dostępu do żądanych danych.
Z tego powodu bardzo łatwo można odczytać dwa bajty niż cztery. Załóżmy na przykład, że masz strukturę pamięci, która wygląda następująco:
struct mystruct {
char c; // one byte
int i; // four bytes
short s; // two bytes
}
W 32-bitowym procesorze najprawdopodobniej byłby wyrównany, jak pokazano tutaj:
Procesor może odczytać każdego z tych członków w jednej transakcji.
Załóżmy, że masz spakowaną wersję struktury, być może z sieci, w której została zapakowana w celu zwiększenia wydajności transmisji; może wyglądać mniej więcej tak:
Czytanie pierwszego bajtu będzie takie samo.
Gdy poprosisz procesor o podanie 16 bitów z 0x0005, będzie musiał odczytać słowo z 0x0004 i przesunąć w lewo o 1 bajt, aby umieścić go w rejestrze 16-bitowym; dodatkowe prace, ale większość może sobie z tym poradzić w jednym cyklu.
Gdy poprosisz o 32 bity od 0x0001, otrzymasz wzmocnienie 2X. Procesor wczyta z 0x0000 do rejestru wyników i przesunie w lewo o 1 bajt, a następnie wczyta ponownie z 0x0004 do rejestru tymczasowego, przesunie w prawo o 3 bajty, a następnie OR
z rejestrem wyników.
Zasięg
W przypadku dowolnej przestrzeni adresowej, jeśli architektura może założyć, że 2 LSB mają zawsze wartość 0 (np. Maszyny 32-bitowe), może uzyskać dostęp do 4 razy większej pamięci (2 zapisane bity mogą reprezentować 4 różne stany) lub taką samą ilość pamięci z 2 bitami na coś w rodzaju flag. Usunięcie 2 LSB z adresu dałoby wyrównanie do 4 bajtów; nazywany także krokiem 4 bajtów. Za każdym razem, gdy adres jest zwiększany, efektywnie zwiększa bit 2, a nie bit 0, tzn. Ostatnie 2 bity zawsze będą nadal 00
.
Może to nawet wpłynąć na fizyczną konstrukcję systemu. Jeśli magistrala adresowa potrzebuje 2 bitów mniej, procesor może mieć o 2 mniej pinów i o 2 mniej śladów na płytce drukowanej.
Atomowość
CPU może działać atomowo na wyrównanym słowie pamięci, co oznacza, że żadna inna instrukcja nie może przerwać tej operacji. Ma to kluczowe znaczenie dla prawidłowego działania wielu struktur danych bez blokady i innych paradygmatów współbieżności .
Wniosek
System pamięci procesora jest nieco bardziej złożony i zaangażowany niż tutaj opisano; pomocna może być dyskusja na temat tego, w jaki sposób procesor x86 adresuje pamięć (wiele procesorów działa podobnie).
Istnieje wiele innych korzyści związanych z dostosowaniem pamięci, które można przeczytać w tym artykule IBM .
Podstawowym zastosowaniem komputera jest przekształcanie danych. Nowoczesne architektury i technologie pamięci zostały zoptymalizowane na przestrzeni dziesięcioleci, aby ułatwić uzyskiwanie większej ilości danych, wprowadzanie, wyprowadzanie oraz pomiędzy większą liczbą szybszych jednostek wykonawczych - w wysoce niezawodny sposób.
Bonus: Skrytki
Innym wyrównaniem do wydajności, o którym wspominałem wcześniej, jest wyrównanie w liniach pamięci podręcznej, które są (na przykład w niektórych procesorach) 64B.
Aby uzyskać więcej informacji o tym, ile wydajności można uzyskać dzięki wykorzystaniu pamięci podręcznej, zobacz Galerię efektów pamięci podręcznej procesora ; z tego pytania na temat rozmiarów linii pamięci podręcznej
Zrozumienie linii pamięci podręcznej może być ważne dla niektórych rodzajów optymalizacji programu. Na przykład wyrównanie danych może określać, czy operacja dotyka jednej, czy dwóch linii pamięci podręcznej. Jak widzieliśmy w powyższym przykładzie, może to łatwo oznaczać, że w przypadku niewspółosiowości operacja będzie dwa razy wolniejsza.