कोई विन्डोज़ प्रोसेस आईडी क्यों नहीं हैं?


160

विंडोज में प्रोसेस आईडी की जांच करने के कई तरीके हैं।

उदाहरण के लिए, PowerShell कमांड का उपयोग करना:

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

हम निम्नलिखित आउटपुट देखते हैं:

  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       
...     

सभी प्रक्रिया आईडी संख्याएँ हैं और, इसके अलावा, वे सभी 4 के गुणक हैं

विंडोज के किसी भी संस्करण पर कोई विषम प्रक्रिया आईडी नहीं है जो विंडोज एनटी पर आधारित है।

इसका कारण क्या है?


6
संभवत: दिलचस्प है: linux के बारे में कुछ डिटैला - justskins.com/forums/why-are-process-ids-204416.html
डेव

13
वास्तव में कोई भी नहीं हैं। अजीब है कि।
आंद्रेकेआर

जवाबों:


168

"कोई अजीब विंडोज प्रक्रिया Ids क्यों हैं?"

समान कोड जो कर्नेल हैंडल आवंटित करता है, का उपयोग प्रक्रिया और थ्रेड आईडी आवंटित करने के लिए भी किया जाता है। चूंकि कर्नेल हैंडल चार में से कई हैं, इसलिए प्रक्रिया और थ्रेड आईडी भी हैं।


प्रक्रिया और थ्रेड आईडी चार के गुणक क्यों हैं?

विंडोज एनटी-आधारित ऑपरेटिंग सिस्टम पर, प्रक्रिया और थ्रेड आईडी हमेशा चार के एक से अधिक होते हैं। क्या यह सिर्फ एक संयोग है?

हां, यह सिर्फ एक संयोग है, और आपको इस पर भरोसा नहीं करना चाहिए क्योंकि यह प्रोग्रामिंग अनुबंध का हिस्सा नहीं है। उदाहरण के लिए, विंडोज 95 प्रक्रिया और थ्रेड आईडी हमेशा चार के गुणक नहीं थे। (तुलना करके, कि कर्नेल के हैंडल हमेशा चार में से कई होते हैं, विनिर्देश का हिस्सा है और भविष्य के भविष्य के लिए इसकी गारंटी होगी।)

प्रक्रिया और थ्रेड आईडी कोड पुन: उपयोग के साइड-इफेक्ट के रूप में चार के गुणक हैं। समान कोड जो कर्नेल हैंडल आवंटित करता है, का उपयोग प्रक्रिया और थ्रेड आईडी आवंटित करने के लिए भी किया जाता है। चूंकि कर्नेल हैंडल चार में से कई हैं, इसलिए प्रक्रिया और थ्रेड आईडी भी हैं। यह एक कार्यान्वयन विवरण है, इसलिए उस पर निर्भर होने वाले कोड को न लिखें। मैं सिर्फ आपको अपनी जिज्ञासा को संतुष्ट करने के लिए कह रहा हूं।

स्रोत प्रक्रिया और थ्रेड आईडी चार के गुणक क्यों हैं?


कर्नेल हैंडल्स हमेशा चार के कई क्यों होते हैं?

बहुत अच्छी तरह से ज्ञात नहीं है कि कर्नेल हैंडल्स के निचले दो टुकड़े हमेशा शून्य होते हैं; दूसरे शब्दों में, उनका संख्यात्मक मान हमेशा 4 से अधिक होता है। ध्यान दें कि यह केवल कर्नेल हैंड्स पर लागू होता है; यह छद्म हैंडल या किसी अन्य प्रकार के हैंडल (USER हैंडल, GDI हैंडल, मल्टीमीडिया हैंडल ...) पर लागू नहीं होता है। कर्नेल हैंडल वे चीजें हैं जो आप CloseHandle फ़ंक्शन को पास कर सकते हैं।

नीचे दो बिट्स की उपलब्धता को ntdef.h हेडर फाइल में दफन किया गया है:

//
// 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

कम से कम कर्नेल हैंडल्स का निचला हिस्सा हमेशा शून्य होता है जिसे GetQueuedCompletionStatus फ़ंक्शन द्वारा निहित किया जाता है, जो इंगित करता है कि आप पूर्ण पोर्ट अधिसूचना को दबाने के लिए इवेंट हैंडल के निचले बिट सेट कर सकते हैं। इसके लिए काम करने के लिए, नीचे का हिस्सा सामान्य रूप से शून्य होना चाहिए।

यह जानकारी अधिकांश अनुप्रयोग लेखकों के लिए उपयोगी नहीं है, जिन्हें हांडले को अपारदर्शी मान के रूप में जारी रखना चाहिए। जो लोग टैग बिट्स में रुचि रखते हैं, वे वे हैं जो निम्न-स्तरीय वर्ग पुस्तकालयों को लागू कर रहे हैं या कर्नेल ऑब्जेक्ट्स को बड़े ढांचे के अंदर लपेट रहे हैं।

स्रोत कर्नेल हैंडल्स हमेशा चार के कई क्यों होते हैं?


आगे की पढाई



3
एक उद्धरण कहता है, "आपको इस पर भरोसा नहीं करना चाहिए क्योंकि यह प्रोग्रामिंग अनुबंध का हिस्सा नहीं है," लेकिन फिर अगला दावा ntdef.h कहता है कि बिट्स "टैग कोड के रूप में एप्लिकेशन कोड द्वारा उपयोग के लिए उपलब्ध हैं ।" सार्वजनिक हेडर फ़ाइल में दस्तावेज़ीकरण "प्रोग्रामिंग अनुबंध" के करीब है जैसा कि आप प्राप्त कर सकते हैं, इसलिए पहला दावा गलत है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

2
@ ब्ल्यूराज, "बहुत अच्छी तरह से ज्ञात नहीं है कि कर्नेल हैंडल्स के निचले दो टुकड़े हमेशा शून्य होते हैं। दूसरे शब्दों में, उनका संख्यात्मक मान हमेशा 4 से अधिक होता है। " ntdef.h में कोड अन्य प्रकार के हैंडल पर भी लागू होता है। (USER हैंडल, GDI हैंडल, मल्टीमीडिया संभालती है ...)
DavidPostill

37
@BlueRaja: कर्नेल हैंडल चार में से कई हैं और यह संविदात्मक है, इसलिए आप इस पर भरोसा कर सकते हैं; प्रक्रिया आईडी (जो नहीं एक ही प्रक्रिया के रूप में संभालती है), बजाय, ऐसा चार के कई होना करने के लिए, लेकिन वह सिर्फ एक कार्यान्वयन विस्तार है, तो आप उस पर निर्भर नहीं होना चाहिए।
मैट्टो इटालिया

6
@BlueRaja मुझे लगता है कि रेमंड आपको बताएगा कि जिसने भी लिखा है वह दुनिया को कर्नेल के रंग के चश्मे के माध्यम से देखता है और इस प्रकार केवल कर्नेल हैंडल को संदर्भित करता है न कि अन्य प्रकार के हैंडल को।
कोडइन्चोस 19

1
@ मेहरदाद: ठीक है, USER और GDI हैंडल को आमतौर पर "कर्नेल" हैंडल नहीं कहा जाता है (हालाँकि वे तथाकथित कर्नेल मोड में चलने वाले घटकों द्वारा उत्पन्न होते हैं)।
मट्टियो इटालिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.