В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

Асинхронные дискового ввода-вывода отображается как синхронные в Windows NT, Windows 2000 и Windows XP

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке: 156932
Аннотация
Ввод и вывод файлов в Microsoft Windows NT, Windows 2000 и Windows XP может быть синхронным или асинхронным. Синхронных операций ввода-вывода по умолчанию: функцию ввода-вывода называется и возвращает после завершения ввода-вывода. Асинхронный ввод-вывод с другой стороны, позволяет немедленно возвращаются вызывающему объекту выполнение функции ввода/вывода, но ввод-вывод не считается полный до некоторого момента в будущем. Операционная система сообщает вызывающему оператору после завершения ввода-вывода. Кроме того вызывающего объекта можно определить состояние ожидающих операции ввода-вывода с помощью служб операционной системы.

Асинхронный ввод-вывод преимущество заключается в том, что вызывающая сторона имеет время для выполнения другихработать или выдавать больше запросов при завершении операции ввода-вывода. Вдля асинхронного ввода-вывода, а не перекрывающийся часто используется термин перекрывающегося ввода-выводаВвод-вывод синхронный ввод-вывод. В этой статье использует асинхронное условия иСинхронных операций ввода-вывода в Windows NT. В данной статье предполагаетсячитатель имеет некоторые навыки работы с функциями файлового ввода-вывода, таких как CreateFile,ReadFile WriteFile.

Как правило ведут себя как синхронный ввод -вывод. Некоторые асинхронных операцийусловия, которые рассмотрены в дальнейших разделах сделать ввод-выводоперации происходить синхронно. У вызывающего объекта нет времени для фонаработе, поскольку не возвращают функции ввода-вывода до завершения ввода-вывода.

Несколько функций, относящихся к синхронного и асинхронного ввода-вывода. В этой статье использует ReadFile и WriteFile в качестве примеров. ReadFileEx и WriteFileEx было бы хорошо альтернатив. Хотя в данной статье рассмотрены только дискового ввода-вывода, в частности, многие принципы могут применяться другие типы ввода-вывода, такие как последовательный ввод-вывод или сетевой ввод-вывод.

Примечание: поскольку Windows 95 не поддерживает асинхронный ввод-вывод на дисковых устройств (несмотря на то, что она делает для других типов устройств ввода/вывода), его поведение не рассматривается в данной статье.
Дополнительная информация

Настройка асинхронного ввода-вывода

Флаг FILE_FLAG_OVERLAPPED должен быть указан в CreateFile при открытии файла. Этот флаг позволяет операции ввода-вывода в файле должна быть выполнена асинхронно. Вот пример:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
Будьте внимательны при программировании для асинхронного ввода-вывода, поскольку система резервируетправо выполнять операции синхронного при необходимости. Следовательно лучше всего написания программы для правильной обработки операции ввода-вывода, который может выполняться синхронно или асинхронно. Пример кода демонстрирует этот вопрос.

