Продление срока службы флеш-памяти
У флеш-памяти есть серьёзное ограничение - число перезаписей каждого сектора ограничено примерно 100 000 раз. Поначалу этот предел кажется практически недостижимым, но на деле до него можно добраться довольно быстро, а это плохо. Когда флеш-память изнашивается, начинаются ошибки данных, повреждение данных, отказ секторов и так далее. В этом разделе рассказано, что можно сделать для продления срока службы флеш-памяти вашего устройства. Обычно этого добиваются, (1) сокращая число записей во флеш-память и (2) применяя выравнивание износа секторов (то есть распределяя записи между секторами как можно равномернее).
Файловый доступ
При файловом доступе основную работу берёт на себя объект fd. Мы уже объясняли, что таблица записей о файлах (FRT) и таблица размещения файлов (FAT) - области диска, в которые пишут чаще всего - занимают как минимум вдвое больше места, чем нужно для хранения их данных. Кроме того, у них есть минимальное число секторов, независимо от потребности. Так в любой момент времени у FRT и FAT есть запасные секторы. Эти запасные секторы вместе с занятыми постоянно чередуются.
Например, при каждом создании файла меняется один из секторов FRT. Для этого нужно записать данные в один из физических секторов. При этом объект fd берёт ранее использовавшийся сектор FRT и «отпускает» его в пул запасных секторов FRT. Одновременно один из запасных секторов FRT становится активным и хранит изменённые данные. FAT работает так же. Для вашего приложения процесс полностью прозрачен, а срок полезной службы флеш-памяти он продлевает значительно.
Можно, и мы советуем, ещё сильнее снизить износ FAT и FRT, сократив число требуемых записей. Один из способов - создать все нужные файлы и выделить для них место один раз, как правило при «инициализации» устройства приложением.
Допустим, у вас есть файл журнала, где хранятся события, собранные приложением. Очевидный подход - просто дописывать данные каждого нового события в конец файла. Файл будет расти с каждым событием. Но постойте: это значит, что область FRT, хранящая текущий размер файла, будет меняться при каждой дозаписи! Область FAT тоже будет нагружена!
Альтернативный подход - один раз создать файл нужного максимального размера и заполнить его «пустыми» данными (например, кодами &hFF). Затем по мере появления событий эти пустые данные перезаписываются реальными данными событий. Теперь наши действия не вызывают изменений в областях FRT и FAT, что продлевает жизнь флеш-микросхеме.
Такой подход не только продлевает жизнь флеш-микросхеме, но и ускоряет запись в журнал (меняется меньше секторов), а при использовании транзакций расходуется меньше записей журнала (в одну транзакцию помещается больше операций).
При использовании транзакций выделяйте под память журнала щедрый объём. Для fd.formatj рекомендуется значение maxjournalsectors 50-100. Память журнала - область диска с интенсивным обменом, поэтому чем больше там секторов, тем дольше проживёт флеш-память.
В области данных диска выравнивание ограничено: оно сводится к распределению использования свободных секторов. Объект fd следит за тем, чтобы когда файлу нужен новый сектор данных, он выбирался случайным образом из пула доступных секторов данных. Но как только сектор данных выделен файлу, он остаётся за этим файлом столько, сколько нужно. Поэтому если вы раз за разом пишете по одному и тому же смещению файла, вы нагружаете один и тот же физический сектор флеш-микросхемы.
В больших файлах запись по одному и тому же смещению происходит редко. Например, если в файле журнала 1000 секторов данных, вряд ли вы будете писать в один сектор снова и снова. Для небольших файлов вероятность выше. Решение - время от времени стирать файл и создавать его заново. Тогда файлу случайным образом выделятся новые секторы.
Прямой доступ к секторам
Прямой доступ к секторам - низкоуровневый способ работы с флеш-памятью. Вы сами себе хозяин: объект fd ни в чём не помогает, и только вам следить, чтобы флеш-микросхема не изнашивалась неравномерно. В общем случае сокращайте число записей во флеш-память и/или реализуйте какую-нибудь форму выравнивания, когда одну и ту же задачу делит большое число секторов и каждый получает свою справедливую долю работы.