Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Windows 2000'den başlayarak, sürücüler IRQL <= APC_LEVEL'de çalışan kod için düşük ek yük karşılıklı dışlama biçimine ihtiyaç duyduklarında hızlı mutex'leri kullanabilir. Hızlı bir mutex, aynı anda yalnızca bir thread tarafından girilmesi gereken bir kod yolunu koruyabilir. Korumalı kod yoluna girmek için iş parçacığı mutex'i edinir. Eğer başka bir iş parçacığı zaten mutex'i aldıysa, mutex serbest bırakılana kadar geçerli iş parçacığının yürütülmesi askıya alınır. Korumalı kod yolundan çıkmak için iş parçacığı mutex'i serbest bırakır .
Windows Server 2003'den başlayarak, sürücüler korumalı mutex'leri de kullanabilir. Korunan mutex'ler hızlı mutex'lerin yerine geçer ancak daha iyi performans sağlar. Hızlı bir mutex gibi korumalı bir mutex de aynı anda yalnızca bir iş parçacığı tarafından girilmesi gereken bir kod yolunu koruyabilir. Ancak, korunan mutex'leri kullanan kod, hızlı mutex kullanan koddan daha hızlı çalışır.
Windows'un Windows 8'den önceki sürümlerinde, korunan mutex'ler hızlı mutex'lerden farklı şekilde uygulanır. Hızlı bir mutex tarafından korunan bir kod yolu IRQL = APC_LEVEL'de çalışır. Korumalı bir mutex tarafından korunan bir kod yolu IRQL <= APC_LEVEL'de çalışır ancak tüm APC'ler devre dışı bırakılır. Windows'un bu önceki sürümlerinde korunan bir mutex'in alınması, hızlı bir mutex'in alınmasından daha hızlı bir işlemdir. Ancak, bu iki tür mutex aynı şekilde davranır ve aynı kısıtlamalara tabidir. Özellikle, IRQL = APC_LEVEL seviyesinde çağrı yapılması yasadışı olan çekirdek yordamları, hızlı kilit veya korumalı kilit ile korunan bir kod yolundan çağrılmamalıdır.
Windows 8'den başlayarak korumalı mutex'ler hızlı mutexler olarak uygulanır. Korumalı bir mutex veya hızlı bir mutex ile korunan bir kod yolunda Driver Verifier, çekirdek yordamlarına yapılan çağrıları IRQL = APC_LEVEL seviyesinde ele alır. Windows'un önceki sürümlerinde olduğu gibi, APC_LEVEL'de yasadışı olan çağrılar, korumalı veya hızlı bir mutex ile korunan bir kod yolunda da yasadışıdır.
Hızlı Mutex'ler
Hızlı bir mutex FAST_MUTEX yapısı ile temsil edilir. Sürücü , FAST_MUTEX bir yapı için kendi depolama alanını ayırır ve ardından yapıyı başlatmak için ExInitializeFastMutex yordamını çağırır.
İş parçacığı aşağıdakilerden birini yaparak hızlı bir mutex alır:
ExAcquireFastMutex yordamını çağırma. Mutex başka bir iş parçacığı tarafından zaten alınmışsa, mutex kullanılabilir olana kadar çağıran iş parçacığının yürütülmesi durdurulur.
Geçerli iş parçacığını askıya almadan hızlı mutex'i elde etmeye çalışmak için ExTryToAcquireFastMutex rutinini çağırma. Yordam, mutex'in alınıp alınmadığına bakılmaksızın hemen geri döner. Arayan için mutex'i başarıyla aldıysa ExTryToAcquireFastMutexTRUE döndürür; aksi takdirde YANLIŞ döndürür.
Bir iş parçacığı, ExAcquireFastMutex veya ExTryToAcquireFastMutex tarafından alınan hızlı bir mutexi serbest bırakmak için ExReleaseFastMutex çağırır.
Hızlı bir mutex tarafından korunan bir kod yolu IRQL = APC_LEVEL'de çalışır. ExAcquireFastMutex ve ExTryToAcquireFastMutex , geçerli IRQL'i APC_LEVEL yükseltir ve ExReleaseFastMutex özgün IRQL'i geri yükler. Bu nedenle, iş parçacığı hızlı bir mutex tutarken tüm APC'ler devre dışı bırakılır.
Bir kod yolunun her zaman APC_LEVEL'da çalışması garanti edilirse, sürücü bunun yerine hızlı bir mutex almak ve serbest bırakmak için ExAcquireFastMutexUnsafe ve ExReleaseFastMutexUnsafe çağrısını yapabilir. Bu yordamlar geçerli IRQL'i değiştirmez ve yalnızca geçerli IRQL APC_LEVEL olduğunda güvenli bir şekilde kullanılabilir.
Hızlı mutex'ler özyinelemeli olarak alınamaz. Zaten hızlı bir mutex tutan bir iş parçacığı onu almaya çalışırsa, bu iş parçacığı kilitlenmeye neden olur. Hızlı mutex'ler yalnızca IRQL <= APC_LEVEL'de çalışan kodlarda kullanılabilir.
Korunan Mutexes
Windows Server 2003'den itibaren kullanılabilen korumalı mutex'ler, hızlı mutex'lerle aynı işlevi ancak daha yüksek performansla gerçekleştirir.
Windows 8'den başlayarak korumalı mutex'ler ve hızlı mutex'ler aynı şekilde uygulanmaktadır.
Windows 8'den önceki Windows sürümlerinde, korunan mutex'ler hızlı mutex'lerden farklı şekilde uygulanmıştır. Hızlı bir mutex elde etmek, geçerli IRQL'i APC_LEVEL'a yükseltirken, korumalı bir mutex elde etmek, daha hızlı bir işlem olan korumalı bölgeye girme işlemini gerçekleştirir. Korunan bölgeler hakkında daha fazla bilgi için bkz. Kritik Bölgeler ve Korunan Bölgeler.
Korunan bir mutex, KGUARDED_MUTEX yapısı ile temsil edilir. Sürücü , KGUARDED_MUTEX bir yapı için kendi depolama alanını ayırır ve ardından yapıyı başlatmak için KeInitializeGuardedMutex yordamını çağırır.
İş parçacığı aşağıdakilerden birini yaparak korunan bir mutex alır:
KeAcquireGuardedMutex çağırıldı. Mutex başka bir iş parçacığı tarafından zaten alınmışsa, mutex kullanılabilir olana kadar çağıran iş parçacığının yürütülmesi durdurulur.
Geçerli thread'i askıya almadan korunan mutex'i edinmeye çalışmak için KeTryToAcquireGuardedMutex çağrılır. Yordam, mutex'in alınıp alınmadığına bakılmaksızın hemen geri döner. KeTryToAcquireGuardedMutex , arayan için mutex'i başarıyla aldıysa TRUE döndürür; aksi takdirde YANLIŞ döndürür.
Bir iş parçacığı, KeReleaseGuardedMutex metodunu, KeAcquireGuardedMutex veya KeTryToAcquireGuardedMutex ile elde edilen korumalı bir mutex'i serbest bırakmak için çağırır.
Korumalı bir mutex tutan bir iş parçacığı, korumalı bir bölgede varsayılan olarak çalışır. KeAcquireGuardedMutex ve KeTryToAcquireGuardedMutex korunan bölgeye girerken KeReleaseGuardedMutex bu bölgeden çıkar. İş parçacığı korumalı bir mutex barındırırken tüm APC'ler devre dışı bırakılır.
Bir kod yolunun tüm APC'ler devre dışı bırakıldığında çalıştırılması garanti edilirse, sürücü bunun yerine keAcquireGuardedMutexUnsafe ve KeReleaseGuardedMutexUnsafe kullanarak korunan mutex'i alabilir ve serbest bırakabilir. Bu yordamlar korumalı bir bölgeye girmez veya bu bölgeden çıkmaz ve yalnızca zaten var olan korumalı bir bölgede veya IRQL = APC_LEVEL'de kullanılabilir.
Korunan mutex'ler özyinelemeli olarak alınamaz. Zaten korunan bir mutex tutan bir iş parçacığı onu almaya çalışırsa, bu iş parçacığı kilitlenmeye neden olur. Korunan mutex'ler yalnızca IRQL <= APC_LEVEL çalışan kodlarda kullanılabilir.