Potoczne, mylące, niepoprawne: Ile bajtów ma kilobajt?
[image=img1]
Wprowadzenie
W tej serii będę opisywał różne pojęcia jakie wykształciły się w informatyce, lecz nie są zbyt poprawne i jednoznaczne, jednak powszechnie potocznie używane. Przez lata rozwoju komputerów wielkie korporacje sprzeczały się kto ma rację, jedni gonili drugich i powstał chaos w m.in. nazewnictwach, symbolach. Jednym z takich niedomówień są z pewnością jednostki pamięci i ich przedrostki, które dla wielu było zagadką, omówię w tym wpisie ten problem.
- Jaką masz prędkość internetu? - 30 mb/s
Trzydzieści czego? Tu zaczynają się schody o których niewielu zdaje sobie sprawę, a problem nasila się wraz ze wzrostem pojemności i szybkości. Dlaczego kupując dysk 1TB w systemie pisze że ma on 0,9TB, a pendrive 4GB ma 3.75GB? Zaokrąglenia?
Geneza przedrostków i problemu
Przedrostki SI wymyślono dla wygody, by matematycy i fizycy nie musieli używać masakrycznej ilości zer w równaniach i dokumentach, artykułach, tylko np. zamiast 1 000 000N (milion newtonów) napisać 1MN (jeden meganewton). Przedrostki te są uniwersalne do wszystkich jednostek (megawat, kilometr, miliamper), więc i w informatyce z nich skorzystano do wyznaczania ilości danych (MB, GB), częstotliwości pracy (np. MHz, GHz; to akurat niezbyt ściśle związane z samą informatyką) itd. Jednak czy poprawnie użyte?
Zdecydowana większość jednak jest przekonana że "kilobajt" ma nie 1000, a 1024 bajty, a 1 bajt 8 bitów. Tak do końca nie jest. Dawno temu wielkości danych zaczęto dzielić przez 1024 (2^10) zamiast przez 1000 dla wygody komputerów i (błędnie) użyto do tego przedrostków SI (kilo, mega, tera itd). Powszechnie uznano że "kilo w informatyce znaczy 1024" co wywołało spore oburzenie matematyków i fizyków, podobnie jak odwrócenie w pionie układu współrzędnych (rosnący y w dół). Powstało wiele żartów na ten temat jak np. "Zwykły człowiek myśli że kilobajt to 1000 bajtów, a informatyk że 1 kilometr to 1024 metry".
Software vs Hardware?
Producenci sprzętu jednak w większości olali sposób zapisu systemów operacyjnych i używali jednostek SI do których naukowcy są przyzwyczajeni od dziecka do wyznaczania np. pojemności. Słynna dyskietka 3,5” HD była podpisana 1,44MB, ale Windows pokazywał 1,37MB. Dysk twardy 10GB miał ich 9,5. O co chodzi? Mi to kiedyś wytłumaczył "znawca" że ten ubytek jest przeznaczony na działanie tej dyskietki, czy dysku twardego. W rzeczywistości producenci używali przedrostków SI opartych o system dziesiętny, a systemy operacyjne przedrostków opartych o system dwójkowy, czyli wielokrotności 1024(2^10) zamiast 1000, jednak używali (i dalej w większości to robią) literek z przedrostków SI.
Dobra, z tego wynika rozdzielenie: software używa przedrostków dwójkowych (binarnych), czyli wielokrotności 1024, a hardware przedrostków dziesiętnych (wielokrotności 1000). To czemu 2x 512MB RAMu to 1GB? Nazwano to standardem JEDEC, który używa wielokrotności 1024, ale nazw przedrostków identycznych co SI, co uczyniło te dwa standardy przedrostków nie do rozróżnienia w zapisie.
Można to zrozumieć: producenci tworzyli pamięci powiększając je zawsze o 2 razy, elektronika bazuje w końcu na systemie dwójkowym. Końcową pojemność musieli jakoś podać, a jako że nie było wtedy innych przedrostków, podawano z przedrostkiem SI, ale o mnożniku 1024, zamiast 1000, stwierdzili że te 24 nie robi wielkiej różnicy.
Co dziwniejsze, w danych technicznych gdzie podawana jest np. przepustowość, wielokrotności magicznie zmniejsza ją się do 1000 i 1kb znaczy 1000b...
Standard zapisu IEC: Koniec problemów?
IEC = International Electrotechnical Commission, Międzynarodowa Kommisja Elektrotechniczna, organizacja non‑profit zajmująca się m.in. wyznaczaniem standardów w dziedzinach elektrotechniki (w tym i informatyki).
W celu pozbycia się tego niedomówienia w 1999 roku (a więc dość późno, gdyż już w świadomości użytkowników się zakodowało że 1kB=1024B) IEC stworzył nowy standard zapisu przedrostków binarnych, który prowadza nowe i jednoznaczne nazewnictwo przedrostków, bo przecież jak “kilo” znaczy 1000, to czemu jakiejś dziedzinie miałby znaczyć 1024?
Przedrostki binarne IEC brzmią i zapisuje się podobnie jak SI: - Kibi [Ki] - Mebi [Mi] - Gibi [Gi] - Tebi [Ti] - itd... Dodawana jest literka "i" po przedrostku przed jednostką (jednostka pozostaje ta sama: bajt, czyli duże B i bit, czyli małe b), a więc przykładowo 120KiB znaczy jednoznacznie 122880B, a nie zastanawiać się czy przypadkiem to nie jest 120000B. Ponadto przedrostki zawsze zaczynają się wielką literą, w przypadku SI "k" piszemy zawsze małe, duże jest błędem. Duże samo "K" (w informatyce) mogło sugerować że chodzi o przedrostek binarny, jednak często nieświadomi użytkownicy używali dużego i małego "k" na zmianę. W przypadku wyższych przedrostków nie dało się już rozróżnić, bo wszystkie pisze się dużą literą.
Większość oprogramowania podaje nadal w mylących przedrostkach SI z wielokrotnościami 1024, natomiast pamięci trwałe typu HDD, FDD, SDD, karty pamięci, pendrive’y używają prawidłowo jednostek SI. Pojemność płyty CD znów używa wielokrotności 1024 (~703MiB), ale już płyty DVD 1000 (4.7GB, czyli ~4.37GiB). Płyty Blu‑Ray również używają poprawnych jednostek SI.
Zatem jak rozumieć podawane pojemności/prędkości?
Wracając do prędkości z początku wpisu: ile to 30mb/s? Małe ‘b’ sugeruje bity, zatem mamy 3,75mB/s. A małe ‘m’? Mili? Jedna tysięczna? Załóżmy już że chodzi o ‘M’, ale teraz jaki przedrostek: prawidłowy SI, czy JEDEC? W przypadku pierwszego mamy 3,75MB/s, a w przypadku drugiego ok. 3,58MiB/s.
Różnica niewielka? Przy mega/mebibajtach może niewielka, ale przy tera/tebi wynosi ponad 9% i wraz z kolejnymi “poziomami” różnica ta rośnie.
Skutki zamieszania
Skutki nie są tragiczne, głównie rozczarowanie tych, którzy kupili np. dysk 1TB, a na nim jedynie 901GiB, albo na swój pendrive 4GB nie mogli wrzucić pliku 3.8GiB, a ci którzy stworzyli ładny album zdjęć i filmów pamiątkowych na DVD zajmujący 4.6GiB musieli albo ten album zmniejszyć, albo użyć dwuwarstwowej płytki DVD. Skutki te odczuł zapewne każdy domowy użytkownik.
Oczywiście tu dopisałem tą literkę "i", ale wiele programów nadal nie używa tej literki.
Nieświadomość użytkowników
Długo wierzyłem że 0,7GB z mojego pierwszego dysku twardego 10GB było przeznaczone na działanie samego dysku i systemu, w końcu obie wartości miały takie same jednostki. Wiele lat później dowiedziałem się skąd ta różnica i w tym momencie zaczynałem zadawać sobie pytanie: jak rozróżniać te przedrostki? Trzeba po prostu zdać się na intuicję jeśli ma się do czynienia z zapisem "1MB", ale zapis "1MiB" nie pozostawia żadnych wątpliwości. Pierwszy raz z zapisem KiB, MiB spotkałem się o ile dobrze pamiętam w programie FileZilla.
Problem ten był już omawiany na łamach dobreprogramy.pl (link ), okazało się że wielu w ogóle nie widzi różnicy, ani potrzeby rozdzielania i sensu zlikwidowania tego problemu. Wiele lat uczono tak właśnie w szkołach i tak jest nawet dziś na egzaminach zawodowych i maturach z informatyki. Jak już wspomniałem "znawcy", a nawet i nauczyciele niektórzy nie potrafią właściwie wyjaśnić tajemniczego ubytku pamięci w dyskach twardych i pendrive’ach tłumacząc się że "zagubiona" pojemność przeznaczona jest na działanie, albo po prostu wartość jest zaokrąglana..
Zdaniem niektórych w komentarzach “Canonical chce wywołać chaos”. Nie prawda: Canonical w ten właśnie sposób chciał się pozbyć obecnego chaosu dając czasem pewność że chodzi o wielokrotności 1024, a nie 1000. Porządek w jednostkach panuje już w większości dystrybucji Linuksa i ich podstawowych programach, systemach Mac OSX (od Snow Leopard), natomiast Microsoft i wielu innych komercyjnych wydawców oprogramowania prawdopodobnie nadal nie chce wystawić swoich użytkowników na szok wprowadzając literkę “i” między przedrostek i jednostkę, albo zmienić wielokrotności z 1024 na 1000.
Podsumowanie
Mamy dwa sposoby zapisywania objętości danych: z użyciem przedrostków binarnych (IEC) i dziesiętnych (SI). Większość programów używających przedrostków o nazewnictwie z SI używa w rzeczywistości przedrostków binarnych (przedrostki kilo, mega itd. wielokrotności 1024). Jako że "kilo" w SI znaczy 1000, w informatyce powinno być TAK SAMO! Do zapisu jednostek z przedrostkami o wielokrotności 1024 należy używać standardu IEC: kibibajty, mebibajty, tebibajty itd. Widząc zapis "164MB" powinno chodzić o Mega o mnożnik 1000^2, czyli równy milion, lecz nie zawsze tak jest. Zapis "164MiB" daje 100% pewność że chodzi o Mebi z mnożnikiem 1024^2 (1048576) i nie ma mowy o pomyłce.
Powinno się zatem stosować przedrostki IEC tam gdzie chodzi o wielokrotności 1024. Kilka przydatnych linków: Kilobajt wg. wiki O przedrostu dwójkowym na wiki Konwerter między SI<>IEC (pierwsza kolumna z przedrostkami dziesiętnym...