Rysunek płytki D1 mini z modułem ESP-12Fna niskim poziomie

Podstawy

Czym jest pamięć komputera? Tłumaczę to bez schematów

Pamięć jako ponumerowane szufladki - trzy symulacje: zapis i odczyt, program w pamięci i wyścig rejestru z RAM-em, SSD i HDD.

Okładka filmu: Czym jest pamięć komputerafilm wkrótce na YouTube

Ostatnio opowiadałem o tym, czym jest procesor - że to taki gość, który przełącza swoje przełączniki, zamienia zera na jedynki i wykonuje kolejne instrukcje. Ale przy tej abstrakcji pojawił się problem: jeśli procesor dodaje dwie liczby, to gdzieś ten wynik musi zapisać. Wspomniałem wtedy tylko mimochodem, że jest na to pamięć. Dziś chcę w to wejść trochę głębiej.

Bo jak mówimy „pamięć”, to każdy myśli co innego. Jeden powie RAM, drugi dysk, trzeci że ma 256 giga w telefonie. Pokażę wam uproszczenie, które mi osobiście mega dużo rozjaśniło: każda pamięć to tak na dobrą sprawę ponumerowane szufladki. W każdej szufladce leży liczba, a procesor może powiedzieć „wsadź 30 do szuflady numer 44” albo „daj mi, co jest w szufladzie 44”. I tyle. Różne rodzaje pamięci różnią się właściwie tylko tym, jak szybko można się do nich dostać - do tego jeszcze wrócę.

Szufladki pamięci

Nie dzielmy sobie na razie pamięci na RAM, dysk twardy czy cokolwiek innego - nie ma takiej potrzeby. Zróbmy to na samych szufladkach i na tym, czego potrzebuje procesor.

Interaktywny symulator - najlepiej działa w pełnym oknie
Dla lepszego efektu otwórz symulator w pełnym oknie.o symulatorze →

Po lewej stronie mamy procesor, po prawej sto szufladek ponumerowanych od 0 do 99. W każdej z nich można zapisać jakieś dane - procesor może do takiej szufladki coś dodać, pobrać z niej dane albo coś z nimi policzyć i wynik umieścić w kolejnej szufladce.

Od razu warto zauważyć, że w szufladkach już na starcie są jakieś liczby, mimo że program jeszcze nic nie zrobił. To śmieci po poprzednich programach - pamięć nigdy nie jest pusta, więc zawsze trzeba coś ustawić, zanim się to odczyta.

Dałem sobie kilka instrukcji, które przypominają prawdziwy assembler.

Pierwszy krok symulacji: procesor pobiera wartość z szuflady numer 44
Krok pierwszy: pobierz wartość z szuflady 44

Pierwsza instrukcja: pobierz wartość z szuflady 44. Procesor wysuwa tę szufladę, bierze z niej liczbę i trzyma ją u siebie. Druga instrukcja: zapisz wartość 38 do szuflady 77 - i to, co wcześniej było w 77, po prostu przepada. Żadnego kosza, zwykłe nadpisanie.

Trzecia instrukcja jest dla mnie najważniejsza: pobierz liczby z szuflad 66 i 11, dodaj je, a wynik zapisz do szuflady 2. Same szufladki nie umieją liczyć - obie liczby muszą najpierw przylecieć do procesora, tam dopiero następuje dodawanie, a wynik wraca do pamięci. Pamięć tylko przechowuje. Liczy zawsze procesor.

A tu jest coś, co mi się szczególnie spodobało.

Procesor pobiera jednym ruchem cały zakres szuflad 13-19, bo leżą obok siebie w pamięci
Pobranie całego zakresu szuflad 13-19 naraz

Jeśli dane są ułożone w pamięci jedno obok drugiego, to można je pobrać wszystkie naraz, jednym ruchem - tutaj szufladki od 13 do 19 lecą do procesora razem. Gdyby były porozrzucane po całej pamięci, trzeba by wyciągać je pojedynczo. I to jest mały sekret szybkich programów: trzymać dane, które są ze sobą powiązane, obok siebie w pamięci.

Program też leży w pamięci

Jest jednak jedna rzecz, która kiedyś w ogóle nie przyszła mi do głowy: skąd procesor wie, co ma robić? Gdzie w ogóle jest ten program? Odpowiedź jest taka, że program leży dokładnie w tych samych szufladkach, co liczby.

Interaktywny symulator - najlepiej działa w pełnym oknie
Dla lepszego efektu otwórz symulator w pełnym oknie.o symulatorze →

W tej symulacji szufladki od 11 do 17 to już nie dane, tylko nasz program. Zanim procesor cokolwiek zrobi, najpierw wysuwa szufladę 11 i wyciąga z niej polecenie. Dopiero gdy je przeczyta, wykonuje je. Potem to samo dla szuflady 12, potem 13 - i tak w kółko, po kolei.

Symulator w trakcie działania: rejestry (czerwone) i cache (niebieskie) w środku procesora, program i dane obok siebie w RAM-ie
Rejestry i cache siedzą w środku procesora

