سؤال

أنا بعض الأسئلة حول عمليات الزومبي

  • ما هي الفوائد من مفهوم عملية الزومبي؟
  • اعلم أن kernel تحتفظ (PID ، حالة الإنهاء ، معلومات استخدام الموارد) لعملية الزومبي
    ما معنى "معلومات استخدام الموارد"
  • كيف Zombie's PPID () = 1 وما زالت Zombie ، (init يجني الزومبي لأنها تنتظر () افتراضيًا)
    يمكن لأي شخص أن يكتب بعض رمز C. لجعل الزومبي هو الوالد هو init؟
  • يمكن أن يرفض الزومبي إطلاق بعض القفل على الذاكرة ؟؟

شكرا مقدما

هل كانت مفيدة؟

المحلول

- ما هي الفوائد من مفهوم عملية الزومبي؟

عملية Zombie هي مجرد pid ، حالة خروج ، وبعض المعلومات المحاسبية التي تظل حولها حتى يستخدم أحد الوالدين أحد wait عائلة النظام يدعو للحصول على وضعها النهائي. حتى يتصل أحد الوالدين wait يجب أن يبقى معرف عملية الطفل ملحوظًا كما هو مستخدم بحيث لا يمكن تعيين أي عملية أخرى. إذا تم تعيين عملية أخرى ، فسيكون من الصعب تحديد الفرق بينه وبين العمليات السابقة التي كان لها نفس PID. ذات مرة wait يُطلق عليه الوالد ويعيد حالة الخروج النهائية ، يمكن افتراض أنه لن يبحث أحد عن الطفل في هذا PID مرة أخرى ، لذلك يمكن الآن إعادة استخدام PID. (أعتقد على Linux إذا ترك أحد الوالدين sigchld مثل sig_ign ، فلن يحتفظ kernel بالزومبي ، ولكن إعادة تسجيل تصرف sigchld لأن sig_ign لا يكون له نفس التأثير)

- اعلم أن kernel تحتفظ (PID ، حالة الإنهاء ، معلومات استخدام الموارد) لعملية Zombie ما معنى "معلومات استخدام الموارد"

بعض هذه المعلومات هي ما يدير برنامجًا على النحو التالي:

time my_program

سوف يقدم تقريرا. عادة wait) ولكن متاح أيضًا من مكالمة إلى waitid شكل Systme Call (على بعض الأنظمة). ينظر الى man sigaction للحصول على معلومات حول هذا الهيكل.

- كيف Zombie's PPID () = 1 وما زالت زومبي ، (init يجني الزومبي لأنها تنتظر () افتراضيًا)

Zombie الذي يجب ألا يبقى PPID = 1 غيبوبة لفترة طويلة لأن فيه يجب أن يجنيها بسرعة كبيرة. ستبقى العملية غيبوبة من نقطة بعد وقت قصير من وفاتها (إما عبر exit أو عن طريق إشارة غير مهذرة تقتلها) حتى يدعو والدها wait ويحصل على الوضع النهائي. هذا يعني أنه حتى لو لم يفعل eart شيئًا سوى الاتصال بـ init مرارًا وتكرارًا ، فقد يكون هناك قدر صغير من الوقت الذي قد تظهر فيه العملية كزومبي. إذا ظهرت العمليات كأطفال فيه (0 = PPID) لفترة طويلة من الوقت (ثواني) ، ربما يكون هناك خطأ ما.

- هل يمكن لأي شخص أن يكتب بعض رمز C لجعل Zombie هو الوالد هو init؟

هذا غير واضح ، لكنني أعتقد أنك تريد:

pid_t f = fork();
if (f > 0) {
    exit(0); // this is the parent dying, so the child will be an orphan
             // and get adopted by init
} else if (f == 0) {
    sleep(100); // This is the child doing something that takes enough time for
                // its parent to commit suicide (exit(0)) and then for you to
                // observe that it has now been adopted by init
    exit(0);    // And now it dyes as well, so init should reap its status, but
                // it may be a zombie for a short amount of time first.
} else /* error condition would be handled here */

- يمكن أن يرفض الزومبي إطلاق بعض القفل على الذاكرة ؟؟

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

نصائح أخرى

عملية Zombie هي بحتة قيمة حالة PID والخروج. لا يمكن إصدار PID لأن المورد (PID) "ينتمي إلى" الوالد. إذا تم إصدارها ، فقد يتم تعيين عملية أخرى نفس PID ، ثم قد ينتهي الوالد بإرسال إشارات إلى عملية غير ذات صلة ؛ حتى لو انتظر الوالد لأول مرة لتحديد ما إذا كان الطفل قد خرج ، فلن تكون هناك طريقة لتجنب ظروف السباق.

إذا كنت مهتمًا برؤية عملية الزومبي ضمن قائمة عمليات التشغيل ، فاستخدم هذا:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    pid_t p = fork();   // creates child process and stores the returned PID

    if (p != 0)         // executed by parent process
    {   sleep(1);       /* the child process terminates while the parent process sleeps,
                           the child then becomes a zombie process because the returned status
                           of the terminated child process isn't checked via a wait() */

        system("ps -eo pid,ppid,stat,cmd");  // prints a list of processes in your terminal

    }
    else        // executed by child process
    {
        exit(0);        // the child process terminates immediately
    }

    return 0;
}

يمكنك تحديد عملية الزومبي بواسطة Z+ في القائمة:

screenshot of the zombie process

ملاحظة: سيتعين عليك تعديل الكود إذا كنت تستخدم Windows.

عمليات Zombie هي عمليات توقفت عن تشغيلها ولكن إدخال جدول العملية الخاص بهم لا يزال موجودًا لأن عملية الوالدين لم تسترجعها عبر Syscall. من الناحية الفنية ، فإن كل عملية تنهيها هي غيبوبة لفترة قصيرة جدًا من الوقت ولكنها يمكن أن تعيش لفترة أطول.

تحدث عمليات الزومبي الطويلة التي تعيش عندما لا تتصل عمليات الوالدين بـ Syscall بعد انتهاء عملية الطفل. أحد المواقف التي يحدث فيها هذا هو عندما تكون عملية الوالدين مكتوبة بشكل سيء وتغفل ببساطة مكالمة الانتظار أو عندما تموت عملية الوالدين قبل أن لا تتصل عملية الوالد الجديدة بالانتظار. عندما يموت أحد الوالدين قبل الطفل ، يقوم نظام التشغيل بتعيين عملية الطفل لعملية "init" أو PID 1. أي أن عملية البدء "تعتمد" عملية الطفل وتصبح والدها. هذا يعني أنه الآن عندما تخرج عملية الطفل ، يجب على الوالد الجديد (init) استدعاء Wait to الحصول على رمز الخروج الخاص به أو يظل إدخال جدول العملية الخاص به إلى الأبد ويصبح غيبوبة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top