Зараз ви перебуваєте в автономному режимі; очікується повторне підключення до Інтернету

Асинхронний виводу відображається як синхронні в ОС Windows

ВАЖЛИВО! Ця стаття перекладена засобами машинного перекладу Microsoft. Статтю можна редагувати в середовищі Community Translation Framework (CTF). Щоб якомога швидше перекласти всі статті у своїй базі знань різними мовами, компанія Microsoft не лише звертається до професійних перекладачів, але й вдається до машинного перекладу, який потім редагується спільнотою. Такі статті можуть містити лексичні, синтаксичні та граматичні помилки. Microsoft не несе відповідальності за будь-які неточності, помилки або збитки, до яких може призвести неправильний переклад статей або їх використання. Докладніше про CTF див. на веб-сторінці http://support.microsoft.com/gp/machine-translation-corrections/uk-ua.

Клацніть тут, щоб переглянути цю статтю англійською мовою: 156932
Підсумки
Файл вводу-виводу на Microsoft Windows, може бути Синхронна або Асинхронна. Змінює поведінку за промовчанням для вводу-виводу, це Синхронне, функцію для вводу-виводу називається, і повертається після завершення до вводу-виводу. Асинхронний вводу-виводу, дає змогу функцію вводу-виводу, негайно повернутися до абонента виконання, але до вводу-виводу не передбачається, буде завершено, до деякий Вільний час в майбутньому. операційна система (ОС) повідомляє викликає, після вводу-виводу до завершення. Крім того, викликає може визначити стан списком операцій вводу-виводу за допомогою служб операційної системи.

Асинхронний вводу-виводу перевага полягає в тому, що викликає, має для інших роботу або проблема більше запитів, під Вільний час завершення операції вводу-виводу. Термін перекриваються, я / Ois часто використовуються асинхронний вводу та вводу-виводу на Non перекриваються Синхронне вводу-виводу. У цій статті використовує умови асинхронний і синхронні операцій вводу та виводу. У цій статті передбачається, що читач, має знайомство зі файлами функції, наприклад інтерфейсу CreateFile, ReadFile, WriteFile.

Часто асинхронних операцій вводу та виводу працюватиме лише, а синхронні вводу -виводу. певних умов, у цій статті описано в пізніших зробити розділів, операцій вводу-виводу, синхронно завершення. Викликає не має часу на тлі роботу через те, що функції вводу-виводу не повернутися до вводу-виводу до завершення.

Деякі функції пов'язані з Синхронне і Асинхронне вводу-виводу. У цій статті використовує ReadFile та WriteFile приклади; ReadFileEx і WriteFileEx було б добре альтернативи. Незважаючи на те, у цій статті описано лише диска вводу-виводу, зокрема, багато принципів, можна застосувати до інших типів вводу-виводу послідовної вводу-виводу або в мережі, вводу-виводу.
Додаткові відомості

Настроювання асинхронних вводу-виводу.

Прапор 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();				
Будьте уважні двопрохідне кодування асинхронний вводу-виводу, тому, що система, запаси theright зробити операцію Синхронне, якщо це необхідно. Таким чином, краще налаштувати програму так, щоб вона правильно обробляла дію вводу-виводу, яка може бути завершена синхронно або асинхронно. зразок коду демонструє, це міркування.

Існує багато, що програми, можна зробити під Вільний час очікування asynchronousoperations пройти черга додаткові операції або doingbackground роботу. Наприклад, такий код належним чином handlesoverlapped і не перекриваються завершення це операція читання. Це doesnothing більше, зачекайте, поки списком вводу-виводу для завершення:
   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. Якщо в operationhas зробили асинхронний, потім GetOverlappedResult використовується для determinethe фактична кількість байтів, що передаються в роботу після його hascompleted. У &, NumberOfBytesRead, перейшли ReadFile є безглуздим.

