โฮมเพจ » ทำอย่างไร » เหตุใดจึงไม่มีหมายเลขกระบวนการ Windows ที่แปลก

    เหตุใดจึงไม่มีหมายเลขกระบวนการ 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 คนอื่นหรือไม่ ลองอ่านหัวข้อสนทนาเต็มได้ที่นี่.