Изменения

Простой FTL для флешек

648 байтов добавлено, 11:17, 22 мая 2013
м
Нет описания правки
=== Монтирование ===
При монтировании с диска читается весь индекс, то есть каждый 257-ой сектор, и все карты (физический кластер -> виртуальный кластер; виртуальный кластер -> {физический кластер, версия}) сохраняются в оперативной памяти. Произвольное чтение с флеш-памяти, будь то FTL’нутая USB-флешка или голый MTD (Memory Type Device), быстрое, следовательно, монтирование тоже происходит быстро. Минус в том, что индекс нужно держать в оперативной памяти, а занимает он примерно 3 мб на каждый 1 гб данных, что составляет уже 192 мб на 64-гигабайтную флешку - флешку — довольно много. То есть, применение ограничивается размером потребляемой оперативной памяти — всё как в SSD.
Для больших устройств можно увеличить размер кластера, скажем, до 64 кб — тогда индекс будет занимать в 16 раз меньше — всего 12 мб на 64 гб флешку. При этом, однако, потребуется ФС с таким же размером блока, а в Linux, кроме VFAT, подобных, по сути, нет — есть только ext4 с bigalloc’ом, который до сих пор глючит. Хотя, в принципе, для флешек FAT вполне подходит.
=== Запись ===
Центральная идея всего SFTL - SFTL — превращение случайной записи в последовательную. Условно говоря, драйвер должен использовать флешку как кольцевой буфер, всё время записывая новые версии кластеров в следующий свободный сегмент. При записи новой версии кластер, содержащий предыдущую, помечается как свободный. Со временем это, очевидно, приводит к фрагментации свободного пространства, и в какой-то момент при записи может оказаться, что сегментов, свободных целиком, уже нет, хотя свободного места при этом вполне хватает.
Тупейший вариант решения: не обращая внимания на фрагментацию, всегда писать в первый доступный свободный кластер. Производительность записи при этом будет падать приблизительно на количество пропущенных при записи (занятых) кластероввнутри каждого Erase Unit'а. Т.е. цена пропуска кластера примерно равна цене его записи, так как большую часть времени записи занимает стирание. В идеале запись должна происходить в связное свободное место.
Более сложный вариант решения: зарезервировать N-1 сегментов и следить, чтобы кроме зарезервированных всегда был как минимум один свободный сегмент. При записи, когда число свободных сегментов будет становится равным N-1, искать и дефрагментировать ближайшие частично свободные сегменты. Резерв нужен для того, чтобы даже в худшем случае дефрагментация удалась. Худший случай - случай — это сборка свободного сегмента из N сегментов, в каждом из которых свободен только 1 кластер. Чтобы - чтобы вместить данные из этих N сегментов, очевидно, нужен N-1 свободный сегментВ идеале запись должна происходит в связное свободное местоЦена перемещения данных равна времени их чтения + записи.
== Дополнительная идея: сжатие ==