Якщо з іншого боку, операцію завершено, натисніть & NumberOfBytesRead перейшли ReadFile припустима кількість байтів, прочитати. У цьому випадку, ігнорувати OVERLAPPED структуру перейшли ReadFile; не використовуйте його з GetOverlappedResult або WaitForSingleObject.

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

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

Асинхронний вводу-виводу не виявляється синхронні

Якщо було виконано вище в цій статті вказівки, проте всіх операцій вводу-виводу ще зазвичай виконайте синхронно в порядку, випущені і жоден з операцій ReadFile повертає значення FALSE з GetLastError() повернення ERROR_IO_PENDING, це означає, що у вас немає часу на тлі роботу. Чому це відбувається?

Існує кілька причин, чому операцій вводу та виводу повна synchronouslyeven, якщо ви кодованих асинхронної операції:

Стискання

Один перешкод для Асинхронна операція, є стискання для NTFS. Драйвер файлової системи не доступ стиснутих файлів асинхронно; Замість цього alloperations просто зроблені Синхронне. Це не стосується файли, arecompressed з утиліти СТИСКАННЯ й PKZIP приблизно.

Шифрування для NTFS

Подібно до стиснення, шифрування файлів призводить до перетворення асинхронної операції Синхронне, драйвер системи. Якщо файли, які розшифрувати, буде асинхронних запитів вводу-виводу.

Розширення файлу

Інша причина, що операцій вводу та виводу завершено синхронно, є операції, себе. У Windows NT будь-який записування, операція з файлу, що поширюється довжина, буде Синхронне.

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

сценарій виконання SetFileValidData, (який доступний в ОС Windows XP та пізніших версій), програми може ефективно продовжити файли не понести покарання для заповнення дорівнює нулю, їх виконання.

Через те, що файлова система NTFS не має нульового заповнити дані до довжини передавання даних (VDL), який визначає SetFileValidData, ця функція має безпеки наслідки, де його можна призначити кластери, які раніше зайнятий інші файли. Таким чином, SetFileValidData вимагає, що викликає, є нові SeManageVolumePrivilege, що ввімкнуто (за промовчанням це призначено лише для адміністраторів). корпорація Майкрософт рекомендує, що незалежні виробники програмного забезпечення ретельно розглянути наслідки сценарій виконання цієї функції.

Кеш

