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


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

उदाहरण के लिए, 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 के गुणक

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

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


158
2017-07-06 08:21


मूल


संभवतः दिलचस्प: लिनक्स के बारे में कुछ विवरण - justskins.com/forums/why-are-process-ids-204416.html - Dave
वास्तव में कोई नहीं है। अजीब है कि। - AndreKR


जवाब:


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

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


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

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

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

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

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


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

बहुत अच्छी तरह से ज्ञात नहीं है कि कर्नेल हैंडल के नीचे दो बिट्स हैं   हमेशा शून्य; दूसरे शब्दों में, उनका संख्यात्मक मान हमेशा एक बहु होता है   4. में से ध्यान दें कि यह केवल कर्नेल हैंडल पर लागू होता है; यह लागू नहीं होता है   छद्म हैंडल या किसी अन्य प्रकार के हैंडल (यूजर हैंडल, जीडीआई   हैंडल, मल्टीमीडिया हैंडल ...) कर्नेल हैंडल वे चीजें हैं जिन्हें आप पास कर सकते हैं   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 फ़ंक्शन द्वारा निहित, जो इंगित करता है   कि आप इवेंट हैंडल के नीचे बिट को दबाने के लिए सेट कर सकते हैं   पूरा पोर्ट अधिसूचना। इसके लिए काम करने के लिए, नीचे   थोड़ा सामान्य रूप से शून्य होना चाहिए।

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

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


आगे की पढाई



166
2017-07-06 09:13



एक उद्धरण कहता है "आपको इस पर भरोसा नहीं करना चाहिए क्योंकि यह प्रोग्रामिंग अनुबंध का हिस्सा नहीं है," लेकिन फिर अगले दावों ntdef.h कहते हैं कि बिट्स हैं "टैग बिट्स के रूप में एप्लिकेशन कोड द्वारा उपयोग के लिए उपलब्ध है।"  एक सार्वजनिक हेडर फ़ाइल में दस्तावेज़ीकरण लगभग के करीब है "प्रोग्रामिंग अनुबंध" जैसा कि आप प्राप्त कर सकते हैं, इसलिए पहला दावा गलत है। - BlueRaja - Danny Pflughoeft
@ ब्लूराजा, "बहुत अच्छी तरह से ज्ञात नहीं है कि नीचे दो बिट्स कर्नेल हैंडल हमेशा शून्य होते हैं; दूसरे शब्दों में, उनका संख्यात्मक मान हमेशा 4 का एक गुण होता है।"Ntdef.h में कोड अन्य प्रकार के हैंडल पर भी लागू होता है (यूजर हैंडल, जीडीआई हैंडल, मल्टीमीडिया हैंडल ...) - DavidPostill♦
@ ब्लूराजा: कर्नेल हैंडल चार में से कई हैं और यह संविदात्मक है, इसलिए आप इस पर भरोसा कर सकते हैं; प्रक्रिया आईडी (कौन से नहीं प्रक्रिया संभाल के समान ही), इसके बजाए, होना चार में से कई होने के लिए, लेकिन यह सिर्फ एक कार्यान्वयन विस्तार है, इसलिए आपको इस पर भरोसा नहीं करना चाहिए। - Matteo Italia
@ ब्लूराजा मुझे लगता है कि रेमंड आपको बताएंगे कि जो भी दस्तावेज लिखता है वह दुनिया को देखता है कर्नेल रंगीन चश्मा और इस प्रकार केवल कर्नेल हैंडल को संदर्भित किया जाता है और अन्य प्रकार के हैंडल नहीं। - CodesInChaos
@ मेहरदाद: ठीक है, यूजर और जीडीआई हैंडल को आम तौर पर "कर्नेल" हैंडल नहीं कहा जाता है (हालांकि वे तथाकथित कर्नेल मोड में चल रहे घटकों द्वारा उत्पन्न होते हैं)। - Matteo Italia