Главная > Статьи > Периодические тормоза ОС WM 5-почему?

Периодические тормоза ОС WM 5-почему?


12 сентября 2006. Разместил: Buc

altНекоторые, особо настойчивые владельцы наладонников, попробовали сами разобраться в ситуации и выяснили, что дело в файле filesys.exe, который значительно загружает процессор и выполняет задачу под названием "Compaction Thread". Также были вопросы по поводу ключа реестра CompactionPrio256.

Я не смогу ответить на вопросы о более крупных проблемах, но, по крайней мере, постараюсь подробнее рассказать о вышеописанных.

Эта статья подразумевает, что вы знаете различия между RAM и ROM, а также терминами «NOR» и «NAND». Если нет, то для начала вам следует ознакомиться с предыдущими статьями с разъяснениями по этим вопросам. Вы также должны представлять себе, что такое технология постоянного хранения данных (Persistent Storage).

 


Проще переместить, чем стереть
Флэш-память КПК (Flash ROM) разделена на блоки. Каждый из блоков делится на секторы. Размер каждого сектора составляет 512 байт. Размеры блоков варьируются, но обычно это – 128 КБ. В случае с флэш-памятью самая сложная операция, какую можно придумать – это стирание информации. В большинстве систем хранения данных (жесткие диски, RAM и даже бумага с карандашом) вы можете удалить ровно столько данных, сколько требуется – ни больше, ни меньше. Но только не в случае с ROM. Если вы хотите удалить один бит информации из ROM, то для этого потребуется удалить целый блок, в котором он находится. А если речь идет о NOR ROM, на удаление сектора может уйти до двух секунд. NAND ROM позволяет удалять данные гораздо быстрее.

И даже если длительная процедура удаления не является для вас достаточным мотивом проводить ее как можно реже, есть еще одна серьезная причина для этого. Дело в том, что флэш-память способна выдержать лишь ограниченное количество циклов записи-стирания, поэтому имеет смысл позаботиться о том, чтобы их было как можно меньше.

Вот наш способ справиться с этими проблемами. Если требуется произвести изменения в блоке флэш-памяти, мы переносим его в RAM, вносим изменения и затем записываем его в новый блок флэш-памяти. Старый блок при этом помечается как недоступный для записи и чтения (ошибочный).

Это позволяет достичь сразу нескольких результатов. Во-первых, процесс записи происходит гораздо быстрее, так как нет необходимости ждать около двух секунд, пока произойдет удаление старых данных блока перед записью новых. Во-вторых, это приводит к тому, что данные записываются нелинейно, а за этим следует нелинейное стирание блоков. При таком подходе, вместо того, чтобы десять раз стирать один блок, мы один раз стираем десять блоков. Этот принцип, позволяющий уменьшить число циклов стирания-записи блоков, называется выравниванием износа Flash-памяти (wear leveling).

Удаление ненужных данных
Итак, жизнь прекрасна. Мы пометили старые сектора как ошибочные и записали данные в неиспользованные сектора. К несчастью, эта щедрость, в конце концов, оборачивается против нас. В какой-то момент во флэш-памяти заканчиваются неиспользованные, свободные блоки памяти. И что дальше? Если бы мы были государством, то просто «напечатали» бы еще блоков. Увы, мы так не можем. Дефицитное бюджетирование в данном случае неприемлемо.

Зато мы можем написать программный код, который будет следить за количеством доступной памяти и состоянием системы. И тогда, если количество "ошибочных" секторов во флэш-памяти становится недопустимо большим, а система находится в пассивном режиме, он вступает в действие, дефрагментируя память. Если большая часть секторов блока не годна к записи, тогда свободные секторы переносятся в другую часть памяти, а блок стирается целиком. Блоки, целиком заполненные "ошибочными" секторами стираются без дополнительных процедур.

Код, который выполняет эти операции и называется Compaction Thread. Он является неотъемлемой частью файла filesys.exe. А последний, в свою очередь, неотъемлемая часть операционной системы Windows CE (проще говоря – является частью файловой системы).

Задача этого механизма – постоянное поддержание необходимого количество свободных блоков для проведения всех операций записи таким образом, чтобы пользователь даже не замечал этого. Именно поэтому Compaction Thread запускается в моменты, когда нагрузка на систему минимальна, то есть владелец КПК не использует программы, требующие значительных ресурсов процессора. Но если что-то идет не так…

Тревога!
Что случится, если мы постоянно активно записываем данные во флэш-память и заполняем все свободные блоки, а система при этом никогда не переходит в состояние, требуемое для запуска Compaction Thread? В конце концов, при очередной операции записи система перейдет в критическое состояние. При этом файловая система перейдет на "военное положение" и монопольно захватит ресурсы процессора, запустив Compaction Thread на время, достаточное чтобы освободить секторы для записи данных. Это называется "критическая дефрагментация" (Critical Compaction).

Из-за аппаратных особенностей, во время стирания блока, данные из флэш-памяти нельзя ни считывать, ни записывать. Поэтому, вне зависимости от причины, по которой запускается Compaction Thread, производительность системы значительно падает во время стирания блоков. И помните, что NOR RAM требует до двух секунд на эту операцию.

Можно ли на это влиять?
Дефрагментация – суть результат записи данных. Операции считывания не приводят к запуску Compaction Thread. Поэтому, если какая-либо из ваших программ часто записывает данные и в особенности – небольшими блоками, шансы на частую дефрагментацию существенно повышаются. Кроме того, чем меньше у вас свободной флэш-памяти, тем более "усердно" будет работать


Вернуться назад