انتظر (استدعاء النظام)

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

توفر أنظمة التشغيل الحديثة أيضًا استدعاءات النظام التي تسمح لخيط العملية بإنشاء خيوط أخرى والانتظار حتى تنتهي (" انضمام إليها") بطريقة مماثلة.

قد يوفر نظام التشغيل اختلافات في استدعاء الانتظار تسمح لعملية ما بالانتظار حتى تنتهي أي من عملياتها الفرعية ، أو الانتظار حتى تنتهي عملية فرعية محددة واحدة (يتم تحديدها بواسطة معرف العملية الخاص بها).

تقوم بعض أنظمة التشغيل بإصدار إشارة ( SIGCHLD ) إلى العملية الأصلية عند انتهاء العملية الفرعية، مما يُعلم العملية الأصلية ويسمح لها باسترداد حالة خروج العملية الفرعية.

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

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

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

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

إذا تلقت عملية فرعية إشارة، فستواصل العملية الأصلية المنتظرة تنفيذها، تاركةً العملية اليتيمة. لذا، من الضروري أحيانًا التحقق من الوسيطة المُحددة بواسطة wait أو waitpid أو waitid، وفي حال كانت قيمة WIFSIGNALED صحيحة، يجب انتظار العملية الفرعية مرة أخرى لتحرير الموارد.

انظر أيضاً

مراجع

  1. "استدعاء نظام الانتظار في لغة C" . GeeksforGeeks . 2017-06-03 . تم الاطلاع عليه بتاريخ 2023-05-15 .