Perspektywa to ciekawa sprawa. Czasem zdroworozsądkowa obserwacja otaczającego nas świata daje zupełnie błędny obraz rzeczywistości.
Kiedy ludzie – w czasach przed Galileuszem i Kopernikiem – patrzyli na niebo i podziwiali pędzące przez sklepienie słońce, wiedzieli, że to ono się porusza względem ziemi. Ruch było widać gołym okiem, ziemia się nie poruszała. W tej obserwacji nie było nic złego; zły był punkt widzenia z którego przyszło nam doświadczać tej astronomicznej gonitwy.
Zostawmy jednak kosmos i przenieśmy się przed nasze biurko. Hurra, będzie znów o komputerach! Dokładniej: o pamięci.
„Memory is RAM.” – Moss, IT Crowd
W czasach komputerów ośmio- i szesnastobitowych ilość pamięci była zapisywana złotymi literami w reklamach. Co więcej – rozmiar dostępnej pamięci był często częścią nazwy komputera, że wspomnę tylko Commodore 64 (65536 bajtów) czy Atari 1024ST (1024 kiB).
W dalszych przykładach komputer-archeologii będę się posługiwał C64 – głównie dlatego, że mam jakieś tam kompetencje by mówić o jego budowie, a na dodatek jego prymitywny BASIC (wiele mogę odpuścić Microsoftowi, ale nie to) zmuszał każdego domorosłego programistę do zapoznania się z arkanami czarnej magii związanymi z zapisywaniem danych do pamięci celem wyduszenia z pudła choćby jednego pisku czy koloru.
Nie wchodząc w szczegóły możemy wyobrazić sobie pamięć Commodore jako serię 65536 pudełek, w które możemy wsadzić wartości od 0 do 255. Część tej pamięci była przeznaczona dla Ciebie, twórcy: mogłeś tam składać swoje dane, programy czy co tam akurat chciałeś. Część pamięci spełniała jednak specjalne zadanie i zapisywanie do niej informacji mogło modyfikować stan komputera oraz specjalizowanych układów scalonych. Najłatwiej będzie mi zademonstrować (tylko to pamiętam) jak działało bezpośrednie zapisywanie do pamięci odpowiedzialnej za tryb tekstowy.
Pamięć ekranu mieściła się pod adresem 1024 i zajmowała jeden kilobajt. Umieszczenie w niej wartości powodowało wyświetlenie znaku. Gdybym chciał napisać EMIL w górnym rogu ekranu i był samobójcą, musiałbym wydać cztery polecenia POKE (zapis wartości w komórce pamięci).

