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

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

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

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

ประวัติ

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

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

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

แต่ละโปรเซสอาจสร้างโปรเซสลูกจำนวนมาก แต่จะมีโปรเซสพาเรนต์ไม่เกินหนึ่งโปรเซส ถ้ากระบวนการไม่มีพาเรนต์ มักจะแสดงว่าโปรเซสนั้นถูกสร้างขึ้นโดยตรงจากเคอร์เนล ในบางระบบ รวมถึง ระบบที่ใช้ Linuxกระบวนการแรกสุด (เรียกว่าinit ) จะเริ่มต้นโดยเคอร์เนล ณ เวลา บูตและไม่มีวันสิ้นสุด (ดูกระบวนการเริ่มต้น Linux ); กระบวนการ parentless อื่นๆ อาจถูกเรียกใช้เพื่อดำเนิน งาน daemonต่างๆใน​​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 เป็นรหัสกระบวนการของกระบวนการ)

อ้างอิง

  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