العملية الأبوية

في مجال الحوسبة، العملية الأصلية هي عملية أنشأت عملية فرعية واحدة أو أكثر .

أنظمة شبيهة بنظام يونكس

في أنظمة التشغيل الشبيهة بنظام يونكس ، يتم إنشاء كل عملية باستثناء العملية 0 (المبدلة) عندما تنفذ عملية أخرى استدعاء النظام fork() . تُسمى العملية التي استدعت fork بالعملية الأصلية ، وتُسمى العملية المُنشأة حديثًا بالعملية الفرعية . لكل عملية (باستثناء العملية 0) عملية أصلية واحدة، ولكن يمكن أن يكون لها العديد من العمليات الفرعية. [ 1 ]

يُعرّف نظام التشغيل كل عملية بواسطة مُعرّفها. العملية 0 هي عملية خاصة تُنشأ عند بدء تشغيل النظام؛ بعد إنشاء عملية فرعية (العملية 1)، تُصبح العملية 0 عملية التبديل (المعروفة أحيانًا باسم " المهمة الخاملة "). العملية 1 ، المعروفة باسم init ، هي العملية الأصلية لكل عملية أخرى في النظام. [ 2 ]

لينكس

في نواة لينكس ، حيث يوجد فرق طفيف جدًا بين العمليات وخيوط POSIX ، يوجد نوعان من العمليات الأبوية: العملية الأبوية الحقيقية والعملية الأبوية. العملية الأبوية هي التي تستقبل إشارة SIGCHLD عند إنهاء العملية الابنة، بينما العملية الأبوية الحقيقية هي الخيط الذي أنشأ هذه العملية الابنة فعليًا في بيئة متعددة الخيوط. بالنسبة للعملية العادية، تكون هاتان القيمتان متطابقتين، ولكن بالنسبة لخيط POSIX الذي يعمل كعملية، قد تختلف هاتان القيمتان. [ 3 ]

عمليات الزومبي

يحتفظ نظام التشغيل بجدول يربط كل عملية، من خلال مُعرّفها (المعروف اختصارًا بـ " pid ")، بالبيانات اللازمة لعملها. خلال دورة حياة العملية، قد تتضمن هذه البيانات أجزاء الذاكرة المخصصة لها، والوسائط التي تم استدعاؤها بها، ومتغيرات البيئة ، وعدادات استخدام الموارد، ومعرّف المستخدم، ومعرّف المجموعة، ومجموعة المجموعات، وربما أنواعًا أخرى من المعلومات.

عندما تُنهي عملية ما تنفيذها، سواء عن طريق استدعاء exit (حتى لو كان ذلك ضمنيًا، عن طريق تنفيذ أمر العودة من الدالة الرئيسية ) أو عن طريق تلقي إشارة تتسبب في إنهائها بشكل مفاجئ، فإن نظام التشغيل يُحرر معظم الموارد والمعلومات المتعلقة بتلك العملية، ولكنه لا يزال يحتفظ بالبيانات المتعلقة باستخدام الموارد ورمز حالة الإنهاء ، لأن العملية الأصلية قد تكون مهتمة بمعرفة ما إذا كانت تلك العملية الفرعية قد نُفذت بنجاح (باستخدام وظائف قياسية لفك تشفير رمز حالة الإنهاء) ومقدار موارد النظام التي استهلكتها أثناء تنفيذها.

يفترض النظام افتراضيًا أن العملية الأصلية مهتمة بالفعل بهذه المعلومات عند انتهاء العملية الفرعية، وبالتالي يرسل إليها الإشارة SIGCHLD لتنبيهها بوجود بيانات مطلوب جمعها عن العملية الفرعية. يتم هذا الجمع باستدعاء دالة من عائلة دوال الانتظار (إما دالة الانتظار نفسها أو إحدى الدوال المشابهة لها، مثل waitpid أو waitid أو wait4 ). بمجرد اكتمال هذا الجمع، يُحرر النظام آخر المعلومات المتبقية عن العملية الفرعية ويزيل معرّفها (pid) من جدول العمليات. مع ذلك، إذا تأخرت العملية الأصلية في جمع بيانات العملية الفرعية (أو لم تجمعها إطلاقًا)، فلا يملك النظام خيارًا سوى الاحتفاظ بمعرّف العملية الفرعية وبيانات انتهائها في جدول العمليات إلى أجل غير مسمى.

تُسمى هذه العملية المُنتهية التي لم تُجمع بياناتها بعملية زومبي ، أو ببساطة زومبي ، في مصطلحات يونكس. ويُعدّ هذا الاسم تشبيهًا فكاهيًا، إذ تُعتبر العملية المُنتهية "غير حية" أو "ميتة" - لأنها توقفت عن العمل فعليًا - بينما تبقى العملية الميتة عالقة في "عالم العمليات الحية" - أي جدول العمليات - ولذلك فهي في الواقع "غير ميتة" أو "زومبي".

قد تشكل العمليات الزومبي مشاكل على الأنظمة ذات الموارد المحدودة أو التي تحتوي على جداول عمليات محدودة الحجم، حيث قد يتم منع إنشاء عمليات جديدة ونشطة بسبب نقص الموارد التي لا تزال تستخدمها العمليات الزومبي طويلة الأمد.

