E/S de disco asincrónicas aparece como sincrónica en Windows NT, Windows 2000 y Windows XP

Seleccione idioma Seleccione idioma
Id. de artículo: 156932 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

E/S de archivos en Microsoft Windows NT, Windows 2000 y Windows XP pueden ser sincrónica o asincrónica. El comportamiento predeterminado de i/OS es sincrónico: llama a una función de i/OS y devuelve una vez completada la E/S. E/S asincrónica, por otra parte, permite a una función de i/OS devolver inmediatamente la ejecución al llamador, pero no se supone que las i/OS 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 mediante el uso de servicios del sistema operativo.

La ventaja de operaciones de E/S asincrónicas es que el llamador tiene tiempo para hacer otros de trabajo o emitir solicitudes de más mientras se completa la operación de E/S. La término Overlapped i/OS con frecuencia se utiliza para la E/S asincrónica y no superpuesto I/OS para operaciones de E/S sincrónica. Este artículo utilizan los términos asincrónico y Sincrónico para las operaciones de E/S en Windows NT. En este artículo se supone que el lector tiene cierta familiaridad con las funciones de E/S de archivos como CreateFile, ReadFile, WriteFile.

Con frecuencia, las operaciones de E/S asincrónicas se comportan sólo como sincrónica i/OS. determinados condiciones de este artículo se describe en las secciones posteriores hacen las i/OS las operaciones de completarán sincrónicamente. El llamador no tiene tiempo para el fondo trabajo porque no se devuelven las funciones de E/S 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; buenas alternativas sería ReadFileEx y WriteFileEx. Aunque este artículo describe sólo E/S de disco en concreto, muchos de los principios se pueden aplicar a otros tipos de E/S, como E/S de red o de E/S serie.

Nota: dado que Windows 95 no admite operaciones de E/S asincrónicas en dispositivos de disco (aunque lo hace en otros tipos de dispositivos de E/S), su comportamiento no se aborda en este artículo.

Más información

Configurar operaciones de E/S asincrónicas

Debe especificarse la marca FILE_FLAG_OVERLAPPED en CreateFile cuando se abre el archivo. Este indicador permite operaciones de E/S en el archivo que se deben realizar 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 operaciones de E/S asincrónicas porque el sistema reserva la derecho a realizar 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 que puedan realizarse de forma sincrónica o asincrónica. El código de ejemplo muestra esta consideración.

Hay muchas cosas que un programa puede hacer mientras espera asincrónica operaciones en completarse, tales como cola de operaciones adicionales, o haciendo trabajo en segundo plano. Por ejemplo, el código siguiente controla correctamente superpuestos y no superpuesto la finalización de una operación de lectura. Lo hace nada más que esperar la E/S pendiente 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 & es diferente de NumberOfBytesRead pasado a ReadFile & NumberOfBytesTransferred pasa a GetOverlappedResult. If una operación se ha realizado asincrónica, a continuación, GetOverlappedResult se utiliza para determinar el número real de bytes transferidos en la operación una vez que haya completado. El & NumberOfBytesRead pasado a ReadFile carece de sentido.

Si, por otra parte, se completa una operación inmediatamente, a continuación & NumberOfBytesRead pasado a ReadFile es válida para el número de bytes leídos. En este caso, pasar por alto la estructura OVERLAPPED pasada 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 el otro palabras, si tiene tres operaciones de E/S pendientes, debe utilizar tres estructuras OVERLAPPED. Si volver a utilizar 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 superpuesta por primera vez, o antes de reutilizar una vez se ha completado una operación anterior, primero debe correctamente inicializarlo por lo que no hay datos de sobra afecta a la operación nueva.

Se aplica el mismo tipo de restricción para el búfer de datos utilizado en un operación. Un búfer de datos no se debe leer o escribir hasta su se ha completado la operación de E/S correspondiente; leer o escribir el búfer puede causar errores y los datos dañados.

Asincrónica i/OS 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 cotidianamente sincrónicamente en el pedido y ninguna de las operaciones de ReadFile devuelve FALSE con GetLastError() devolver ERROR_IO_PENDING, esto significa que no tiene tiempo para las tareas en segundo plano. ¿Por qué ocurre esto?

Hay una serie de razones de por qué ejecutar las operaciones de E/S en forma sincrónica Aunque especificado en el código de operación asincrónica:

Compresión

Obstrucción de una operación asincrónica es la compresión de NTFS. El archivo controlador del sistema no tendrá acceso a los archivos comprimidos de forma asincrónica; en su lugar todos los las operaciones sólo se realizan sincrónicas. Esto no se aplica a los archivos que están comprimido con utilidades similares a comprimir o PKZIP.

Cifrado de NTFS

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

Ampliación de un archivo

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

Nota: las aplicaciones pueden realizar la operación de escritura mencionados anteriormente a asincrónica cambiando la longitud de datos válido del archivo utilizando la función SetFileValidData y, a continuación, emite una escritura.

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

Dado que el sistema de archivos NTFS no es cero-relleno de los datos hasta la longitud de los datos válidos (VDL) que se define por SetFileValidData, esta función tiene implicaciones de seguridad donde el archivo se puede asignar los clústeres que anteriormente fueron 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 detenidamente las implicaciones de utilizar esta función.

Memoria caché

La mayoría de los controladores de E/S (disco, comunicaciones y otros) tienen un código caso especial, donde, si una solicitud de E/S puede completarse "inmediato", se puede completar la operación y la función ReadFile o WriteFile devolverá TRUE. En todos los aspectos, estos tipos de operaciones parecen ser sincrónico. Para un disco dispositivo, por lo general, se puede completar una solicitud de E/S "inmediatamente" cuando se almacena en caché los datos en la memoria.

