เหตุใดจึงไม่มีหมายเลขกระบวนการ Windows ที่แปลก
หากคุณรักการซ่อมด้วย Windows และเรียนรู้ไปด้วยคุณอาจสังเกตเห็นว่ากระบวนการของ Windows และรหัสเธรดเป็นเลขคู่และทวีคูณของสี่ ทำไมถึงเป็นอย่างนั้น? บทความถามตอบ SuperUser ในวันนี้มีคำตอบสำหรับคำถามของผู้อ่านที่อยากรู้อยากเห็น.
เซสชั่นคำถามและคำตอบในวันนี้มาถึงเราด้วยความอนุเคราะห์จาก SuperUser - แผนกย่อยของ Exchange Exchange ซึ่งเป็นกลุ่มที่ขับเคลื่อนด้วยชุมชนของเว็บไซต์ถาม - ตอบ.
คำถาม
Peter Hahndorf ผู้อ่าน SuperUser ต้องการทราบว่าทำไมไม่มีรหัสกระบวนการ Windows ที่มีเลขคี่:
มีหลายวิธีในการดู ID กระบวนการใน Windows ใช้ PowerShell:
ฉันได้รับผลลัพธ์นี้:
อย่างที่คุณเห็นรหัสกระบวนการทั้งหมดเป็นเลขคู่ไม่เพียงแค่นั้นพวกเขาทั้งหมดทวีคูณของสี่ คุณสามารถดูได้ยากเท่าที่คุณต้องการและคุณจะไม่พบรหัสกระบวนการที่เป็นเลขคี่อย่างน้อยที่สุดก็ไม่ใช่รุ่นใด ๆ ที่ใช้ Windows NT อะไรคือสาเหตุของสิ่งนี้?
เหตุใดจึงไม่มีรหัสกระบวนการ Windows ที่เป็นเลขคี่?
คำตอบ
ผู้สนับสนุน SuperUser DavidPostill มีคำตอบสำหรับเรา:
เหตุใดจึงไม่มีรหัสกระบวนการ Windows ที่เป็นเลขคี่?
รหัสเดียวกันที่จัดสรรการจัดการเคอร์เนลยังใช้ในการจัดสรรกระบวนการและรหัสเธรด เนื่องจากหมายเลขอ้างอิงเคอร์เนลเป็นหลายในสี่ดังนั้นกระบวนการและรหัสเธรด.
เหตุใด ID กระบวนการและเธรดทวีคูณของสี่?
บนระบบปฏิบัติการที่ใช้ Windows NT โพรเซสและเธรด ID จะเกิดขึ้นได้หลายแบบเสมอกัน นี่เป็นเรื่องบังเอิญ?
ใช่มันเป็นเรื่องบังเอิญและคุณไม่ควรเชื่อถือเพราะไม่ใช่ส่วนหนึ่งของสัญญาการเขียนโปรแกรม ตัวอย่างเช่นกระบวนการ Windows 95 และรหัสเธรดไม่ได้ทวีคูณเป็นสี่เท่าเสมอไป จากการเปรียบเทียบเหตุผลที่เคอร์เนลจัดการนั้นเป็นผลคูณของสี่นั้นเป็นส่วนหนึ่งของสเปคและจะรับประกันได้ในอนาคตอันใกล้.
ID กระบวนการและเธรดเป็นทวีคูณของสี่ซึ่งเป็นผลข้างเคียงของการใช้รหัสซ้ำ รหัสเดียวกันที่จัดสรรการจัดการเคอร์เนลยังใช้ในการจัดสรรกระบวนการและรหัสเธรด เนื่องจากหมายเลขอ้างอิงเคอร์เนลเป็นทวีคูณของสี่ดังนั้นเป็น ID กระบวนการและเธรด นี่เป็นรายละเอียดการใช้งานดังนั้นอย่าเขียนโค้ดที่ต้องใช้ ฉันแค่บอกให้คุณตอบสนองความอยากรู้ของคุณ.
ที่มา: เหตุใด ID กระบวนการและเธรดทวีคูณของสี่?
เหตุใดเคอร์เนลจึงจัดการกับผลคูณสี่เสมอ?
สิ่งที่ไม่เป็นที่รู้จักกันดีก็คือจุดจับเคอร์เนลสองบิตด้านล่างจะเป็นศูนย์เสมอ กล่าวอีกนัยหนึ่งค่าตัวเลขของพวกเขามักจะเป็นหลายเท่าของสี่ โปรดทราบว่าสิ่งนี้ใช้ได้เฉพาะกับตัวจัดการเคอร์เนลเท่านั้น มันใช้ไม่ได้กับการจับแบบหลอกหรือการจัดการชนิดอื่น ๆ (การจับ USER, การจัดการ GDI, การจัดการมัลติมีเดีย ฯลฯ ) หมายเลขอ้างอิงเคอร์เนลเป็นสิ่งที่คุณสามารถส่งผ่านไปยังฟังก์ชัน CloseHandle.
อย่างน้อยที่สุดบิตของเคอร์เนลที่จับเป็นศูนย์เสมอโดยนัยฟังก์ชัน GetQueuedCompletionStatus ซึ่งบ่งชี้ว่าคุณสามารถตั้งค่าบิตด้านล่างของตัวจัดการเหตุการณ์เพื่อระงับการแจ้งเตือนพอร์ตที่เสร็จสมบูรณ์ เพื่อให้สามารถใช้งานได้บิตด้านล่างจะต้องเป็นศูนย์.
ข้อมูลนี้ไม่เป็นประโยชน์สำหรับนักเขียนแอปพลิเคชันส่วนใหญ่ซึ่งควรดำเนินการต่อกับจุดจับเป็นค่าทึบ ผู้ที่สนใจแท็กบิตคือผู้ที่ใช้ไลบรารีระดับต่ำหรือห่อวัตถุเคอร์เนลภายในกรอบที่ใหญ่กว่า.
ที่มา: เหตุใดเคอร์เนลจึงจัดการกับผลคูณสี่เสมอ?
อ่านเพิ่มเติม
สิ่งใหม่เก่า: การพัฒนาอย่างมีประสิทธิภาพตลอดวิวัฒนาการของ Windows โดย Raymond Chen (วิศวกรออกแบบซอฟต์แวร์หลักที่ Microsoft)
มีสิ่งที่จะเพิ่มคำอธิบายหรือไม่ ปิดเสียงในความคิดเห็น ต้องการอ่านคำตอบเพิ่มเติมจากผู้ใช้ Stack Exchange คนอื่นหรือไม่ ลองอ่านหัวข้อสนทนาเต็มได้ที่นี่.