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.
NT tabanlı işletim sisteminde, sürücüler çok iş parçacıklıdır; aynı anda farklı iş parçacıklarından birden çok G/Ç isteği alabilirler. Bir sürücü tasarlarken, bunun bir SMP sisteminde çalıştırılacağını varsaymalı ve veri bütünlüğünü sağlamak için uygun önlemleri almalısınız.
Özellikle, bir sürücü genel veya dosya nesnesi verilerini her değiştirildiğinde, yarış koşullarını önlemek için kilit veya kilitlenmiş bir dizi kullanmalıdır.
Genel veya dosya nesnesine özgü verilere başvururken yarış durumuyla karşılaşma
Aşağıdaki kod parçacığında, sürücü Data.LpcInfo'daki genel verilere eriştiğinde bir yarış durumu oluşabilir:
PLPC_INFO pLpcInfo = &Data.LpcInfo; //Pointer to global data
...
...
// This saved pointer may be overwritten by another thread.
pLpcInfo->LpcPortName.Buffer = ExAllocatePool(
PagedPool,
arg->PortName.Length);
IOCTL çağrısının sonucu olarak bu kodu giren birden çok iş parçacığı, işaretçinin üzerine yazılması nedeniyle bellek sızıntısına yol açabilir. Bu sorunu önlemek için sürücü genel verileri değiştirdiğinde ExInterlockedXxx yordamlarını veya bir tür kilidi kullanmalıdır. Sürücünün gereksinimleri kabul edilebilir kilit türlerini belirler. Daha fazla bilgi için bkz . Spin Locks, Kernel Dispatcher Objects ve ExAcquireResourceSharedLite.
Aşağıdaki örnek, uç nokta adresini tutmak için dosyaya özgü bir arabelleği (Endpoint-LocalAddress>) yeniden ayırmayı dener:
Endpoint = FileObject->FsContext;
if ( Endpoint->LocalAddress != NULL &&
Endpoint->LocalAddressLength <
ListenEndpoint->LocalAddressLength ) {
FREE_POOL (Endpoint->LocalAddress,
LOCAL_ADDRESS_POOL_TAG
);
Endpoint->LocalAddress = NULL;
}
if ( Endpoint->LocalAddress == NULL ) {
Endpoint->LocalAddress =
ALLOCATE_POOL (NonPagedPool,
ListenEndpoint->LocalAddressLength,
LOCAL_ADDRESS_POOL_TAG);
}
Bu örnekte, dosya nesnesine erişimlerle bir yarış durumu oluşabilir. Sürücü hiçbir kilit tutmadığından, aynı dosya nesnesi için iki istek bu işlevi girebilir. Sonuç, boşaltılan belleğe başvurular, aynı belleği boşaltmaya yönelik birden çok girişim veya bellek sızıntıları olabilir. Bu hataları önlemek için, iki if deyimi bir döndürme kilidi içine alınmalıdır.