กระบวนการลูก

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

กระบวนการเด็กในการใช้คอมพิวเตอร์เป็นกระบวนการที่สร้างขึ้นโดยกระบวนการอื่น (คนการปกครอง ) เทคนิคนี้จะเกี่ยวข้องกับการทำงานหลายระบบปฏิบัติการและบางครั้งจะเรียกว่าเป็นกระบวนการย่อยหรือประเพณีงานย่อย

มีสองขั้นตอนหลักในการสร้างกระบวนการลูก: การเรียกระบบส้อม (แนะนำในระบบที่คล้าย UnixและมาตรฐานPOSIX ) และการวางไข่ (แนะนำในเคอร์เนลที่ทันสมัย ​​(NT)ของMicrosoft Windowsเช่นเดียวกับในการดำเนินงานในอดีตบางอย่าง ระบบ)

ประวัติ

การประมวลผลย่อยมีมาจนถึงช่วงปลายทศวรรษ 1960 โดยมีรูปแบบแรกเริ่มในการแก้ไขในภายหลังของMultiprogramming ที่มีรูปแบบงานจำนวนคงที่เวอร์ชัน II (MFT-II) ของระบบปฏิบัติการ IBM OS/360ซึ่งแนะนำการทำงานย่อย (ดูงาน ) . รูปแบบปัจจุบันใน Unix ใช้Multics (1969) ในขณะที่รูปแบบ Windows NT ใช้VAX/VMSจากRSX-11 (1972)

เด็ก ๆ ที่สร้างโดยส้อม

โปรเซสลูกรับช่วงแอ็ตทริบิวต์ส่วนใหญ่ เช่นfile descriptorsจากพาเรนต์ ในUnixกระบวนการลูกมักจะสร้างเป็นสำเนาของพาเรนต์ โดยใช้การเรียกระบบแยกกระบวนการลูกสามารถซ้อนทับตัวเองด้วยโปรแกรมอื่น (โดยใช้exec ) ตามต้องการ

แต่ละโปรเซสอาจสร้างโปรเซสลูกจำนวนมาก แต่จะมีโปรเซสพาเรนต์ไม่เกินหนึ่งโปรเซส ถ้ากระบวนการไม่ได้มีผู้ปกครองมักจะแสดงให้เห็นว่ามันถูกสร้างขึ้นโดยตรงจากเคอร์เนล ในบางระบบ รวมถึงระบบที่ใช้Linuxกระบวนการแรกสุด (เรียกว่าinit ) จะเริ่มต้นโดยเคอร์เนล ณเวลาบูตและไม่มีวันสิ้นสุด (ดูกระบวนการเริ่มต้น Linux ); กระบวนการอนาถาอื่น ๆ อาจจะเปิดตัวในการดำเนินการต่างๆภูตงานในuserspace อีกวิธีหนึ่งที่กระบวนการจะจบลงโดยไม่มีพาเรนต์คือถ้าพาเรนต์ของกระบวนการนั้นตาย ปล่อยให้กระบวนการเป็นเด็กกำพร้า แต่ในกรณีนี้ อีกไม่นานinit .จะถูกนำไปใช้.

สัญญาณ SIGCHLD จะถูกส่งไปยังพาเรนต์ของโปรเซสลูกเมื่อออกถูกขัดจังหวะ หรือกลับมาทำงานต่อหลังจากถูกขัดจังหวะ โดยค่าเริ่มต้น สัญญาณจะถูกละเว้น [1]

ลูกที่เกิดจากการวางไข่

บั้นปลายชีวิต

เมื่อกระบวนการลูกยุติลง ข้อมูลบางส่วนจะถูกส่งกลับไปยังกระบวนการหลัก

เมื่อโปรเซสลูกยุติลงก่อนที่พาเรนต์จะเรียกwaitเคอร์เนลจะเก็บข้อมูลบางอย่างเกี่ยวกับกระบวนการ เช่นสถานะการออกเพื่อให้พาเรนต์เรียกwait ได้ในภายหลัง[2] เพราะเด็กจะยังคงบริโภคทรัพยากรของระบบการดำเนินการ แต่ไม่เป็นที่รู้จักกันเป็นกระบวนการผีดิบโดยทั่วไปการเรียกระบบรอจะเรียกในตัวจัดการ SIGCHLD

POSIX.1-2001อนุญาตให้โปรเซสพาเรนต์เลือกเคอร์เนลเพื่อเก็บเกี่ยวโปรเซสลูกโดยอัตโนมัติที่ยุติโดยการตั้งค่าการจัดการของ SIGCHLD เป็น SIG_IGN อย่างชัดเจน (แม้ว่าการละเว้นจะเป็นค่าเริ่มต้น การเก็บเกี่ยวอัตโนมัติจะเกิดขึ้นก็ต่อเมื่อการจัดการถูกตั้งค่าให้ละเว้นอย่างชัดแจ้ง[ 3] ) หรือโดยการตั้งค่าแฟล็ก SA_NOCLDWAIT สำหรับสัญญาณ SIGCHLD เคอร์เนล Linux 2.6 เป็นไปตามลักษณะการทำงานนี้ และ FreeBSD รองรับทั้งสองวิธีตั้งแต่เวอร์ชัน 5.0 [4] อย่างไรก็ตาม เนื่องจากความแตกต่างทางประวัติศาสตร์ระหว่างพฤติกรรมของระบบ VและBSDเกี่ยวกับการละเว้น SIGCHLD การรอการโทรยังคงเป็นกระบวนทัศน์แบบพกพาที่สุดสำหรับการล้างข้อมูลหลังจากกระบวนการย่อยที่แยกจากกัน[5]

ดูเพิ่มเติม

  • ทางออก
  • pstreeเพื่อให้ UNIX ค้นหากระบวนการลูก ( pstree PIDโดยที่ PID เป็นรหัสกระบวนการของกระบวนการ)

หมายเหตุ

บทความนี้อิงจากเนื้อหาที่นำมาจากFree Online Dictionary of Computing ก่อนวันที่ 1 พฤศจิกายน 2008 และรวมอยู่ภายใต้เงื่อนไข "การอนุญาตใหม่" ของGFDLเวอร์ชัน 1.3 หรือใหม่กว่า

อ้างอิง

  1. ^ signal.h  - การอ้างอิงคำจำกัดความพื้นฐาน,ข้อมูลจำเพาะ UNIX เดี่ยว , ฉบับที่ 7 จาก The Open Group
  2. ^ wait(2) : รอกระบวนการเปลี่ยนสถานะ –  Linux Programmer's Manual – System Calls
  3. ^ "ลินุกซ์เคอร์เนล: สัญญาณ" . Win.tue.nl . สืบค้นเมื่อ2014-04-30 .
  4. ^ [1] เก็บถาวร 29 กันยายน 2011 ที่ Wayback Machine
  5. ^ sigaction(2) : ตรวจสอบและเปลี่ยนการทำงานของสัญญาณ –  Linux Programmer's Manual – System Calls

ลิงค์ภายนอก

  • pstree(1): พิมพ์แผนผังกระบวนการ –  Linux User Commands Manual