Neden tek bir Windows işlem kimliği yok?


160

Windows'ta işlem kimliklerini incelemenin birçok yolu vardır.

Örneğin, PowerShell komutunu kullanarak:

ps | select Id, ProcessName  | Sort Id | ft -AutoSize

Aşağıdaki çıktıyı görüyoruz:

  Id ProcessName         
  -- -----------         
   0 Idle                
   4 System              
 264 svchost             
 388 smss                
 476 csrss               
 536 wininit             
 580 winlogon                      
 620 services            
 628 lsass                          
 728 svchost             
 828 dwm                                     
1060 chrome              
1080 rundll32            
1148 vmms                                        
1620 spoolsv                                                
2912 taskhostex          
3020 explorer       
...     

Tüm işlem kimlikleri çift sayılardır ve ek olarak hepsi 4'ün katlarıdır .

Herhangi bir Windows sürümünde Windows NT'yi temel alan tek bir işlem kimliği yoktur.

Bunun sebebi nedir?


6
Muhtemelen ilginç: Linux hakkında bazı bilgiler - justskins.com/forums/why-are-process-ids-204416.html
Dave

13
Gerçekten de hiç yok. Bu garip.
AndreKR

Yanıtlar:


168

"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



3
Bir alıntı, "programlama sözleşmesinin bir parçası olmadığı için ona güvenmemeniz gerektiğini" söylüyor , ancak daha sonra ntdef.h iddialarının "uygulama koduyla etiket bitleri olarak kullanılabileceğini" söyledi . Genel bir başlık dosyasındaki belgeler, alabileceğiniz "programlama sözleşmesine" yakın olduğundan, ilk iddia yanlıştır.
BlueRaja - Danny Pflughoeft

2
@BlueRaja, "Çok iyi bilinen bir şey, çekirdek HANDLE'lerinin en alttaki iki bitinin daima sıfır olması; başka bir deyişle, sayısal değerlerinin her zaman 4'ün bir katı olduğu anlamına gelir. " (KULLANICI kolları, GDI kolları, multimedya kolları ...)
DavidPostill

37
@BlueRaja: çekirdek tutamaçları dörtte birdir ve bu sözleşmeye bağlıdır, böylece ona güvenebilirsiniz; işlem kimlikleri (vardır değil süreç kolları ile aynı), bunun yerine, gerçekleşmesi dört katı olması, ancak bunun güvenmemelisiniz böylece, sadece bir uygulama ayrıntı.
Matteo Italia

6
@BlueRaja Raymond, size belgeyi yazanların dünyaya çekirdek rengindeki camlardan baktıklarını ve bu nedenle yalnızca diğer tutamaçlardan değil çekirdeği kulplardan bahsettiğini söyler .
CodesInChaos

1
@Mehrdad: Eh, USER ve GDI tutamaçları normalde "çekirdek" tutamaçları olarak adlandırılmaz (her ne kadar çekirdek modunda çalışan bileşenler tarafından oluşturulsalar da).
Matteo Italia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.