"Neden tuhaf Windows işlem kimlikleri yok?"
Çekirdek tutamaçlarını ayıran aynı kod, işlem ve iş parçacığı kimliklerini tahsis etmek için de kullanılır. Çekirdek tutamaçlarının dört katı olduğu için, işlem ve iş parçacığı kimlikleri de vardır.
Neden işlem ve iş parçacığı kimlikleri dört katları?
Windows NT tabanlı işletim sistemlerinde, işlem ve iş parçacığı kimlikleri her zaman dörtün katı olur. bu sadece bir tesadüf mü?
Evet, bu sadece bir tesadüf ve programlama sözleşmesinin bir parçası olmadığı için buna güvenmemelisiniz. Örneğin, Windows 95 işlem ve iş parçacığı kimlikleri her zaman dörtün katları değildi. (Karşılaştırma yapıldığında, çekirdek tutamaçlarının her zaman dörtte bir katı olması nedeni, belirtimin bir parçasıdır ve öngörülebilir gelecek için garanti edilecektir.)
İşlem ve iş parçacığı kimlikleri, kodun yeniden kullanılmasının yan etkisi olarak dördün katlarıdır. Çekirdek tutamaçlarını ayıran aynı kod, işlem ve iş parçacığı kimliklerini tahsis etmek için de kullanılır. Çekirdek tutamaçlarının dört katı olduğu için, işlem ve iş parçacığı kimlikleri de vardır. Bu bir uygulama detayıdır, bu yüzden ona güvenen bir kod yazmayın. Sadece merakını tatmin etmeni söylüyorum.
Kaynak Neden işlem ve iş parçacığı kimlikleri dört katları?
Çekirdek HANDLE'leri neden her zaman dörtte bir kat ediyorlar?
Çok iyi bilinmeyen, çekirdek HANDLE'lerin altındaki iki bitin daima sıfır olduğu; Başka bir deyişle, sayısal değerleri her zaman 4'ün katıdır. Bunun yalnızca çekirdek HANDLE'leri için geçerli olduğunu unutmayın; sözde tutamaçlara veya başka herhangi bir tutamaç tipine uygulanmaz (KULLANICI tutamaçları, GDI tutamaçları, multimedya tutamaçları ...) Çekirdek tutamaçları, CloseHandle işlevine geçirebileceğiniz şeylerdir.
Alttaki iki bitin kullanılabilirliği ntdef.h başlık dosyasına gömülür:
//
// Low order two bits of a handle are ignored by the system and available
// for use by application code as tag bits. The remaining bits are opaque
// and used to store a serial number and table index.
//
#define OBJ_HANDLE_TAGBITS 0x00000003L
En azından çekirdek HANDLE'lerinin alt bitinin her zaman sıfır olduğu GetQueuedCompletionStatus işlevi tarafından belirtilir; bu, tamamlama bağlantı noktası bildirimini bastırmak için olay tanıtıcısının alt bitini ayarlayabileceğinizi gösterir. Bunun çalışması için alt bit normalde sıfır olmalıdır.
Bu bilgiler, HANDLE'lere opak değerler olarak davranmaya devam etmesi gereken çoğu uygulama yazarı için yararlı değildir. Etiket bitlerine ilgi duyanlar, düşük seviyeli sınıf kütüphaneleri uygulayan veya çekirdek nesneleri daha geniş bir çerçeveye yerleştiren kişilerdir.
Kaynak Niçin çekirdek HANDLE'leri her zaman dörtte bir kat ederler?
daha fazla okuma