มีการสร้าง PID อย่างไร


42

บน * ระวัง, PID เป็นตัวระบุเฉพาะสำหรับกระบวนการที่กำลังทำงานอยู่ มีการสร้าง PID อย่างไร มันเป็นเพียงจำนวนเต็มที่เพิ่มขึ้นหรือโครงสร้างที่ซับซ้อนมากขึ้นเช่นรายการ? พวกเขาจะได้รับการรีไซเคิลได้อย่างไร? โดยการรีไซเคิลฉันหมายความว่าเมื่อกระบวนการยุติลง PID ก็จะถูกนำกลับมาใช้ในกระบวนการอื่นในที่สุด


คำตอบ:


39

ในฐานะที่เป็นวิกิพีเดียกล่าวว่า

ภายใต้ Unix ID กระบวนการจะถูกจัดสรรตามลำดับโดยเริ่มต้นที่ 0 และเพิ่มขึ้นเป็นค่าสูงสุดซึ่งแตกต่างกันไปตามระบบ เมื่อถึงขีด จำกัด นี้การจัดสรรจะเริ่มใหม่ที่ศูนย์และจะเพิ่มขึ้นอีกครั้ง อย่างไรก็ตามสำหรับสิ่งนี้และในภายหลังผ่าน PID ใด ๆ ที่ยังคงกำหนดให้กับกระบวนการจะถูกข้ามไป

ดังนั้นมันจึงเป็นนโยบายที่ง่ายมากสำหรับ "รุ่น" เพียงเพิ่มตัวนับและ "รีไซเคิล" เพียงแค่ใส่ตัวเลขในค่าสูงสุดและเพิ่มขึ้นเรื่อย ๆ จนกว่าคุณจะพบหมายเลขที่กำหนดให้กับกระบวนการที่เสร็จสิ้นแล้วและมี ถูกลบออกจากตารางกระบวนการ

การใช้ Unix บางตัวเช่น AIX ใช้นโยบายที่ง่ายกว่าดูที่คำถามที่พบบ่อยนี้


ขอบคุณสำหรับคำตอบ. ยังไงก็ตามนโยบาย AIX นี้ "ที่ง่ายกว่า" คืออะไร?

1
@Helltone ฉันไม่คิดว่าเอกสารของ AIX ใช้นโยบายใด (เพื่อให้สามารถเปลี่ยนแปลงได้ทุกรุ่น) แต่คุณสามารถคิดว่ามันเป็นการสร้างตัวเลขสุ่มในช่วงที่เหมาะสม (ซึ่งจะทำซ้ำจนกว่า PID จะถูกสร้างขึ้น ไม่ได้ใช้งานในปัจจุบัน)
Alex Martelli

อัลกอริทึมนี้ดูเหมือนเป็นปัญหาเล็กน้อยสำหรับฉัน คุณจะมั่นใจได้อย่างไรว่าคุณไม่ได้หยุดชะงัก และไม่มีปัญหาด้านประสิทธิภาพหรือไม่

1
เคอร์เนลอยู่ในการควบคุมและไม่จำเป็นต้องล็อคอะไรดังนั้นมันจะหยุดชะงักได้อย่างไร ใช่มีราคาประสิทธิภาพเล็กน้อยที่จะต้องจ่าย (ค่าใช้จ่ายเพิ่มเติมเล็กน้อยตามเวลาแยก - พูดคำแนะนำของเครื่องจักรสองโหลสำหรับ PRNG ที่สอดคล้องกันหรืออ่าน / dev / urandom อ่านน้อยกว่ามากสำหรับการตอบโต้) กรณีสำหรับมาตรการที่มีวัตถุประสงค์เพื่อปรับปรุงความปลอดภัย (ตรวจสอบค่าใช้จ่าย CPU ของการสื่อสาร HTTPS เทียบกับ HTTP ธรรมดาเช่น ;-)
Alex Martelli

ฉันหมายถึง livelock ( while(true);) ขอโทษฉันตอบอย่างรวดเร็ว ;-)

11

มันแตกต่างกันไป

ระบบส่วนใหญ่จะเก็บจำนวน PID ล่าสุดที่สร้างเพิ่มหนึ่งรายการ (ตัดที่จำนวนสูงสุดเช่น 65535 หรือเล็กกว่าเล็กน้อย - บ่อยครั้งที่การห่อเกิดขึ้นที่ 65000 หรือแม้แต่ 60000) และตรวจสอบว่าหมายเลขไม่ได้ใช้งานอยู่ในปัจจุบัน ( ทำซ้ำหาก PID ยังคงใช้งานอยู่ - ดังนั้น PID 1, เคอร์เนลยังคงอยู่ที่นั่นและไม่ได้รับ 'ออกใหม่')

ระบบที่คำนึงถึงความปลอดภัยอื่น ๆ จะสร้างตัวเลขโดยการสุ่มและตรวจสอบว่าไม่ได้ใช้งาน

ในเวลาใดก็ตามจะรับประกันได้ว่าหมายเลข PID ทั้งหมดจะไม่ซ้ำกัน


9

ในส่วนของการรีไซเคิลของคำถามสิ่งหนึ่งที่ต้องจำไว้คือ pid จะไม่สามารถใช้ได้ทันทีที่กระบวนการที่ pid นั้นสิ้นสุดลง pid ไม่พร้อมใช้งานจนกว่าพาเรนต์ของกระบวนการนั้นจะรวบรวมสถานะการเลิกจ้างของลูกของตนผ่านการเรียกของระบบ wait () บางรูปแบบ เด็กที่ถูกยกเลิก แต่ผู้ปกครองที่ไม่ได้รอจะเรียกว่าซอมบี้และมักจะปรากฏขึ้นใน ps เป็นหมดอายุ เป็นไปได้สำหรับผู้ปกครองที่ประพฤติตัวไม่ดีที่จะอดอาหารระบบถ้ามีการเปิดตัวเด็กและไม่รอ () สำหรับพวกเขา

หากพาเรนต์ของกระบวนการตายก่อนที่จะรวบรวมสถานะของเด็กนั่นก็โอเค เด็กได้รับการสืบทอดโดย init ซึ่งจะทำให้แน่ใจว่ามีการรอ () และ pid ถูกรีไซเคิลแล้ว


นี่เป็นรายละเอียดที่สำคัญมาก ถ้าไม่มีมันก็เป็นเรื่องง่ายmyprog &ตามมาด้วยwait $!UB
Andreas

3

พวกเขากำลังหมายเลขลำดับและล้อมรอบ (ที่ค่าเฉพาะระบบปฏิบัติการ) หากระบบขึ้นมานานพอ ตัวเลขจะไม่ถูกนำมาใช้ซ้ำเว้นแต่ว่าพวกเขาจะว่าง ณ จุดfork()นั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.