Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A partir de Windows 2000, los controladores pueden usar exclusiones mutuas rápidas si requieren una forma de exclusión mutua de baja sobrecarga para el código que se ejecuta en IRQL <= APC_LEVEL. Un mutex rápido puede proteger una ruta de código que solo un subproceso debe ejecutar a la vez. Para entrar en la ruta de acceso al código protegido, el subproceso adquiere el mutex. Si otro subproceso ya ha adquirido el mutex, la ejecución del subproceso actual se suspende hasta que se libere el mutex. Para que el hilo salga de la ruta de acceso de código protegida, libera el mutex.
A partir de Windows Server 2003, los controladores también pueden usar guarded mutexes. Los mutex protegidos son reemplazos directos para los mutex rápidos, pero ofrecen un mejor rendimiento. Al igual que una exclusión mutua rápida, una exclusión mutua protegida puede proteger una sección de código que solo debe ser accedida por un subproceso a la vez. Sin embargo, el código que usa mutexes protegidas se ejecuta más rápidamente que el código que usa mutexes rápidas.
En las versiones de Windows anteriores a Windows 8, los mutexes protegidos se implementan de forma diferente a los mutexes rápidos. Una ruta de acceso de código protegida por un mutex rápido se ejecuta en IRQL = APC_LEVEL. Una ruta de acceso de código protegida por un mutex protegido se ejecuta en IRQL <= APC_LEVEL pero con todos los APC deshabilitados. En estas versiones anteriores de Windows, la adquisición de un mutex protegido es una operación más rápida que la adquisición de un mutex rápido. Sin embargo, estos dos tipos de mutex se comportan de forma idéntica y están sujetos a las mismas restricciones. En concreto, las rutinas de kernel que no son válidas para llamar a IRQL = APC_LEVEL no deben llamarse desde una ruta de acceso de código protegida por un mutex rápido o un mutex protegido.
A partir de Windows 8, los guarded mutexes se implementan como fast mutexes. En una ruta de acceso de código protegida por una exclusión mutua protegida o una exclusión mutua rápida, Driver Verifier trata las llamadas a rutinas de kernel como si ocurrieran en IRQL = APC_LEVEL. Como en versiones anteriores de Windows, las llamadas que son ilegales en APC_LEVEL también son ilegales en una ruta de acceso de código protegida por un mutex protegido o un mutex rápido.
Exclusión mutua rápida
Una exclusión mutua rápida se representa mediante una estructura FAST_MUTEX . El controlador asigna su propio almacenamiento para una estructura de FAST_MUTEX y, a continuación, llama a la rutina ExInitializeFastMutex para inicializar la estructura.
Un hilo adquiere un mutex rápido mediante una de las siguientes acciones:
Llamar a la rutina ExAcquireFastMutex. Si otro subproceso ya ha adquirido el mutex, la ejecución del subproceso que realiza la llamada se suspende hasta que el mutex esté disponible.
Llamar a la rutina ExTryToAcquireFastMutex para intentar adquirir la exclusión mutua rápida sin suspender el subproceso actual. La rutina devuelve inmediatamente, independientemente de si se ha adquirido el mutex. ExTryToAcquireFastMutex devuelve TRUE si adquirió correctamente el mutex para el autor de la llamada; de lo contrario, devuelve FALSE.
Un hilo llama a ExReleaseFastMutex para liberar una exclusión mutua rápida que fue adquirida por ExAcquireFastMutex o ExTryToAcquireFastMutex.
Una ruta de código protegida por un mutex rápido se ejecuta en IRQL = APC_LEVEL. ExAcquireFastMutex y ExTryToAcquireFastMutex generan el IRQL actual para APC_LEVEL y ExReleaseFastMutex restaura el IRQL original. Por lo tanto, todas las APC están deshabilitadas mientras el subproceso mantiene un fast mutex.
Si se garantiza que una ruta de ejecución de código siempre opere en APC_LEVEL, el controlador puede llamar a ExAcquireFastMutexUnsafe y ExReleaseFastMutexUnsafe para adquirir y liberar una exclusión mutua rápida. Estas rutinas no cambian el IRQL actual y solo se pueden usar de forma segura cuando el IRQL actual es APC_LEVEL.
Los mutexes rápidos no pueden ser adquiridos de forma recursiva. Si un subproceso que ya posee un mutex rápido intenta adquirirlo, ese subproceso producirá un interbloqueo. Los mutex rápidos solo se pueden usar en el código que se ejecuta en IRQL <= APC_LEVEL.
Mutexes protegidos
Las exclusiones mutuas protegidas, que están disponibles a partir de Windows Server 2003, realizan la misma función que las exclusión mutuas rápidas, pero con un mayor rendimiento.
A partir de Windows 8, los mutexes protegidos y los mutexes rápidos se implementan de forma idéntica.
En versiones de Windows anteriores a Windows 8, los mutex protegidos se implementan de forma diferente a los mutex rápidos. La adquisición de un mutex rápido eleva el nivel de IRQL actual a APC_LEVEL, mientras que la adquisición de un mutex protegido entra en un contexto protegido, que es una operación más rápida. Para obtener más información sobre las regiones protegidas, consulte regiones críticas y regiones protegidas.
Una estructura KGUARDED_MUTEX representa un mutex protegido. El controlador asigna su propio almacenamiento para una estructura de KGUARDED_MUTEX y, a continuación, llama a la rutina KeInitializeGuardedMutex para inicializar la estructura.
Un hilo adquiere un mutex protegido realizando una de las siguientes acciones:
Llamada a KeAcquireGuardedMutex. Si otro subproceso ya ha adquirido el mutex, la ejecución del subproceso que realiza la llamada se suspende hasta que el mutex esté disponible.
Llamar a KeTryToAcquireGuardedMutex para intentar adquirir la exclusión mutua protegida sin suspender el subproceso actual. La rutina devuelve inmediatamente, independientemente de si se ha adquirido el mutex. KeTryToAcquireGuardedMutex devuelve TRUE si adquirió correctamente el mutex para el autor de la llamada; de lo contrario, devuelve FALSE.
Un subproceso llama a KeReleaseGuardedMutex para liberar una exclusión mutua protegida adquirida por KeAcquireGuardedMutex o KeTryToAcquireGuardedMutex.
Un hilo que posee un mutex protegido se ejecuta implícitamente dentro de una región protegida. KeAcquireGuardedMutex y KeTryToAcquireGuardedMutex entran en la región protegida, mientras KeReleaseGuardedMutex la abandona. Todas las APC están deshabilitadas mientras el subproceso mantiene una exclusión mutua protegida.
Si se garantiza que una ruta de acceso de código se ejecute con todos los APC deshabilitados, el controlador puede usar KeAcquireGuardedMutexUnsafe y KeReleaseGuardedMutexUnsafe para adquirir y liberar el mutex protegido. Estas rutinas no entran ni salen de una región protegida y solo se pueden usar dentro de una región protegida ya existente o en IRQL = APC_LEVEL.
Los mutexes protegidos no se pueden adquirir recursivamente. Si un subproceso que ya tiene un mutex protegido intenta adquirirlo, ese subproceso entrará en un punto muerto. Mutexes protegidos solo pueden usarse en código que se ejecuta en IRQL <= APC_LEVEL.