I tu jest clou całej sprawy: dla pamięci nie ma żadnej różnicy, czy w szufladzie leży liczba, czy polecenie. To zawsze jest po prostu liczba. Dlatego w MacBooku, w pralce czy w moim mikrokontrolerze zasada jest dokładnie ta sama: program to liczby w pamięci, a procesor wyciąga je po kolei i wykonuje. Mogę nawet w którejś instrukcji powiedzieć procesorowi, żeby zamiast iść dalej po kolei, skoczył od razu do zupełnie innego miejsca w programie, np. do instrukcji numer 27 - i dokładnie tak działają w prawdziwych programach pętle i warunki.

Zwróćcie też uwagę na jedną rzecz względem poprzedniej symulacji: tam wszystkie pamięci traktowałem tak samo, tylko kolorowałem je na czerwono, niebiesko, fioletowo czy zielono. Tutaj już je rozdzieliłem, bo rejestry i cache to pamięci, które producent procesora wbudowuje bezpośrednio w sam wafelek krzemowy. Jest ich bardzo niewiele, ale za to są turbo szybkie. RAM i dysk twardy to już coś innego - i o tej różnicy prędkości opowiem za chwilę.

Jak z tego powstaje obraz na ekranie

Ktoś może się teraz zastanowić: dobra, wrzucamy sobie liczby do szufladek, ale przecież na komputerze czy telefonie mam piękny ekran, obraz, mogę we wszystko klikać - jak to się ma do tych szufladek?

Tu znowu pojawia się spryt inżynierów sprzed lat. Wystarczy ustawić liczby w konkretnych pozycjach pamięci tak, żeby każda z nich reprezentowała jeden piksel obrazu. Procesor cały czas to przelicza, dzięki czemu obraz się odświeża, a inny układ - już nie ten główny procesor, tylko kolejny, wyspecjalizowany - bierze te piksele i wrzuca je na ekran. W prawdziwym komputerze pikseli są oczywiście miliony, ale zasada jest identyczna, jakby chodziło tylko o kilkadziesiąt komórek pamięci.

To jednak tylko generowanie samego obrazu - jakby wyświetlanie filmu. Osobną sprawą jest to, że komputer na bieżąco śledzi, gdzie znajduje się wasza myszka, i jeśli zostanie kliknięta w jakimś miejscu, uruchamia coś innego i zmienia obraz. Mamy wtedy wrażenie, że komputer „wie”, że tam kliknęliśmy - ale to nie jest żadna magia, tylko zwykłe sprawdzanie pozycji i reagowanie na nią.

Wyścig pamięci - jak bardzo różnią się prędkością

Na koniec zostawiłem sobie coś, co osobiście zwala mnie z nóg za każdym razem, jak o tym myślę.

Interaktywny symulator - najlepiej działa w pełnym oknie
Dla lepszego efektu otwórz symulator w pełnym oknie.o symulatorze →

Procesor wysyła naraz pięć próśb „podaj komórkę 44” - do rejestru, cache'u L1, RAM-u, SSD i starego dysku HDD. Każdy musi dobiec do swojej pamięci i wrócić z odpowiedzią. Żeby to w ogóle dało się zobaczyć, czas jest tu rozciągnięty: jeden takt procesora, czyli jedno pyknięcie przełącznikiem (normalnie ułamek nanosekundy), trwa tutaj całą sekundę.

Wyścig pamięci w trakcie: rejestr blisko mety, cache dalej, a RAM, SSD i HDD ledwo ruszyły ze startu
Wyścig w trakcie - RAM, SSD i HDD ledwo ruszyły

Popatrzcie, jak to wygląda po kilkudziesięciu sekundach tej symulacji: rejestr już prawie dobiegł do mety, cache jest w połowie trasy, a RAM przebył dopiero 12% drogi - w tej skali RAM potrzebuje około 5 minut, żeby wrócić z jedną liczbą. SSD i HDD w ogóle nie widać, żeby drgnęły: SSD wraca po około dwóch dniach, a stary dysk HDD - po roku. Po roku, z jedną liczbą.

I jeszcze jedno jest tu ciekawe: obok tego rozciągniętego zegara mamy też informację, ile czasu minęło naprawdę, w prawdziwym procesorze. Patrzymy na symulację kilkanaście sekund, a w rzeczywistości minęło kilkanaście nanosekund. Te liczby są kompletnie poza wyobrażeniem ludzkiego umysłu. I właśnie dlatego mamy tyle różnych rodzajów pamięci: szybka pamięć jest droga i mała, wolna jest tania i duża, a procesor stara się trzymać to, czego aktualnie potrzebuje, jak najbliżej siebie.

Podsumowanie

Pamięć to ponumerowane szufladki. Procesor umie z nich wyjąć liczbę, włożyć liczbę i coś u siebie policzyć - ale liczy zawsze u siebie, nigdy w samej pamięci. Różne rodzaje pamięci różnią się przede wszystkim prędkością, i to na tyle drastycznie, że jeśli jeden takt to sekunda, to RAM to już 5 minut, a stary dysk HDD - rok. Sam program też leży w tych samych szufladkach co dane: procesor najpierw go stamtąd wyciąga, instrukcja po instrukcji, a dopiero potem wykonuje.

W następnym odcinku pójdę jeszcze krok dalej i pokażę symulator, w którym procesor wykonuje prawdziwą pętlę: dodaje, porównuje i skacze z powrotem. Zobaczycie, jak to wygląda w prawdziwym assemblerze - języku, którym procesor naprawdę mówi. I okaże się, że takie zwykłe „if” to w procesorze tak naprawdę jedna mała flaga.