E/S de disco asincrónicas aparece como sincrónica en Windows

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 156932
Resumen
E/S de archivos en Microsoft Windows pueden ser sincrónica o asincrónica. El comportamiento predeterminado de E/S es sincrónico, cuando llama a una función de E/S y devuelve cuando se complete la E/S. E/S asincrónica permite una función de E/S devolver la ejecución al autor de la llamada inmediatamente, pero no se supone que la entrada-salida completarse hasta que algún momento del futuro. El sistema operativo notifica al llamador cuando se complete la E/S. Como alternativa, el llamador puede determinar el estado de la operación de E/S pendiente utilizando los servicios del sistema operativo.

La ventaja de E/S asincrónica es que el llamador tiene tiempo para hacer otro trabajo o emitir solicitudes de más mientras se completa la operación de E/S. El término se superponen / Ois se utiliza con frecuencia para E/S asíncrona y E/S superpuesto no para E/S sincrónica. En este artículo utiliza los términos asincrónico y sincrónico para las operaciones de E/S. En este artículo se supone que el lector tiene familiaridad con las funciones de E/S de archivo como CreateFile, ReadFile, WriteFile.

Con frecuencia, comportan operaciones asincrónicas de E/S sincrónica sólo como E/S. determinadas condiciones que se describen en la marca de las secciones más adelante que las operaciones de E/S completarán de forma sincrónica. El llamador no tiene tiempo para el trabajo de fondo porque las funciones de E/S no se devuelven hasta que se complete la E/S.

Varias funciones están relacionadas con E/S sincrónica y asincrónica. En este artículo utiliza ReadFile y WriteFile como ejemplos; buena alternativa sería ReadFileEx y WriteFileEx. Aunque en este artículo se describe cómo sólo E/S de disco en concreto, muchos de los principios pueden aplicarse a otros tipos de E/S, como E/S serie o E/S de red.
Más información

Configurar E/S asincrónica

Debe especificarse la marca FILE_FLAG_OVERLAPPED en CreateFile cuando se abre el archivo. Este indicador permite las operaciones de E/S en el archivo para realizarse de forma asincrónica. Éste es un ejemplo:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
Tenga cuidado al codificar para la E/S asincrónica, ya que el sistema reserva el derecho para hacer una operación sincrónica, si es necesario. Por lo tanto, es mejor escribir el programa para tratar correctamente una operación de E/S puede completarse de forma sincrónica o asincrónica. El ejemplo de código muestra esta consideración.

Hay muchas cosas que un programa puede hacer mientras espera asynchronousoperations para completar, tales como las operaciones adicionales o trabajo de doingbackground. Por ejemplo, el siguiente código correctamente handlesoverlapped y no superpuesto de la finalización de una operación de lectura. Se doesnothing más de esperar la E/S pendientes completar:
   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);				
Tenga en cuenta que y es diferente de NumberOfBytesRead pasado a ReadFile y NumberOfBytesTransferred pasa a GetOverlappedResult. Si un operationhas han realizado asincrónicos, se utiliza GetOverlappedResult lainformación el número real de bytes transferidos en la operación después de que hascompleted. El & NumberOfBytesRead pasado a ReadFile carece de sentido.

Si, por el contrario, se completa una operación inmediatamente, entonces & NumberOfBytesRead pasa a ReadFile es válido para el número de bytes leídos. En este caso, pasar por alto la estructura OVERLAPPED pasada a ReadFile; no lo utilice con GetOverlappedResult o WaitForSingleObject.

Otro problema con la operación asincrónica es que no debe usar una estructura OVERLAPPED hasta que haya completado su operación pendiente. En otras palabras, si tiene tres operaciones de E/S pendientes, debe utilizar tres estructuras OVERLAPPED. Si reutiliza una estructura OVERLAPPED, recibirá resultados impredecibles en las operaciones de E/S y puede experimentar daños en los datos. Además, antes de poder utilizar una estructura OVERLAPPED por primera vez, o antes de reutilizar después de una operación anterior, debe correctamente inicializarlo por lo que no hay datos de sobra afecta a la operación de nueva.

El mismo tipo de restricción se aplica para el búfer de datos utilizado en anoperation. Un búfer de datos no se debe leer o escribir hasta que haya finalizado la operación de E/S itscorresponding; leer o escribir la buffermay provocar errores y datos dañados.

Asincrónica E/S aún parece ser sincrónico

Si ha seguido las instrucciones anteriormente en este artículo, sin embargo, todas las operaciones de E/S aún normalmente realiza sincrónicamente en el orden y ninguna de las operaciones de ReadFile devuelve FALSE con GetLastError() devuelve ERROR_IO_PENDING, esto significa que no tiene tiempo para cualquier trabajo de fondo. ¿Por qué ocurre esto?