Koszmarne? Oczywiście. Demonstruje jednak sposób, w jaki dawaliśmy sobie radę z pamięcią: pamięć była lub jej nie było. Nie było współczesnych problemów wielozadaniowości – jeżeli pamięć się skończyła byłeś najczęściej w kanale analnym. System nie zajmował się „zarządzaniem pamięcią” tak jak ma to miejsce teraz.
Przewińmy do komputerów 16-bitowych, przy których można już mówić o „prawdziwych systemach operacyjnych”. Znaczyło to tyle, że chodzenie po pamięci i wkładanie tam swoich brudnych bajtów uznawano za faux pas – ale jak ze wszystkimi przewinieniami w etykiecie, tak i tu nie powstrzymało to nikogo przed pchaniem paluchów gdzie nie wypada.
Załóżmy jednak, że wszyscy byliśmy mądrzy i robiliśmy dobrze.
Sytuacja z przykładu o C64, gdzie pamięć pomiędzy X a Y była Twoja, nie mogła mieć już miejsca. Komputery miały różne konfiguracje, aplikacje chodzące w tle mogły już zająć kawałek pamięci. Gdybyś po prostu zapisywał dane na łapu-capu, mógłbyś trafić na jakąś witalną część i powiesić system.1 Przyszedł czas żebrania: „Drogi komputerze kochany, potrzebuję z dwieście kilobajtów w jednym ciągu; chciałbym tam zapisywać informacje. Bardzo ładnie proszę!” System operacyjny rozważał Twoją prośbę i odpowiadał false, co oznaczało konieczność poinformowania użytkownika, że pamięci nie ma, lub dawał Ci wskaźnik do zarezerwowanej dla Ciebie pamięci, w której mogłeś sobie bezpiecznie buszować.
System teoretycznie wiedział, co się dzieje z pamięcią. Teoretycznie, gdyż nagminną sytuacją było obchodzenie żmudnego procesu przydzielania pamięci poprzez przekazywanie danych o zajętej pamięci między aplikacjami – bez informowania o tym systemu. Gdy program wyżebrał już pamięć, nie informował najczęściej systemu co z nią robi. Jeżeli inna część programu (a czasem inny program) miały mieć dostęp do tych samych danych, program po prostu podawał dalej adres pamięci, którą przydzielił mu system operacyjny.
Zilustruję to kiepską analogią: Wynajmujesz pokój hotelowy. Dostajesz klucze. Aby zaoszczędzić przekazujesz je innym znajomym i tak pakujecie się w kilka osób na krzywy ryj. Możesz spać spokojnie dopóki któryś z Twoich podchmielonych kompanów nie podpali firanek. Nie będziesz wiedział kto je podpalił, nie będziesz mógł się wyspać, a na dodatek wszystko jest na Twoje nazwisko.
Przekazywanie adresów było niezmiernie efektywne (stąd wydajność takich systemów jak AmigaOS) i tylko trochę bardziej niebezpieczne niż żonglowanie piłami spalinowymi.
Po raz pierwszy pamięć zaczyna być zasobem, z którym należy się liczyć. Czym więcej pamięci zostawało Ci po włączeniu komputera tym większy był Twój e-penis.2 Czasem trzeba było wybierać: podkład z „Czarodziejek z Księżyca”3 czy dodatkowy usprawniacz? Obserwowanie „belki” na której znajdował się stan pamięci stało się czymś naturalnym. Czym więcej pamięci było zajętej, tym więcej programów zostało uruchomionych. Proste.
Teraz dochodzę do momentu, który zrodził ten tekst: do czasów współczesnych.
Piotr zaktualizował system Wielki Śnieżny Kot na komputery z Cupertino. Zgodnie z przewidywaniami szybko zaczął marudzić w socjalsieci jak to Jobs znów go zrobił w męski narząd. Ponieważ nie znam się na współczesnych komputerach (jestem biednym posiadaczem PIII, który chodzi pod kontrolą darmowego systemu dla brudnych hipisów z łojotokiem) próbowałem podtrzymać go na duchu.
Próbowałem póki nie wyjawił mi powodu narzekania – jego system zajmuje bardzo dużo pamięci.
Powiedzmy sobie od razu: współczesne systemy operacyjne zajmują och-tak-wiele miejsca. Workbench 3.1 + dodatki + cukierki spokojnie mieścił się w 20 MiB. Teraz? DVD. Kiedyś system odpalał się na 128 kiB pamięci; teraz dranie chcą gigabajta żeby chociaż pełzał. Do tego kiedyś okna otwierały się szybciej, niż teraz.
(Trawa zieleńsza, kobiety piękniejsze i człowiek nie musiał się golić tak często.)
Mógłbym tu przytoczyć wiele argumentów tłumaczących, czemu tak się dzieje: że rozdzielczość niebotyczna, że protokoły sieciowe, że siedem tysięcy drukarek, że usługi, że komfort. To jednak rzecz na inną notkę.
„Dlaczego tyle pamięci zajęte‽”
Kiepska analogia numer dwa: Po latach ciężkiej pracy dorobiłeś się basenu. Basen ma cztery gigabajty4, a Ty nalewasz wody tylko do kostek, żeby się górne partie nie zniszczyły.
W 2011 pamięć nieużyta jest pamięcią zmarnowaną. W przeciwieństwie do lat dziewięćdziesiątych większość komputerów ma dość pamięci, aby wczytać system operacyjny i kilka programów bez obciążania nawet połowy dostępnych zasobów. Co z resztą?
Resztą zajmuje się system operacyjny. Czasy, gdy byłeś panem swojej maszyny, skończyły się dawno temu. Przesiadłeś się z roweru do promu kosmicznego i płaczesz, że nie ma gdzie dobrze przykręcić dzwonka. Wolna pamięć jest używana jako pamięć podręczna5, co znacząco przyspiesza działanie komputera.
Najgorsze, co można zrobić – i co zrobił Piotr – to zaufać wszelkiej maści ekspertom, którzy piszą w Internecie o pamięci!6 Piotr zainstalował program, który „odzyskuje” pamięć od systemu operacyjnego.
Analogia numer trzy, kiepska jak poprzednie: Twoja willa ma własnego kucharza, który przygotowuje Ci obiad. Masz pięć garnków. Kucharz używa pięciu, dzięki czemu praca idzie mu wartko. Zatrudniasz więc gościa, który stoi nad kucharzem i co chwila zabiera mu dwa z nich, rzucając przez zęby „pańskie!”. Tak, masz przez większość czasu dwa puste garnki, ale kucharz nie robi dobrej roboty, a Ty płacisz jakiemuś idiocie, żeby go terroryzował.
Pomiędzy Commodore 64 i Twoim latopem z aluminium jest ogromna różnica. Pomysł, że mógłbyś ręcznie zarządzać wszystkimi aspektami systemu (w tym pamięcią) jest bzdurny. Obecnie Twój system zajmuje się nie tylko alokacją pamięci, ale także jej ochroną (program, który nie prosił o konkretny kawałek pamięci nie może do niego pisać), odpowiada za jej stronicowanie, losuje adresy tak, aby źli królewicze z Afryki nie zgadli, gdzie w pamięci uruchomi się następny program, śledzi zasoby tak, aby pamięć zajętą przez martwe programy dało się odzyskać. Tak, masz „mniej pamięci” niż kiedyś, ale nie musisz pływać w wodzie po kostki.
Dotarłeś do końca. Czas na nową przygodę.
Eri pokonuje korporacje ołówkiem. Czerski, Piotr dziwi się światu. Waglowski prawi o prawie. Maciej występuje w roli służbisty ateistyczno-sceptystycznej religii. Patryk maca się z technologią. Piwnice i trywialne informacje w tę stronę. Vontrompka, czyli komentarz psychodeliczny.
Są też tacy, którzy gadają. O filmach, scepty-cyźmie, japońskich bajeczkach. Nie zapomnij też, że trzeba rozumieć popularną naukę.
August 8th, 2011 at 05:59
Z tym ST to było 520ST i 1040ST, więc nie bardzo to miało wspólnego z pamięcią :)
August 8th, 2011 at 06:33
Tylko, że większość tych ficzerów, którymi zajmuje się system operacyjny (OK, losowania nie jestem pewien; system operacyjny – tu masz na myśli goły kernel?) jest obecna od lat, a zapotrzebowanie systemów na pamięć nadal rośnie. Raczej nie za sprawą kernela. I nie tylko na aluminiowych sprzętach.
Warto jeszcze wspomnieć o wpływie architektury (ilość bitów) i opcji kompilacji (Os vs O2 albo, co gorsza O3) na zajętość pamięci.
August 8th, 2011 at 08:51
@byte
byłem pewien, że 520 miał 512 a 1024 miał megabajt (w stocku?)
@rozie
Wiem, że „systemy miały od lat”. Opisywałem tu głównie komputery domowe, które dorobiły się nowych ficzerów w obsłudze pamięci pomiędzy migracją na NT i OS X. Czyli nie tak znów „od lat“.
W notce chodziło mi bardziej o lanie po łapach ludzi, którzy patrzą na zajętość pamięci.
O architekturze mogłem, nie pomyślałem. Komentowania wyników optymalizacji GCC nie będę się podejmował. :-)
August 8th, 2011 at 09:15
Wniosek? Trzeba wiedzieć na co patrzeć przeglądając zużycie pamięci.
August 8th, 2011 at 11:45
“Część pamięci spełniała jednak specjalne zadanie i zapisywanie do niej informacji mogło modyfikować stan komputera oraz specjalizowanych układów scalonych.” – vide absofakinlutnie pojechana mapa pamięci Atari.
W specu było łatwo. ROM, ekran, atrybuty, system, basic, ramtop, RAAAAAM ;D, UDG. Wsio co miałeś powyżej RAMTOP a poniżej UDG było nietykane przez system w żadne sposób. Miałeś uczciwe prawie 40KB ramu na swoje potrzeby, ciągłego, z tego prawie 32KB szybkiego ;P – jak się olało UDG to można było jeszcze 768 bajtów sobie wyżebrać.
August 8th, 2011 at 11:59
Na szczęście kibibajty (i wyższe) jakoś nie chcą się przyjąć, mimo szybkiego pochwycenia pomysłu przez część pryszczersów.
August 8th, 2011 at 12:45
@sodar
A potem jest płacz, że kupił ktoś terabajt i ma za mało miejsca. Nie możemy po prostu zamieść 24 pod dywan!
August 8th, 2011 at 14:51
A prawda jest taka, że trzeba rozbudować basen, co imiennikowi szczerze i z dobroci serca polecam.
August 8th, 2011 at 15:41
Wniosek z tego taki, że dopiero cztery GiB (i więcej) pozwalają w pełni rozwinąć skrzydła, by stylem motylkowym w tymże basenie popływać. Fuck, brakuje połowy tego…
August 8th, 2011 at 18:01
@PiotrB
Już rozbudował do ośmiu. :-)
August 8th, 2011 at 20:51
Warto też dodać, że za mechanizmy stronicowania, segmentacji czy ochrony pamięci zasadniczo odpowiadają sprzętowe układy, które najczęściej wbudowane są w mikroprocesory i większe mikrokontrolery — Memory Management Unit (MMU) i Memory Protection Unit. Rolą OS-a (w dużym uproszczeniu) jest prawidłowe zainicjowanie jednostek oraz pewnych obszarów pamięci, z których korzystają (np. tablic stron).