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.
Herhangi bir sürücü, sürücü tarafından oluşturulan iş parçacıkları ve diğer sürücü yordamları arasındaki işlemleri eşitlemek için bir semafor nesnesi kullanabilir. Örneğin, sürücü için bekleyen G/Ç istekleri olmadığında sürücüye ayrılmış bir iş parçacığı kendisini bekleme durumuna alabilir ve sürücünün dağıtım yordamları, bir IRP'yi kuyruğa aldıktan hemen sonra semaforu Sinyalli durumuna ayarlayabilir.
G/Ç işlemi isteyen iş parçacığı bağlamında çalıştırılan en üst düzey sürücülerin dağıtım yordamları, dağıtım yordamları arasında paylaşılan bir kaynağı korumak için bir semafor kullanabilir. Zaman uyumlu G/Ç işlemleri için alt düzey sürücü dağıtım yordamları, dağıtım yordamlarının alt kümesi arasında paylaşılan bir kaynağı veya sürücü tarafından oluşturulan bir iş parçacığıyla paylaşılan bir kaynağı korumak için semafor da kullanabilir.
Semafor nesnesi kullanan herhangi bir sürücü, semaforu beklemeden veya serbest bırakmadan önce KeInitializeSemaphore çağırmalıdır. Aşağıdaki şekilde, iş parçacığına sahip bir sürücünün semafor nesnesini nasıl kullanabileceği gösterilmektedir.
Semafor nesnesinin beklediğini gösteren 
Önceki şekilde gösterildiği gibi, böyle bir sürücü semafor nesnesinin depolama alanını sağlamalıdır ve bu da yerleşik olmalıdır. Sürücü, sürücü tarafından oluşturulan bir cihaz nesnesinin cihaz uzantısını, birdenetleyici nesnesi veya sürücü tarafından ayrılan sayfalanmamış havuz kullanıyorsa denetleyici uzantısını kullanabilir.
Sürücünün AddDevice yordamı KeInitializeSemaphore çağırdığında, semafor nesnesi için sürücünün yerleşik depolamasına bir işaretçi geçirmesi gerekir. Buna ek olarak, çağıranın önceki şekilde gösterildiği gibi semafor nesnesi için ilk durumunu (Signaled için sıfır olmayan) belirleyen bir Count belirtmesi gerekir.
Çağıranın ayrıca semafor için aşağıdakilerden biri olabilecek bir Sınırı belirtmesi gerekir:
Sınırı = 1
Bu semafor Signaled durumuna ayarlandığında, semaforunun Signaled durumuna ayarlanmasını bekleyen tek bir iş parçacığı yürütme için uygun hale gelir ve semafor tarafından korunan kaynağa erişebilir.
Bu tür semafor, bir iş parçacığının semafor korumalı kaynağa özel erişimi olduğundan veya olmadığından ikili semafor olarak da adlandırılır.
Sınırı > 1
Bu semafor Signaled durumuna ayarlandığında, semafor nesnesinin Signaled durumuna ayarlanmasını bekleyen bazı iş parçacıkları yürütme için uygun hale gelir ve semafor tarafından korunan kaynağa erişebilir.
Semaforu Signaled durumuna ayarlayan yordam, durumlarının bekleme durumundan hazır duruma dönüştürülebileceği de belirtildiğinden, bu semafor türüne sayma semaforu denir. Bu tür bekleyen iş parçacıklarının sayısı, semafor başlatıldığında ayarlanan Sınırı veya bu önceden ayarlanmış Sınırıdeğerinden küçük bir sayı olabilir.
Birkaç cihaz veya ara sürücünün sürücü tarafından oluşturulmuş tek bir iş parçacığı vardır; hatta daha azının semaforun elde edilmesi veya serbest bırakılması için bekleyebilecek bir dizi iş parçacığı vardır. Sistem tarafından sağlanan az sayıda sürücü semafor nesneleri kullanır ve bunu yapanlardan daha azı ikili semafor kullanır. İkili semafor, birmutex nesnesine benzer görünse de, ikili semafor, SMP makinelerinde çalışan sistem iş parçacıkları için bir mutex nesnesinin sahip olduğu kilitlenmelere karşı yerleşik koruma sağlamaz.
Başlatılan semafora sahip bir sürücü yüklendikten sonra, paylaşılan kaynağı koruyan semafor üzerindeki işlemleri eşitleyebilir. Örneğin, sistem disket denetleyicisi sürücüsü gibi IRP'lerin kuyruğa alma işlemini yöneten, cihaza ayrılmış bir iş parçacığına sahip bir sürücü, önceki şekilde gösterildiği gibi bir semafor üzerinde IRP kuyruğa alma işlemini eşitleyebilirsiniz:
İş parçacığı, başlatılan semafor nesnesinin kendisini bekleme durumuna geçirmesi için sürücü tarafından sağlanan depolamaya yönelik bir işaretçiyle KeWaitForSingleObject çağırır.
Cihaz G/Ç işlemleri gerektiren IP'ler gelmeye başlar. Sürücünün dağıtım yordamları, bu tür her IRP'yi spin-lock denetimi altında kilitlenmiş bir kuyruğa ekler ve semafor nesnesinin işaretçisiyle keReleaseSemaphoreçağırır, her IRP kuyruğa alınırken semaforun Sayısı'na eklenen 1 Ayarlama iş parçacığı için sürücü tarafından belirlenen öncelik artırması (önceki şekilde gösterildiği gibiArtış), ve Boole WaitFALSEolarak ayarlanır. Sıfır olmayan semafor sayısı semafor nesnesini Signaled durumuna ayarlar ve böylece bekleyen iş parçacığının durumunu hazır olarak değiştirir.
Çekirdek, bir işlemci kullanılabilir olduğunda iş parçacığını yürütme için gönderir: başka bir deyişle, daha yüksek önceliğe sahip başka bir iş parçacığı şu anda hazır durumda değildir ve daha yüksek bir IRQL'de çalıştırılacak çekirdek modu yordamları yoktur.
İş parçacığı, spin-lock denetimi altındaki kilitlenmiş kuyruktan bir IRP'yi kaldırır, daha fazla işleme için diğer sürücü yordamlarına geçirir ve KeWaitForSingleObject yeniden çağırır. Semafor hala Signaled durumuna ayarlanırsa (yani, Sayısı sıfır olmayan olarak kalırsa, sürücünün birbirine kilitlenmiş kuyruğunda daha fazla IRP olduğunu gösterir), çekirdek iş parçacığının durumunu yeniden beklemeden hazır duruma getirir.
Bu şekilde bir sayma semaforu kullanıldığında, böyle bir sürücü iş parçacığı "bilir", bu iş parçacığı her çalıştırıldığında kilitlenmiş kuyruktan kaldırılacak bir IRP vardır.
keReleaseSemaphore ararken IRQL yönetimine özgü bilgiler için KeReleaseSemaphore'nin Açıklamalar bölümüne bakın.
PASSIVE_LEVEL'den büyük bir IRQL'de çalışan herhangi bir standart sürücü yordamı, sistemi düşürmeden herhangi bir dağıtıcı nesnesinde sıfır olmayan bir aralık bekleyemez; Ayrıntılar için bkz. çekirdek dağıtıcı nesneleri . Ancak bu tür bir yordam, DISPATCH_LEVEL küçük veya eşit bir IRQL'de çalışırken KeReleaseSemaphore çağırabilir.
Standart sürücü yordamlarının çalıştırıldığı IRQL'lerin özeti için bkz. Donanım Önceliklerini Yönetme. Belirli bir destek yordamının IRQL gereksinimleri için yordamın başvuru sayfasına bakın.