Hay varias razones por las operaciones de E/S completarán synchronouslyeven si han codificado para operación asincrónica:

Compresión

Una operación asincrónica es la compresión NTFS. El controlador del sistema de archivos no tendrán acceso a los archivos comprimidos de forma asincrónica; en su lugar alloperations se realizan sólo sincrónico. Esto no aplica a los archivos que arecompressed con utilidades similares a comprimir o PKZIP.

Cifrado de NTFS

De forma similar a la compresión, cifrado de archivos hace que el controlador del sistema convertir la E/S asincrónica a sincrónico. Si los archivos se descifran, las solicitudes de I/O será asincrónicas.

Extensión de un archivo

Otra razón por la que las operaciones de E/S se completan sincrónicamente es las operaciones a sí mismos. En Windows NT, cualquier escritura a un archivo que extiende su longitud será sincrónica.

Nota: las aplicaciones pueden hacer que la operación de escritura mencionados anteriormente asincrónica cambiando la longitud de datos válidos del archivo mediante la función SetFileValidData y, a continuación, emitir un WriteFile.

Con SetFileValidData (que está disponible en Windows XP y versiones posteriores), aplicaciones eficientemente ampliar los archivos sin incurrir en una penalización de rendimiento para el llenado de cero ellos.

Porque el sistema de archivos NTFS no cero-relleno de los datos hasta la longitud de datos válidos (VDL) definida por el SetFileValidData, esta función tiene implicaciones de seguridad que el archivo se le puede asignar clústeres que anteriormente estaban ocupados por otros archivos. Por lo tanto, SetFileValidData requiere que el llamador tiene el nuevo SeManageVolumePrivilege habilitado (de forma predeterminada, esto se asigna únicamente a los administradores). Microsoft recomienda que los ISV consideran todas las implicaciones del uso de esta función.

Memoria caché

Mayoría de los controladores de E/S (disco, comunicaciones etc.) tiene código caso especial donde, si una solicitud de E/S puede completarse "inmediata", la operación se complete y la función ReadFile o WriteFile devolverá TRUE. De todas formas, estos tipos de operaciones parecen ser sincrónico. Para una diskdevice, por lo general, una solicitud de E/S puede completarse "inmediata" cuando se almacena en caché los datos en la memoria.

Datos no están en caché

La combinación de memoria caché puede trabajar con usted, sin embargo, si los datos no están en thecache. La caché de Windows NT se implementa internamente mediante asignaciones de archivos. El Administrador de memoria de Windows NT no proporciona un mecanismo para administrar las asignaciones de archivo utilizadas por el Administrador de caché de errores de página asincrónica. Administrador de Thecache sin embargo, puede comprobar si la página solicitada está en la memoria, por lo que si se emite una lectura asincrónica de caché y las páginas no están en la memoria, el controlador del sistema de archivos se supone que no desea que el subproceso bloqueado y controlará la solicitud por un conjunto limitado de subprocesos de trabajo. Control se devuelve al programa después de la llamada a ReadFile con la lectura sigue pendiente.

Esto funciona bien para un pequeño número de solicitudes, pero porque el grupo de subprocesos de trabajo es limitado (actualmente tres en un sistema de 16MB), allí se todavía se sólo algunas solicitudes en cola para el controlador de disco en un momento determinado. Si emite un lote de operaciones de E/S para los datos que no están en la caché, el Administrador de memoria y el Administrador de caché se saturan y las solicitudes se realizan sincrónicas.

También se puede influir en el comportamiento del Administrador de caché basado en acceso whetheryou un archivo de forma secuencial o aleatoria. Ventajas de la caché son seenmost al tener acceso a archivos de forma secuencial. El flagin FILE_FLAG_SEQUENTIAL_SCAN la llamada CreateFile optimizará la caché para este tipo de acceso. Sin embargo, si tiene acceso a los archivos de forma aleatoria, utilice theFILE_FLAG_RANDOM_ACCESS indicador de CreateFile para indicar su comportamiento para acceso aleatorio de la tooptimize del Administrador de caché.

No utilice la memoria caché

El marcador FILE_FLAG_NO_BUFFERING tiene mayor efecto en el comportamiento del sistema de archivos para la operación asincrónica. Se trata de la mejor manera de Sinembargo que solicitudes de E/S son realmente asincrónicos. Indica el archivo de sistema no usar cualquier mecanismo de caché en absoluto.

