Нужно ли по-прежнему «безопасно извлекать» USB-накопитель? — взгляд через быстрое удаление и кэш записи
· Обновлено: · Го Комура · Windows, USB, Хранение данных, Устранение неполадок
Вы скопировали файлы на USB-накопитель. На экране появилось сообщение о завершении. И всё же перед тем, как вынуть накопитель, вам предлагают ещё раз выполнить «Безопасное извлечение устройства».
Работа вроде бы закончена — что же тогда осталось завершить?
Данные, которые приложение передало Windows, могут всё ещё ждать записи на стороне ПК. Проследим путь одного файла до USB-накопителя.1
Здесь рассматривается USB-накопитель, подключённый к Windows 11. Передача файлов со смартфона и подобные случаи в статью не входят.
1. До записи на USB-накопитель данные принимает ПК
Для наглядности разделим файл на три части: A, B и C. Приложение передаёт их Windows по порядку и просит записать на USB-накопитель.
Если бы каждую запись на USB-накопитель приходилось ждать, приложение тоже ждало бы. Поэтому Windows может ответить сразу, как только приняла данные в память ПК, а на USB-накопитель записать их позже. Смысл в том, чтобы не заставлять приложение ждать и обрабатывать мелкие записи вместе. Это временное место хранения и есть кэш записи.12
Рассмотрим момент, когда Windows уже получила A, B и C, но на USB-накопитель успела записать только A и B. Часть C ждёт своей очереди на стороне ПК.
flowchart TB
accTitle: У одного и того же файла принятое ПК и записанное на USB-накопитель различаются
accDescr: Показывает момент, когда Windows получила A, B и C, на USB-накопитель записаны A и B, а часть C всё ещё ждёт записи в кэше на стороне ПК.
A["Windows получила A, B и C"]
A --> P["Память ПК: C ждёт записи"]
A --> U["Записано на USB-накопитель: только A и B"]
Рис. 1: Приложение передало все три части. И всё же в этот момент части C на USB-накопителе ещё нет.
Если вынуть накопитель сейчас, часть C, оставшаяся на ПК, на USB-накопитель не попадёт. Часть вынесенных данных окажется потерянной.
Приложение передало всё. Но на USB-накопителе ещё не всё. При отложенной записи оба утверждения могут быть верны одновременно.
Когда именно появляется сообщение о завершении, зависит от приложения и настроек. Этот пример не означает, что после сообщения проводника о завершении запись обязательно остаётся незавершённой.2
2. Закончите запись принятых данных до того, как вынуть накопитель
Итак, как вынуть USB-накопитель, не оставив часть C позади?
«Безопасное извлечение устройства» — это действие, которое сообщает Windows: устройство извлекают, поэтому завершите оставшиеся операции записи. Завершение операций, оставшихся в кэше, — одна из его задач.3
Для нашего файла это означает: записать часть C, оставшуюся на стороне ПК, и дождаться, пока на USB-накопителе появятся A, B и C.
flowchart TB
accTitle: Как одна и та же ожидающая записи часть C поведёт себя в зависимости от способа извлечения
accDescr: Если отключить накопитель, пока часть C остаётся на стороне ПК, на USB-накопителе будут только A и B, а если записать C, пока накопитель подключён, на нём появятся A, B и C.
P["Часть C на стороне ПК ждёт записи"]
P -->|"Вынуть до записи C"| L["USB-накопитель: только A и B"]
P -->|"Записать C, пока накопитель подключён"| R["USB-накопитель: есть A, B и C"]
Рис. 2: При безопасном извлечении нужно ждать не течения времени, а завершения оставшихся операций записи.
Если просто немного подождать и вынуть накопитель, вы не узнаете, осталось ли что-то незавершённым. Операция извлечения поручает Windows завершающие действия, и вы можете дождаться уведомления о том, что устройство можно извлечь.4
«Повышенная производительность» в Windows — это политика, при которой такой кэш можно использовать. Взамен накопления записей ради эффективности приходится выполнять безопасное извлечение устройства, а уже потом вынимать накопитель.3
3. «Быстрое удаление» — политика, которая не откладывает запись
Возможно, вы подумаете: если остаток всё равно нужно записать до извлечения, то почему бы изначально не оставлять данные на стороне ПК?
Именно такой подход и есть «Быстрое удаление». Windows не кэширует запись на диск для выбранного устройства и позволяет пропустить операцию извлечения. Иными словами, не применяется схема, при которой часть C остаётся на стороне ПК и записывается позже.3
Работа по записи на USB-накопитель никуда не исчезает. Возможностей накапливать записи ради эффективности меньше, и производительность может снизиться, зато извлекать накопитель становится проще.3
flowchart TB
accTitle: Политика с отложенной записью и политика без неё
accDescr: При повышенной производительности ПК может удерживать ожидающие записи, но их завершение нужно подтвердить при извлечении, а при быстром удалении Windows запись так не откладывает.
H["Повышенная производительность"] --> HC["ПК может удерживать записи"]
HC --> HE["Записать остаток до извлечения"]
Q["Быстрое удаление"] --> QC["Запись не откладывается"]
QC --> QE["Операцию извлечения после работы можно пропустить"]
Рис. 3: Работа по записи на USB-накопитель не исчезает — меняется лишь то, откладывается ли она.
Начиная с Windows 10 версии 1809 по умолчанию выбрано быстрое удаление. Именно на этом основаны утверждения, что теперь накопитель можно просто вынимать. Однако настройку можно изменить для каждого устройства отдельно.3
Иными словами, выбор такой: завершить отложенную работу до извлечения или вообще её не откладывать. Оба утверждения — что безопасное извлечение необходимо и что оно не нужно — происходят именно из этого различия в настройке.
Даже при быстром удалении это не значит, что можно прервать выполняющееся копирование или сохранение. Дождитесь завершения операции, а несохранённые изменения сохраните заранее.5
4. Какая из двух настроек действует для вашего USB-накопителя?
В проводнике проверьте имя и букву диска нужного USB-накопителя.
Щёлкните правой кнопкой мыши кнопку «Пуск», откройте «Управление дисками» и щёлкните правой кнопкой мыши по названию соответствующего устройства в нижнем списке. В разделе «Свойства» → «Политики» видно, какой из двух вариантов выбран.3
Если вкладка «Политики» не отображается, есть и другое расположение: выберите нужный диск на вкладке «Оборудование» и откройте «Свойства» оттуда. Если вы только проверяете, настройку не меняйте. Если на рабочем компьютере выполнить эти действия не удаётся, уточните у администратора.3
Если настройка неизвестна, проще всего пользоваться безопасным извлечением. Завершите сохранение и копирование, закройте приложения, которые работают с USB-накопителем. В области уведомлений выберите нужное устройство в разделе «Безопасное извлечение устройства и извлечение носителя» и выньте накопитель после уведомления о том, что устройство можно извлечь. Если значок скрыт, откройте список скрытых значков.4
Если подключено несколько устройств, сверьте выбранное имя с тем USB-накопителем, который вы действительно вынимаете.
5. Почему после завершения копирования появляется «используется»?
Все части A, B и C записаны на USB-накопитель. Но если приложение, в котором вы проверяли содержимое, держит файл открытым, следующая операция может снова его прочитать или перезаписать.
Процедура извлечения проверяет и то, можно ли завершить такое использование. Если остаётся дескриптор — ссылка, через которую приложение работает с файлом, — извлечение может быть отклонено, даже когда чтение и запись уже прекратились.67
flowchart TB
accTitle: К уже записанным файлам по-прежнему подключено работающее с ними приложение
accDescr: Даже когда на USB-накопителе записаны все части A, B и C, приложение, удерживающее дескрипторы файлов, может помешать извлечению устройства.
A["Приложение, которое держит файл открытым"]
A -->|"Удерживает дескриптор"| U["Файлы на USB-накопителе: A, B и C"]
A -.-> N["Ссылка остаётся, даже когда чтение и запись прекратились"]
Рис. 4: Здесь причина, по которой устройство не извлекается, — не нехватка данных, а то, что устройство всё ещё используется.
В этом случае ждать бесполезно: сохраните то, что нужно, и закройте приложение. Закройте также окно проводника, в котором отображается этот USB-накопитель, и повторите извлечение.
Если ничего не приходит в голову, найдите в Process Explorer имя файла или папки на USB-накопителе и выясните, какой процесс держит их открытыми. Принудительно закрывать найденные дескрипторы не стоит: это может дестабилизировать приложение или систему. Завершите приложение обычным способом, а если речь о бизнес-приложении или службе, уточните у ответственного.87
Это один из примеров причины. Подробные способы диагностики описаны в статье Как работать с Process Explorer и Handle.
6. Для разработчиков приложений: что означает «сохранение завершено»
Обратите внимание, сообщает ли приложение о завершении сохранения сразу после передачи данных в Windows или только после проверки результата необходимых операций записи.
Функция Win32 FlushFileBuffers — это API, который записывает буферизованные данные указанного файла. Вызов её для обычного дескриптора файла не сохраняет несохранённый документ другого приложения и не завершает использование всего USB-накопителя.2
Перед кэшем Windows и после него есть ещё несохранённые данные внутри приложения и кэш внутри самого устройства. Быстрое удаление — не та настройка, которая убирает и их.9
flowchart TB
accTitle: У каждого места хранения данных свой распорядитель
accDescr: Показывает несохранённые данные внутри приложения, файловый кэш на стороне Windows и кэш на стороне устройства в том порядке, в котором через них проходят данные.
A["Внутри приложения: несохранённые изменения"] -->|"Операция сохранения"| W["На стороне Windows: файловый кэш"]
W -->|"Запись на устройство"| D["На стороне устройства: внутренний кэш и носитель"]
Рис. 5: Остаются ли данные на каждом уровне, зависит от настроек и реализации. Не путайте настройку одного уровня с подтверждением завершения на другом.
Приложению, которое обрабатывает уведомления об извлечении, нужна и очистка ресурсов, например закрытие дескрипторов устройства.10 Как выбирать между API, разбирается в статье Диспетчер кэша Windows и WriteFile.
Итог
Унести с собой на USB-накопителе можно только те данные, запись которых на него завершена. Если настройка неизвестна, завершите работу и воспользуйтесь безопасным извлечением. Копию важных файлов держите не только на USB-накопителе.
На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 6, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle
Похожие статьи
- Диспетчер кэша Windows: когда WriteFile оказывается на диске
- Как работать с USB-устройствами из приложения Windows
- Диагностика с помощью Process Explorer, Handle и VMMap
Справочные ссылки
-
Microsoft Learn, File Caching. Файловый кэш в памяти, отложенная запись и роль сброса данных. ↩ ↩2
-
Microsoft Learn, FlushFileBuffers function. Обычная запись и запись буферизованных данных. Сброс файла и извлечение устройства — разные вещи. ↩ ↩2 ↩3
-
Microsoft Learn, Manage default media removal policy. Разница между быстрым удалением и повышенной производительностью, изменение значения по умолчанию и проверка настройки для отдельного устройства. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
Microsoft Support, Safely remove hardware in Windows. Операция извлечения из области уведомлений и уведомление о том, что устройство можно извлечь. ↩ ↩2
-
Microsoft Learn, Handling an IRP_MN_SURPRISE_REMOVAL Request. Сбои ввода-вывода и очистка ресурсов при неожиданном отключении устройства. ↩
-
Microsoft Learn, Handling an IRP_MN_QUERY_REMOVE_DEVICE Request. Проверка перед извлечением, открытые дескрипторы и реакция файловой системы и приложений. ↩
-
Microsoft Learn, Handle. Проверка открытых ссылок на файлы и предупреждение о принудительном закрытии дескрипторов. ↩ ↩2
-
Microsoft Learn, Process Explorer. Поиск процесса, который держит открытым конкретный файл или каталог. ↩
-
Microsoft Learn, File Buffering. Различие между файловыми буферами на стороне Windows и кэшем на стороне оборудования. ↩
-
Microsoft Learn, DBT_DEVICEQUERYREMOVE event. Как приложение готовится к извлечению и закрывает дескрипторы устройства. ↩
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
Почему звук прерывается при низкой загрузке CPU? — взгляд от буфера и сроков
Звук прерывается щелчками, хотя загрузка CPU низкая. Объясняем причину через буфер, в котором звук накапливается немного вперёд, и срок п...
Почему RDP тормозит при быстром канале? — разбираем ввод, отрисовку и сеть по отдельности
Спидтест показывает высокую скорость, а ввод и прокрутка в удалённом рабочем столе запаздывают. Разбираем причины — от кругового обхода и...
DllMain и блокировка загрузчика — почему говорят «в инициализации DLL ничего не делайте»
Почему из DllMain нельзя вызывать LoadLibrary и синхронизироваться с потоками. По первоисточникам: как блокировка загрузчика сериализует ...
«Не отвечает»: как Windows определяет зависание и как проектировать так, чтобы оно не возникало
Windows считает окно неотвечающим, если 5 секунд не извлекает сообщения, и подменяет его фантомным окном. Разбираем критерий, типичные пр...
Ложное пробуждение: почему wait на условной переменной возвращается без уведомления и как ждать в Windows
wait на условной переменной может вернуться и без уведомления (ложное пробуждение). Почему спецификация это допускает и как правильно жда...
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Разработка приложений для Windows
Бизнес-приложения, интеграция оборудования и средства связи — от требований до разработки.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- Нужно ли в Windows 11 по-прежнему безопасно извлекать USB-накопитель?
- Это зависит от политики извлечения конкретного устройства. «Быстрое удаление» рассчитано на то, что этот шаг можно пропустить, но при «повышенной производительности» безопасное извлечение устройства необходимо. Если настройка неизвестна, понятнее всего такой порядок: завершить сохранение и копирование, закрыть приложения, которые работают с накопителем, и только потом выполнить извлечение.
- Можно ли при «быстром удалении» вынуть накопитель во время копирования?
- Нет. «Быстрое удаление» — это политика, при которой Windows не кэширует запись на диск и не откладывает её. Это не функция, которая доводит до конца ещё не переданные данные, и она не означает, что можно прервать выполняющееся копирование или сохранение.
- Где проверить, что для накопителя выбрано «быстрое удаление»?
- Проверьте в проводнике имя и букву диска нужного USB-накопителя, откройте в «Управлении дисками» свойства соответствующего устройства и посмотрите вкладку «Политики». Если вкладка не отображается, выберите устройство на вкладке «Оборудование» и откройте свойства оттуда. Расположение элементов зависит от среды, и менять настройку только ради проверки не нужно.
- Почему после завершения записи появляется сообщение, что устройство используется?
- Если приложение держит файл или папку открытыми, устройство не обязательно освобождено, даже когда обмен данными на время прекратился. Сначала сохраните и закройте нужные файлы, убедитесь, что копирование и резервное копирование завершены, и повторите извлечение. При необходимости найдите процесс, который держит их открытыми, в Process Explorer, но принудительно закрывать дескрипторы не стоит.
- Если выполнить безопасное извлечение, сохранится ли на USB-накопителе документ, который я забыл сохранить?
- Нет. Безопасное извлечение не заменяет команду «Сохранить» в приложении. Сначала сохраните документ и убедитесь, что приложение сообщило о завершении операции. Не храните важные данные только на USB-накопителе: держите копию и в другом месте.
Об авторе
Страница с профилем автора статьи.
Го Комура
Представитель KomuraSoft LLC
Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.