Изменения

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

614 байтов добавлено, 14:06, 22 мая 2013
м
Запись
=== Запись ===
Центральная идея всего SFTL — превращение случайной записи в последовательную. Условно говоря, драйвер должен использовать флешку как кольцевой буфер, всё время записывая новые версии кластеров в следующий свободный сегмент. При записи новой версии кластер, содержащий предыдущую, не очищается, а просто помечается как свободный. Со временем это, очевидно, приводит к фрагментации свободного пространства, и в какой-то момент Даже при записи может оказатьсяследующем монтировании он будет считаться свободным, что сегментов, свободных целиком, уже нет, хотя свободного места при этом вполне хватаеттак как содержит старую версию блока.
Тупейший вариант решения: не обращая внимания на фрагментацию, всегда писать Центральная идея всего SFTL — превращение случайной записи в первый доступный свободный кластерпоследовательную. Производительность записи при этом будет падать приблизительно на количество пропущенных при записи (занятых) кластеров внутри каждого Erase Unit'а. Т.е. цена пропуска кластера примерно равна цене его записиУсловно говоря, так драйвер должен использовать флешку как большую часть времени записи занимает стираниекольцевой буфер, всё время записывая новые версии кластеров в следующий свободный сегмент, и после конца снова переходя в начало флешки. В То есть, в идеале запись должна происходить в связное свободное место. Со временем это, очевидно, приводит к фрагментации свободного пространства — следовательно, появляются две проблемы:# Запись из последовательной может снова превратиться в случайную.# В какой-то момент может оказаться, что сегментов, свободных целиком, нет вообще, хотя свободного места при этом вполне хватает.
(2) Решить относительно легко. Тупейший вариант — это, не обращая внимания на фрагментацию, всегда писать в первый доступный свободный кластер. Производительность записи при этом будет падать приблизительно на количество пропущенных при записи (занятых) кластеров внутри каждого Erase Unit’а. То есть цена пропуска кластера примерно равна цене его записи, так как большую часть времени записи занимает стирание. Более сложный вариант решения: зарезервировать N-1 сегментов и следить, чтобы кроме зарезервированных всегда был как минимум один свободный сегмент. При записи, когда число свободных сегментов будет становится равным N-1, искать и дефрагментировать ближайшие частично свободные сегменты. Резерв нужен для того, чтобы даже в худшем случае дефрагментация удалась. Худший случай — это сборка свободного сегмента из N сегментов, в каждом из которых свободен только 1 кластер - кластер — чтобы вместить данные из этих N сегментов, очевидно, нужен N-1 свободный. Цена перемещения данных равна времени их чтения + записи. С (1) ситуация сложнее.
== Дополнительная идея: сжатие ==