Изменения

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

1421 байт добавлено, 20:05, 25 мая 2013
м
Запись
* Если свободных сегментов нет ни в родном, ни в соседних регионах — значит, кончилось место и надо переходить к экстренной очистке. Экстренную очистку, опять-таки, пытаемся сначала сделать в «родном» сегменте, а потом в соседних.
* Сначала пробуем найти наиболее легко очищаемую последовательность N сегментов и переместить из них данные в последовательность N-1 зарезервированных сегментов. После такой очистки мы получим связный регион, в котором N-1 сегмент станет зарезервированным, а в оставшийся 1 можно будет что-нибудь записать. Очищать пробуем сначала в родном регионе, потом — в соседних.
* Если таких последовательностей уже не осталось — значит, места, во-первых, осталось довольно мало (теоретический максимум худшего случая — 1/N, но в среднем — гораздо меньше), а во-вторых, оно сильно фрагментировано. Тогда очистку нужно делать по-другому — брать данные из сегмента, соседнего для свободных зарезервированных, и распределять по отдельным свободным кластерам в разбросанных по всему диску сегментах. Для MTD это вообще нормальнобыстро, а для флешек это почти ничем не хуже, чем просто случайная запись в те же самые свободные кластеры, но зато даёт всё время поддерживать связную свободную область.
Для На MTDможно тоже группировать кластеры с примерно одинаковым возрастом. Но смысла в том, правдачтобы группировать их '''рядом''', такое разбиение флеш-памяти на регионы, хоть там нет никакого — и способствует ускорению записиболее этого, непригодноэто даже вредно, потому что не осуществляет Wear-Levelingтак как мешает их перемещать в соответствии с требованиями распределения износа, а наоборот — то есть больше изнашивает одни части памяти и меньше — другие. То есть, для MTD реализация немного меняется. Сегмент делается равным или примерно равным блоку стирания; при записи, если в какой-то сегмент уже начата запись кластеров, соответствующих возрасту нового кластера — кластер пишется в уже открытый сегмент. Если же такой ещё не открыт — для открытия выбирается свободный сегмент, перезаписанный минимальное число раз (Dynamic Wear Leveling). Статический WL в этих условиях осуществляется сборщиком мусора — при большой разности частоты перезаписи сегментов он просто должен выбирать наименее часто перезаписываемый сегмент, и перемещать его данные в другой, свободный, и желательно — наоборот, перезаписанный наибольшее число раз.
В-третьих, нужен и фоновый сборщик мусора, хотя бы с жадной стратегией.
== Дополнительная идея: сжатие ==