Существуют многие вещи могут программы во время ожидания асинхронногозавершения, такие как очередь дополнительные операции или при выполнении операцийфоновой работы. Например следующий код правильно обрабатываетперекрывающихся представлений и перекрывающие без завершения операции чтения. Это достигаетсяничего не более чем дождаться, ожидающих завершения ввода-вывода.
   if (!ReadFile(hFile,                 pDataBuf,                 dwSizeOfBuffer,                 &NumberOfBytesRead,                 &osReadOperation )   {      if (GetLastError() != ERROR_IO_PENDING)      {         // Some other error occurred while reading the file.         ErrorReadingFile();         ExitProcess(0);      }      else         // Operation has been queued and         // will complete in the future.         fOverlapped = TRUE;   }   else      // Operation has completed immediately.      fOverlapped = FALSE;   if (fOverlapped)   {      // Wait for the operation to complete before continuing.      // You could do some background work if you wanted to.      if (GetOverlappedResult( hFile,                               &osReadOperation,                               &NumberOfBytesTransferred,                               TRUE))         ReadHasCompleted(NumberOfBytesTransferred);      else         // Operation has completed, but it failed.         ErrorReadingFile();   }   else      ReadHasCompleted(NumberOfBytesRead);				
Обратите внимание, что & NumberOfBytesRead, переданные ReadFile отличается от& NumberOfBytesTransferred передано в GetOverlappedResult. Если операциябыли приложены асинхронно, а затем GetOverlappedResult используется для определенияФактическое число байтов, переданных в операции после егозавершена. & NumberOfBytesRead, переданные ReadFile не имеет смысла.

Если, с другой стороны, операция завершается немедленно, нажмите& NumberOfBytesRead, переданные ReadFile допустимое число считанных байтов. В этом случае игнорировать структуру OVERLAPPED передано ReadFile; не используйте его с GetOverlappedResult или WaitForSingleObject.

Еще одно предостережение с асинхронной операцией является то, что не следует использовать структуру OVERLAPPED до завершения его ожидающие операции. В другихслова, если у вас есть три незавершенных операций ввода-вывода, необходимо использовать три структуры OVERLAPPED. Если вы повторно использовать структуру OVERLAPPED, вы получите непредсказуемые результаты операций ввода-вывода и повреждения данных. Кроме того прежде чем использовать структуру OVERLAPPED в первый раз или до ее повторно после завершения предыдущей операции, необходимо правильно инициализировать его так, что данные остающихся не влияет на новую операцию.

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

Асинхронный ввод-вывод по-прежнему кажется синхронный

Если вы следовали инструкциям выше в этой статье, однако, все операции ввода-вывода по-прежнему выполняются синхронно в порядке выдачи, и ни одна из операций чтения файла не возвращает FALSE с GetLastError() равным ERROR_IO_PENDING, это означает, что у вас нет времени для любой фоновой работы. Почему возникает это?

Существует ряд причин, почему операций ввода-вывода завершена синхроннодаже если была запрограммирована для асинхронной операции:

Сжатие

Сжатие NTFS-это один преграду для асинхронной операции. Файлдрайвер системы не могут использовать сжатые файлы асинхронно; Вместо этого всепросто становятся синхронных операций. Это не относится к файламсжатый средствами, подобно СЖАТИЕ или PKZIP.

Шифрование NTFS

Как сжатие, шифрование файлов вызывает драйвер системы для преобразования синхронный асинхронный ввод-вывод. Если они будут расшифрованы файлы, будет асинхронных запросов ввода-вывода.

Расширение файла

Другой причиной, что операции ввода-вывода завершена синхронно является самих операций. В Windows NT любые записи операция с файлом, расширяет его длина будет синхронной.

Примечание: приложения могут принимать операции записи вышеупомянутые асинхронный, изменив допустимой длины данных файла с помощью функции SetFileValidData, а затем WriteFile.

С помощью SetFileValidData (который доступен в Windows XP и более поздних версий), приложения могут эффективно расширять файлы без потери производительности нулевое заполнение их.

Поскольку файловая система NTFS не ноль заполнения данных до допустимой длины данных (VDL), определяемый SetFileValidData этой функции влияет на безопасность которой файл может быть назначено кластеров, ранее занимаемое другие файлы. Таким образом, SetFileValidData требует, что вызывающий оператор имеет новый SeManageVolumePrivilege, который включен (по умолчанию этот адрес назначается только для администраторов). Корпорация Microsoft рекомендует независимых поставщиков программного обеспечения тщательно последствия применения этой функции.

Кэш

Большинство драйверов ввода-вывода (диск, связи и другие) имеют специальный код варианта, если запрос ввода/вывода может быть завершена "немедленно", операция будет завершена и функцию ReadFile и WriteFile возвратит TRUE. Во всех отношениях эти типы операций отображаются синхронно. Для дискаустройства, как правило, запрос ввода/вывода может быть завершена, когда данные кэшируются в памяти «немедленно».

Данные отсутствуют в кэше

Кэш схемы могут работать против вас, тем не менее, если данные не вкэш. Windows NT реализуется внутренне с помощью файла сопоставления.Диспетчер памяти в Windows NT не поддерживает асинхронной страницымеханизм отказоустойчивости для управления сопоставлениями файлов, используемой диспетчером кэша. ВДиспетчер кэша можно Однако, проверить, является ли запрошенная страница в памяти, так что если вы выполняю асинхронное чтение кэшированные страницы не находятся в памяти, драйвер файловой системы предполагает, что не требуется поток блокируется, и запрос будет обрабатываться только пул рабочих потоков. Управление возвращается в программу после чтения все еще ожидает вызова ReadFile.

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

Поведение диспетчера кэша также может влиять в зависимости отдоступ к файлу последовательно или случайным образом. Рассматриваются преимущества кэшаБольшинство при доступе к файлам последовательно. Флаг FILE_FLAG_SEQUENTIAL_SCANв CreateFile вызов будет оптимизировать кэш для данного типа доступа.Тем не менее, можно получить доступ к файлам, случайным образом, использованиеФлаг FILE_FLAG_RANDOM_ACCESS в CreateFile, чтобы сообщить диспетчеру кэшаОптимизируйте работу для произвольного доступа.

Не использовать кэш

Флаг FILE_FLAG_NO_BUFFERING имеет наибольшее влияние на поведениеФайловая система для асинхронной операции. Это лучший способ гарантироватьчто действительно асинхронных запросов ввода-вывода. Он указывает, что файловая системане использовать любой кэш механизм вообще.

Предупреждение: существуют некоторые ограничения на использование этого флага, имеющих Выравнивание буфера данных и размер сектора устройства. Приведены в документации по функции CreateFile Дополнительные сведения об использовании этого флага должным образом в функции.

Реальных результатов.

Ниже приведены некоторые результаты теста из образца кода. Величинаномера не имеет здесь и зависит от компьютера, ноотношение числа сравниваться друг с другом освещаетОбщие влияет на производительность флагов.

Можно ожидать увидеть результаты, аналогичные следующим:
  • Тест 1
    Asynchronous, unbuffered I/O:  asynchio /f*.dat /n   Operations completed out of the order in which they were requested.   500 requests queued in 0.224264 seconds.   500 requests completed in 4.982481 seconds.						
    Данный тест демонстрирует, что вышеупомянутый программа 500 запросов ввода-вывода быстро и было много времени для других действий или дополнительные запросы.
  • Тест 2
    Synchronous, unbuffered I/O: asynchio /f*.dat /s /n   Operations completed in the order issued.   500 requests queued and completed in 4.495806 seconds.						
    Данный тест демонстрирует эту программу, затраченное на 4.495880 секунд вызов метода ReadFile, для выполнения своих операций, тогда как тест 1 затраченное же запросы только 0.224264 секунд. В проверке 2, «extra» время сделать все фоновые программы не было работа.
  • Тест 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    Данный тест демонстрирует синхронный характер кэша. Все операции чтения были выданы и завершена в 0.251670 секунд. Другими словами, асинхронные запросы были синхронно. Это также тестирования Демонстрирует высокую производительность диспетчера кэша, когда данные в кэш.
  • Тест 4
    Synchronous, buffered I/O: asynchio /f*.dat /s   Operations completed in the order issued.   500 requests and completed in 0.217011 seconds.						
    Этот тест показывает те же результаты, что и тест 3. Обратите внимание, немного быстрее, чем асинхронные операции считывания выполнения синхронных операций чтения из кэша из кэша. Этот тест также демонстрирует высокую производительность диспетчера кэша, когда данные в кэше.

ЗАКЛЮЧЕНИЕ

Можно решить, какой метод лучше, так как все зависит от типа, размер и количество операций, выполняемых в программе.

Доступ к файлам по умолчанию без указания CreateFile любые специальные флагипредставляет собой операцию синхронной и кэшируются.

Примечание: получить некоторые автоматические асинхронное поведение в этом режиме, так как драйвер файловой системы не прогнозируемый асинхронных опережающего чтения и асинхронных отложенная запись измененных данных. Хотя это не делает приложения [ASCII 146] s ввода-вывода асинхронного, он является идеальным случаем для подавляющего большинства простых приложений.

Если, с другой стороны, приложения не является простой, может потребоваться сделатьНекоторые профилирования и наблюдения за производительностью, чтобы определить наилучший методПодобно тестам, приведенных ранее в этой статье. Профилирование время затраченное на выполнениеФункции ReadFile и WriteFile и затем сравнивать этот раз, как долго занимаетдля выполнения фактических операций ввода-вывода является очень полезным. Если большинствовремя затраченное на фактически выдачи ввода-вывода, ваши ввода-вывода, а затемсинхронно. Если время выдачи запросов ввода-выводасравнительно небольшое сравнение во время он принимает для операций ввода-выводаПолный, затем операции обрабатываются асинхронно. Образецупомянутой выше код использует функцию функции QueryPerformanceCounter сделать свой собственныйВнутренняя профилирования.

Наблюдение за производительностью может помочь определить эффективность программыИспользование диска и кэша. Любой из счетчиков производительности для отслеживанияпроизводительность диспетчера кэша будет указывать на объект кэша.Отслеживание счетчиков производительности для физического диска или логического дискаУказывает объекты производительности дисковых систем.

Существует несколько средств, которые полезны для мониторинга производительности;Системного монитора и DiskPerf особенно полезны. Система для сбора данных о производительности дисковых систем следует сначала выполнить команду diskperf -y. После команды необходимо перезапустить систему, чтобы начать сбор данных.
Ссылки
Дополнительные сведения об этих служебных программ и наблюдения за производительностью тома «оптимизация Windows NT» в Windows NT ресурса см.Комплект документации.
SQL Server требует систем для поддержки «гарантированная доставка стабильной носитель», как описано в рамках программы Microsoft SQL Server Always-On хранения решений проверки. FOДополнительные сведения о требованиях к входным и выходным для ядра СУБД SQL Server щелкните следующий номер статьи базы знаний Майкрософт:
967576Требования к ввода вывода ядра базы данных Microsoft SQL Server.
Asynczip ReadFile ReadFileEx WriteFile kbdss kbfile WriteFileEx GetOverlappedResult асинхронный синхронный перекрывающийся не перекрывающийся

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 156932 — последний просмотр: 05/30/2013 08:05:00 — редакция: 5.0

Microsoft Win32 Application Programming Interface, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Express, Microsoft SQL Server 2008 Standard

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtru
Отзывы и предложения
nt.createElement("meta"); m.content = guid; m.name = "ms.dqid"; document.getElementsByTagName("head")[0].appendChild(m);