Datos no están en caché

El esquema de la memoria caché puede trabajar con usted, sin embargo, si los datos no están en el memoria caché. La caché de Windows NT se implementa internamente mediante asignaciones de archivo. El Administrador de memoria en Windows NT no proporciona una página asincrónica mecanismo de errores para administrar las asignaciones de archivo utilizadas por el Administrador de caché. La Administrador de caché puede, sin embargo, comprobar si la página solicitada está en la memoria, por lo que si se emite una lectura asincrónica en caché, y las páginas no están en la memoria, se supone que el controlador de sistema de archivos 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), que se aún se sólo algunas solicitudes en cola para el controlador de disco en un momento determinado. Si emite un lote de las operaciones de E/S de los datos que no están en la caché, el Administrador de caché y el Administrador de memoria se saturan y las solicitudes se realizan sincrónicas.

También se puede influir en el comportamiento del Administrador de caché en función de si tener acceso a un archivo de forma secuencial o aleatoria. Se ven los beneficios de la memoria caché mayoría al tener acceso a archivos de forma secuencial. El indicador FILE_FLAG_SEQUENTIAL_SCAN en el CreateFile llamada optimizará la memoria caché para este tipo de acceso. Sin embargo, si tiene acceso a los archivos de forma aleatoria, use el Indicador FILE_FLAG_RANDOM_ACCESS en CreateFile para indicar al administrador de caché optimizar su comportamiento para acceso aleatorio.

No utilice la memoria caché

El marcador FILE_FLAG_NO_BUFFERING tiene el máximo efecto en el comportamiento de la sistema de archivos para la operación asincrónica. Esta es la mejor manera de garantizar que las solicitudes de E/S son realmente asincrónicas. Indica el sistema de archivos que no utilice cualquier caché mecanismo en absoluto.

Advertencia: existen 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 la 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 de la los números no es importante aquí y varía de un equipo a otro, pero la relación de los números compara entre sí se ilumina el efecto general de los indicadores de rendimiento.

Puede esperar ver resultados similares al siguiente:
  • 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 demuestra que el programa mencionado anteriormente emitió 500 solicitudes de E/S rápidamente y tenía una gran cantidad de tiempo para efectuar otros trabajos o emitir solicitudes de más.
  • 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 dedicado a 4.495880 segundos una llamada a ReadFile para completar sus operaciones, mientras que la prueba 1 sólo 0.224264 segundos para emitir las mismas solicitudes de empleado. En la prueba 2, no hubo tiempo "extra" para el programa realizar cualquier fondo trabajo.
  • 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 memoria caché. Todas las lecturas se han emitido y completados en 0.251670 segundos. En otras palabras, las solicitudes asincrónicas se completaron de forma sincrónica. Esta prueba también Muestra el alto rendimiento del Administrador de caché cuando los datos están en la memoria caché.
  • Prueba de 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. Tenga en cuenta que Lecturas sincrónicas 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 lleva a cabo el programa.

El acceso a los archivos de forma predeterminada sin especificar los indicadores especiales a CreateFile es 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 asincrónica lectura anticipada y asincrónica escritura lenta de datos modificados. Aunque esto no tiene la s de la aplicación [ASCII 146] E/S asincrónica, es el escenario ideal para la mayoría de las aplicaciones sencillas.

Si, por otra parte, la aplicación no es sencilla, tendrá que hacer Algunas opciones de generación de perfiles y supervisión del rendimiento para determinar el mejor método, es similar a las pruebas que se muestra anteriormente en este artículo. Generación de perfiles el tiempo invertido en la La función ReadFile o WriteFile y luego comparar esta vez cómo largo que tarda para que las operaciones de E/S reales completar es extremadamente útiles. Si la mayoría el tiempo se invierte en la realidad emite la E/S, a continuación, la E/S está siendo se ha completado sincrónicamente. Sin embargo, si el tiempo dedicado a las solicitudes de E/S emisor es relativamente pequeño respecto a la tiene para las operaciones de E/S para completa, a continuación, las operaciones son tratadas asincrónicamente. En el ejemplo de código mencionado anteriormente en este artículo utiliza la función de QueryPerformanceCounter para realizar su propio generación de perfiles interno.

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

Existen diversas herramientas que son útiles para supervisar el rendimiento; Monitor de rendimiento de DiskPerf son especialmente útiles. Para que el sistema recopilar datos sobre el rendimiento de los sistemas de disco, debe emitir el comando diskperf -y. Después de emitir el comando, debe reiniciar el sistema para iniciar la recolección de datos.

Referencias

Para obtener más información acerca de estas utilidades y la supervisión del rendimiento, consulte el volumen "Optimizing Windows NT" en el recurso de Windows NT Documentación del Kit.
SQL Server requiere sistemas de apoyo "entrega garantizada a medios estables" tal como se indica en el programa de revisión de soluciones de almacenamiento de información de Microsoft SQL Server Maletín le. FOPara obtener más información acerca de los requisitos de entrada y salidos para el motor de base de datos de SQL Server, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
967576Requisitos de entrada y salida de motor base de datos de Microsoft SQL Server

Propiedades

Id. de artículo: 156932 - Última revisión: jueves, 30 de mayo de 2013 - Versión: 6.0
La información de este artículo se refiere a:
  • 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
Palabras clave: 
kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtes
Traducción automática
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

Enviar comentarios

 

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