poniedziałek, września 01, 2008

Algorytm ;-)

Gdy napisałem poprzedni wpis o teoretycznej żywotności dysku SSD w EEE PC, zacząłem się zastanawiać jak producent może zwiększyć tą żywotność bez podnoszenia limitu 10000 zapisów.

Problem żywotności sprowadza się w moim odczuciu do problemu najbardziej wyeksploatowanej komórki. Rozwiązaniem powinno być więc zapewnienie by komórki były zapisywane w bardziej równomierny sposób.

Dlatego wydaje mi się, że zwiększenie tego limitu z 10 tysięcy zapisów do 100 tysięcy zapisów jest dość proste w sposób "programowy", gdy ten program wykonuje się na sterowniku dysku.

Rozważmy taki dysk jak w EEE PC, czyli 4GB. Zdefiniujmy pewną jednostkę "logiczno-sprzętową", którą nazwiemy sektor. Ona nie musi mieć żadnego przełożenia na to jak dysk jest widoczny z zewnątrz. Niech sektor ma 512 bajtów.
Na naszym dysku będzie wtedy około 8 mln takich sektorów (dokładnie 8388608 sztuk). Numer każdego z tych sektorów można zakodować na 23 bitach. Przyjmijmy, że dla każdego sektora będziemy zliczali ilość zapisów, które doń wykonano. Wystarczy nam na to 14 bitów. Ponieważ będziemy tą liczbę zapisywać na dysku, a nie chcemy żeby akurat ten obszar okazał się być tym najbardziej zniszczonym [czyli nie chcemy by to któraś z komórek tutaj osiągnęła jako pierwsza limit 10000 cykli] to zapisywać je będziemy w kodzie Graya, dzięki czemu w trakcie zwiększania liczby o 1 będziemy musieli zmienić 1 z 14 bitów, a to daje nam limit około 140 tysięcy zapisów.
Dla każdego sektora będziemy mieli więc na dysku w jakimś jednolitym bloku mapę naszych sektorów i ich liczniki. Na każdy potrzebujemy 37 bitów, czyli zmieścimy się w 5 bajtach [40 bitów]. Łącznie więc ta tablica będzie miała 40MB.

Do tego na dysku w jednym obszarze będziemy zapisywali, także z użyciem kodu Graya liczbę wszystkich zapisów, których dokonaliśmy na dysku. Powiedzmy, że zużyjemy na tą liczbę 8192 bity, czyli 1024 bajtów. Pozwoli nam to zapisać liczby od 0 do ponad 102466, a masz limit zapisów wyniesie dla tego obszaru ponad 80 milionów.

Teraz dochodzimy do algorytmu pracy dysku. Od systemu operacyjnego/BIOSu dysk otrzymuje polecenie zapisu do zadanego obszaru. Sterownik dysku przelicza lokalizację obszaru do zapisu na numer naszego sektora. Zagląda do komórki opisującej ten sektor i odczytuje z niej numer sektora fizycznego [na początku byłyby tam wpisane kolejne liczby], oraz ilość zapisów jakie wykonano do danego sektora. Jeżeli ilość zapisów wykonanych do sektora jest wyższa niż średnia [tu trzeba będzie sprawdzić czy np. nie lepiej założyć, że 2 razy wyższa albo 3 razy...] to sterownik losuje numer "sektora" i sprawdza czy ten wylosowany sektor jest bliższy średniej [lub od niej niższy] niż nasz sektor, jeśli nie to szuka dalej, jeśli tak to zamienia wartości sektorów z mapy i fizycznych sektorów i dokonuje zapisu [nie musi więc zapisywać do nowej komórki starej wartości, a tylko nową, choć i tak zwiększa licznik zapisów dla sektora [teraz już niższy niż poprzednio!] o 1].

W takim przypadku problemem przestają być obszary dysku na których system operacyjny zapisuje w sposób notoryczny. Najbardziej narażone stają się tym razem komórki "noszące" mapę. 14 bitowe fragmenty z licznikiem wnoszą ograniczenie do 140 tysięcy zapisów. Jeżeli jednak te liczby trzymane byłyby nie w tym jednolitym obszarze gdzie jest mapa, ale w fizycznych sektorach to możliwe, że problem by się oddalił. Dodanie drugich 40 MB na drugą mapę zwiększyłoby żywotność do 280 tysięcy razy. Jeżeli zamiast drugiej mapy wprowadzilibyśmy jakiś obszar na którym moglibyśmy zapisywać wartości dla "uszkodzonych" komórek mapy, w taki sposób, że w razie uszkodzenia komórki, oznaczamy ją [mamy jeszcze 3 bity, więc 1 z nich może być flagą "uszkodzony"] i w obszarze za mapą tworzymy nowy rekord z numerem komórki którą zastępuje oraz zawartością tej komórki, to limit powinien wzrosnąć. Problem uszkodzenia nie dotyczyłby przecież wszystkich komórek tak samo, ale powiedzmy 1% ogółu, czyli dodatkowymi 4MB bylibyśmy w stanie zwiększyć limit ze 140 tysięcy do 1,4 miliona.

Wszystko to tutaj to takie gdybania, ale spróbuję wyprodukować jakąś symulację :-) jeśli wyprodukuje i potwierdzi moje tezy to się pochwalę ;-)


Podobne postybeta
Defragmentacja SSD - o tym dlaczego nie należy jej robić
Teoretyczny limit życia dysku SSD w Asus EEE.
Quidam - Cirque du Soleil
Prawdopodobieństwem w quote'e ;-)
Java 32 bit vs. Java 64 bit