Більшість драйверів вводу-виводу (диск, зв'язок "один-до-одного" та інших), мають спеціальні випадку код, де, якщо запит для вводу-виводу може бути завершена "негайно", виконати операцію, і ReadFile або WriteFile функція повертає TRUE. Таким чином, усі ці типи операцій, є Синхронне. Для diskdevice як правило, запит для вводу-виводу може бути завершено "негайно", коли дані кешуються в пам'яті.

Дані не є в кеші

Схема кеша може працювати проти, однак, якщо дані не thecache. Windows NT кеш реалізовано внутрішньо використовується, файл зіставлення. У Windows NT, диспетчер пам'яті не надає на асинхронний pagefault механізм керування зіставлення файлів використовується менеджера кеш. Thecache менеджер може Однак, переконайтеся, що чи запитаної сторінки пам'яті, таким чином, якщо ви проблема з асинхронних кешування читання, а також сторінки, які не перебувають у пам'яті, драйвер припускається, що не хочете, щоб ваш потік, заблоковано, і запит буде оброблятися обмежена пул робочі потоки. Керування повертається до програми після вашого ReadFile виклик клацанням читання, ще не.

Це працює, за невеликої кількості запитів, тому, що пула, робочі потоки обмежений (наразі три в системі 16 МБ), і буде ще кілька запити на поставлено драйвер диска, на певний Вільний час. Вільний час випуску, багато операцій вводу-виводу, дані, які не є в кеші, стають насичений кеш Диспетчер та в диспетчері пам'яті, і ваші запити, зроблені Синхронне.

Поведінка менеджера кеш також може вплинути на основі whetheryou доступу до файлу послідовно або випадково. Переваги кеша є seenmost, під Вільний час доступу до файлів, послідовно. FILE_FLAG_SEQUENTIAL_SCAN-flagin виклик "CreateFile", буде оптимізувати кеш для доступу до цього типу. Проте якщо для доступу до файлів, випадковим чином використовувати theFILE_FLAG_RANDOM_ACCESS позначку "CreateFile", у наказує tooptimize кеш-менеджера, його поведінка для оперативної.

Не використовуйте кеш-пам'яті

FILE_FLAG_NO_BUFFERING позначки, має більшість ефект від поведінки системи thefile Асинхронна операція. Це найкращий спосіб guaranteethat, запитів вводу-виводу, які фактично асинхронний. Це вказує на файл systemto не використовується механізм кешування взагалі.

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

Реального світу результати.

Нижче наведено перелік, результати перевірки деяких прикладів коду. Величина thenumbers, не має значення тут і залежить від комп'ютера до комп'ютера, але зв'язок чисел, у порівнянні з одного висвітлює thegeneral вплив на продуктивність позначки.

Ви можете очікувати результати приблизно такого вигляду:
  • Тест 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, не було "зайві" часу для цієї програми будь-яку роботу у фоновому режимі.
  • Перевірка 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. Зверніть увагу, що Синхронне зчитує з кеша завершити трохи швидше, ніж асинхронний зчитує з кеша. Цей тест також демонструє високої продуктивності менеджера кеш, коли дані містяться в кеші.

ВИСНОВКИ

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

За промовчанням файл доступ без зазначення будь-які особливі прапори CreateFileis операції Синхронне і кешування.

Зверніть увагу: отримати деякі автоматичного асинхронний, поведінка в цьому режимі, оскільки драйвер інтелектуального асинхронний читання вперед і асинхронних ледачий письмово змінення даних. Хоча це не зробити застосунку, вводу-виводу асинхронний, це ідеальний справа для більшості простих додатків.

Якщо, з іншого боку, застосунок не просто, можливо, доведеться dosome-профілювання та моніторинг продуктивності, щоб визначити це найкращий спосіб, схожий на випробування вище в цій статті. Профілювання часу, витраченого на theReadFile або WriteFile функції а потім в порівнянні цього разу як довго його takesfor операцій вводу-виводу для виконання дуже корисна. Якщо majorityof, часу насправді випуску, до вводу-виводу, а потім до вводу-виводу beingcompleted синхронно. Проте, якщо до часу, витраченого центром вводу-виводу запити isrelatively малі в порівнянні з часу потрібно для вводу-виводу операцій-tocomplete, а потім операцій що розглядаються асинхронно. Samplecode, зазначених вище в цій статті функція QueryPerformanceCounter, щоб зробити, профілювання owninternal.

Моніторинг продуктивності можна визначити, як ефективно до програми isusing дублювання диска і кеш-пам'яті. Відстеження з будь-якої з кеша об'єкт, лічильники продуктивності буде вказано, продуктивність до менеджера з кеша. Відстеження лічильників продуктивності для фізичного диска чи логічних Diskobjects буде вказано, продуктивність системи диска.

Існує декілька службових програм, корисні у виконанні моніторингу; PerfMon і DiskPerf є особливо корисна. Для збирання даних про продуктивність системи диска системи потрібно спочатку виконайте команду diskperf -y. Після того, як ви питання, команди, перезавантажте систему, щоб почати збирання даних.
Посилання
Зверніться до документації MSDN на Синхронне і Асинхронне вводу-виводу щоб отримати додаткові відомості.

Kbdss-Asynczip-ReadFile ReadFileEx WriteFile WriteFileEx GetOverlappedResult асинхронний Синхронне перекриваються не перекриваються, kbfile

Попередження. Цю статтю переведено автоматично

Властивості

Ідентифікатор статті: 156932 – останній перегляд: 07/03/2016 22:22:00 – виправлення: 2.0

Інтерфейс програмування додатків Microsoft Win32

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtuk
Зворотний зв’язок