لذا، يُعدّ تضمين شيفرة برمجية لمنع تكوّن عمليات زومبي طويلة الأمد من العمليات الأصلية ممارسةً برمجيةً جيدةً في أي برنامج قد يُنشئ عمليات فرعية. وأبسط طريقة هي تضمين شيفرة تستدعي دالة الانتظار (wait) أو إحدى الدوال المشابهة لها بعد إنشاء عملية جديدة. إذا كان من المتوقع أن يُنشئ البرنامج العديد من العمليات الفرعية التي قد تُنفّذ بشكل غير متزامن وتنتهي بترتيب غير متوقع، فمن المستحسن عمومًا إنشاء معالج لإشارة SIGCHLD ، يستدعي إحدى دوال عائلة الانتظار (wait ) في حلقة تكرارية، حتى لا تبقى أي بيانات فرعية غير مُجمّعة. من الممكن أن تتجاهل العملية الأصلية تمامًا إنهاء عملياتها الفرعية دون أن تُنشئ عمليات زومبي، ولكن هذا يتطلب تعريفًا صريحًا لمعالج إشارة SIGCHLD من خلال استدعاء دالة sigaction مع خيار العلامة الخاص SA_NOCLDWAIT . [ 4 ]

العمليات اليتيمة

تُعدّ العمليات اليتيمة حالةً معاكسةً للعمليات الزومبي، إذ تشير إلى الحالة التي تنتهي فيها العملية الأصلية قبل انتهاء عملياتها الفرعية، والتي تُصبح "يتيمة". على عكس الإشعار غير المتزامن من العملية الفرعية إلى العملية الأصلية الذي يحدث عند انتهاء العملية الفرعية (عبر إشارة SIGCHLD )، لا يتم إخطار العمليات الفرعية فورًا عند انتهاء عمل العملية الأصلية. بدلًا من ذلك، يُعيد النظام تعريف حقل "PID الأصل" في بيانات العملية الفرعية ليكون هو العملية التي تُمثّل "سلف" جميع العمليات الأخرى في النظام، والتي يكون مُعرّفها عادةً 1 (واحد)، واسمها التقليدي "init" (باستثناء نواة لينكس 3.4 والإصدارات الأحدث [مزيد من المعلومات أدناه]). وبالتالي، يُقال إن init "تتبنى" كل عملية يتيمة في النظام. [ 5 ] [ 6 ]

كان من الشائع لدى المبرمجين الجدد على نظام يونكس افتراض أن العمليات الفرعية لعملية منتهية ستُدمج في العملية الأصلية المباشرة لهذه العملية (ومن هنا جاءت تسمية "الجد" لتلك العمليات الفرعية). لكن هذا الافتراض كان خاطئًا ، إلا إذا كان "الجد" هو عملية التهيئة نفسها. 

بعد إصدار نواة لينكس 3.4، لم يعد هذا صحيحًا، إذ يمكن للعمليات استدعاء دالة النظام prctl() مع الخيار PR_SET_CHILD_SUBREAPER، وبالتالي تصبح هي، وليس العملية رقم 1، العملية الأصلية لأي من العمليات التابعة لها. هذه هي آلية عمل مديري الخدمات الحديثة وأدوات مراقبة البرامج الخفية، بما في ذلك systemd وupstart ومدير الخدمات nosh.

هذا ملخص لصفحة الدليل، ويشير إلى ما يلي:

يؤدي الحاصد الفرعي دور التهيئة (1) لعملياته التابعة. عندما تصبح عملية ما يتيمة (أي عندما تنتهي عملية الأصل المباشر لها)، تُعاد هذه العملية إلى أقرب حاصد فرعي سلفي لا يزال يعمل. بعد ذلك، تُعيد استدعاءات الدالة getppid() في العملية اليتيمة مُعرّف العملية (PID) الخاص بالحاصد الفرعي، وعندما تنتهي العملية اليتيمة، يتلقى الحاصد الفرعي إشارة SIGCHLD ويستطيع الانتظار (2) لمعرفة حالة انتهاء العملية. [ 7 ]

مراجع

  1. تستند هذه المقالة إلى مواد مأخوذة من Parent+process في قاموس الحوسبة المجاني على الإنترنت قبل 1 نوفمبر 2008 وتم دمجها بموجب شروط "إعادة الترخيص" الخاصة بـ GFDL ، الإصدار 1.3 أو أحدث.
  2. تانينباوم، أندرو (2007). أنظمة التشغيل الحديثة (  الطبعة الثالثة). بيرسون برنتيس هول. ص  752. ISBN 978-0136006633.
  3. سرينيفاسان، سوندار (2010-09-01). "خيارات المهندس ومستقبله: لمحة سريعة عن نواة لينكس - الفصل 2: ​​إنشاء العمليات" . Sunnyeves.blogspot.com . تاريخ الاسترجاع: 2014-04-30 .
  4. "صفحة دليل wait - استدعاءات النظام" . www.mankier.com .
  5. "المبادرة تأتي أولاً" .
  6. "نظرة عامة على عمليات لينكس" . شركة آي بي إم. 26 مارس 2012.
  7. "دليل مبرمج لينكس" .