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

Переводы статьи Переводы статьи
Код статьи: 156932 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Ввод и вывод файлов в 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.

Свойства

Код статьи: 156932 - Последний отзыв: 30 мая 2013 г. - Revision: 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
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: 156932

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com