Advertencia: hay algunas restricciones al uso de este indicador que tienen que ver con la alineación del búfer de datos y el tamaño de sector del dispositivo. Vea la referencia de función en la documentación de la función CreateFile para obtener más información acerca de cómo utilizar este indicador correctamente.

Resultados de las pruebas reales

Los siguientes son algunos resultados de pruebas desde el código de ejemplo. La magnitud del thenumbers aquí no es importante y varía de un equipo a otro, pero la relación de los números en comparación entre sí se ilumina general afectan de los indicadores de rendimiento.

Usted puede esperar ver resultados similares a los siguientes:
  • Prueba 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.						
    Esta prueba muestra que el programa mencionado anteriormente emitió 500 solicitudes de E/S rápidamente y tuvo mucho tiempo para hacer otro trabajo o emitir más solicitudes.
  • Prueba 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.						
    Esta prueba demuestra que este programa empleado 4.495880 segundos una llamada a ReadFile para completar sus operaciones, mientras que la prueba 1 dedicado sólo 0.224264 segundos para emitir las solicitudes de la mismas. En la prueba 2, no tenía tiempo "extra" para el programa realizar cualquier trabajo de fondo.
  • Prueba 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    Esta prueba demuestra la naturaleza sincrónica de la caché. Todas las lecturas se han emitido y se completó en 0.251670 segundos. En otras palabras, las solicitudes asincrónicas se completaron sincrónicamente. Esta prueba también demuestra el alto rendimiento del Administrador de caché cuando los datos están en la memoria caché.
  • Prueba 4
    Synchronous, buffered I/O: asynchio /f*.dat /s   Operations completed in the order issued.   500 requests and completed in 0.217011 seconds.						
    Esta prueba muestra los mismos resultados que en la prueba de 3. Observe que sincrónico lecturas de la caché de completan un poco más rápido que las lecturas asincrónicas de la memoria caché. Esta prueba también demuestra el alto rendimiento del Administrador de caché cuando los datos están en la memoria caché.

CONCLUSIÓN

Puede decidir qué método es mejor porque todo depende del tipo, el tamaño y el número de operaciones que realiza el programa.

El acceso al archivo predeterminado sin especificar los indicadores especiales para CreateFileis una operación sincrónica y almacenado en memoria caché.

Nota: obtener un comportamiento asincrónico automático en este modo porque el controlador de sistema de archivos no predictiva anticipadas y asincrónica diferida escritura asincrónica de datos modificados. Aunque esto no hace E/S la aplicación asincrónica, es el escenario ideal para la mayoría de las aplicaciones sencillas.

Si, por el contrario, la aplicación no es sencilla, tendrá que dosome de generación de perfiles y la supervisión del rendimiento para determinar el mejor método, similar a las pruebas que se muestra anteriormente en este artículo. El tiempo de generación de perfiles en theReadFile o función WriteFile y luego comparar esta vez How long takesfor operaciones de E/S reales para completar es extremadamente útil. Si el majorityof el tiempo que se dedica al emitir realmente la E/S y, a continuación, la E/S es beingcompleted de forma sincrónica. Sin embargo, si el tiempo invertido emisora entrada-salida solicitudes isrelatively pequeño en comparación con el tiempo que tarda el tocomplete de las operaciones de E/S, reciben sus operaciones de forma asincrónica. El samplecode mencionado anteriormente en este artículo utiliza la función QueryPerformanceCounter para realizar su owninternal de la generación de perfiles.

Supervisión del rendimiento puede ayudar a determinar la eficacia con su programa isusing el disco y la memoria caché. Seguimiento de cualquiera de los contadores de rendimiento para el objeto Cache indicará el rendimiento del Administrador de caché. Seguimiento de los contadores de rendimiento del disco físico o lógico Diskobjects indicará el rendimiento de los sistemas de disco.

Existen diversas herramientas que son útiles para la supervisión del rendimiento; Monitor de rendimiento y DiskPerf son especialmente útiles. Para que el sistema recopilar datos sobre el rendimiento de los sistemas de discos, primero debe emitir el comando diskperf -y. Después de ejecutar el comando, debe reiniciar el sistema para iniciar la recopilación de datos.
Referencias
Consulte la documentación de MSDN en E/S sincrónica y asincrónica Para obtener información adicional.

Kbdss Asynczip ReadFile ReadFileEx WriteFile kbfile WriteFileEx GetOverlappedResult asincrónica sincrónica superpuesta no superpuesto

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 156932 - Última revisión: 06/25/2015 21:31:00 - Revisión: 7.0

Microsoft Win32 Application Programming Interface

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtes
Comentarios