النوم (استدعاء النظام)
قد يدخل برنامج الحاسوب ( العملية ، أو المهمة ، أو الخيط ) في حالة سكون ، مما يجعله في حالة خمول لفترة زمنية محددة. وفي النهاية، يؤدي انتهاء مؤقت زمني ، أو تلقي إشارة أو مقاطعة، إلى استئناف البرنامج للتنفيذ.
الاستخدام
تأخذ استدعاءات نظام السكون النموذجية قيمة زمنية كمعامل، تحدد الحد الأدنى للوقت الذي يجب أن ينتظره البرنامج قبل استئناف التنفيذ. عادةً ما يُحدد المعامل بالثواني، على الرغم من أن بعض أنظمة التشغيل توفر دقة أعلى، مثل المللي ثانية أو الميكرو ثانية.
ويندوز
في نظام التشغيل ويندوز، Sleep()تأخذ الدالة مُعاملًا واحدًا هو عدد المللي ثواني اللازمة للانتظار. هذه Sleep()الدالة مُضمنة في ملف kernel32.dll . [ 1 ]
Sleep()لا تتجاوز دقة هذه الدالة دقة المؤقت الحالي، والتي تبلغ عادةً 16 مللي ثانية، ولكن بحد أدنى 1 مللي ثانية، ويمكن تعديلها عبر timeBeginPeriod()مجموعة واجهات برمجة تطبيقات "مؤقت الوسائط". وللحصول على دقة أعلى، من الضروري استخدام حلقة تكرار مشغولةQueryPerformanceCounter() ، مثل تلك المستخدمة في مكتبة gnulib . [ 2 ]
يونكس
في أنظمة التشغيل الشبيهة بنظام يونكس وغيرها من أنظمة POSIXsleep() ، تُستدعى الدالة مع توفير مُعامل واحد من نوع عدد صحيح غير مُوقّع يُحدد عدد الثواني اللازمة للانتظار. [ 3 ] يوجد إصدار ذو دقة أعلى من nanosleep()الدالة و الذي تم إيقاف استخدامه الآن usleep. [ 4 ] كما يسمح نظام POSIX باختيار مصادر الساعة عبر الإصدار المُوسّع clock_nanosleep(). [ 5 ]
تم اقتراح نسخة من ذلك clock_nanosleep()لتكون جزءًا من لغة البرمجة C ، ولكن تم رفضها. تمت إضافة جزء التوقيت العالمي المنسق (UTC) من نفس الاقتراح إلى C11 . [ 6 ]
أمثلة C
في واجهة برمجة تطبيقات ويندوز :
Sleep ( 2 * 1000 ); // انتظر لمدة ثانيتينفي استدعاءات النظام في أنظمة يونكس أو بوزيكس:
sleep ( 2 ); // انتظر لمدة ثانيتينوظائف المستوى الأدنى
يؤدي وضع السكون إلى تخلي الخيط أو العملية عن ما تبقى من وقتها المخصص، وبقائها في حالة "غير قابلة للتنفيذ" للمدة المحددة. ورغم وجود ضمان عام للحد الأدنى من هذه المدة، إلا أنه لا يوجد ضمان قاطع بأن الخيط سيعمل فورًا أو قريبًا، أو حتى على الإطلاق، بعد انقضاء الوقت المحدد. ويعتمد ذلك على تقدير المجدول، وعلى أولويات الخيوط وتفاصيل التنفيذ، مثل دقة المؤقتات، لتحديد موعد إعادة تشغيل الخيط النائم.
في أنظمة POSIX، يمكن مقاطعة وظيفة nanosleep وما يرتبط بها من استدعاءات النظام عبر الإشارات، حيث تُعيد وقت السكون المتبقي. أما وظيفة مكتبة sleep ، فتُنفذ عبر استدعاء النظام alarm في العديد من الأنظمة القديمة، وبالتالي فهي تعمل فقط عن طريق إرسال إشارة . وظيفة Sleep في نظام Windows غير قابلة للمقاطعة لعدم وجود إشارات (باستثناء إنهاء الخيط أو العملية التابعة له)، مع أن وظيفة SleepEx المرتبطة بها يمكن استخدامها لوضع الخيط في حالة تنبيه، مما يسمح بإجراء استدعاءات APC أثناء سكون الخيط. كما يمكن تقنيًا "مقاطعة" الخيط في حالة، على سبيل المثال، إنهاء العملية بسبب استثناء في خيط آخر.
الاستخدامات
تُنفّذ بعض برامج النظام التي لا تنتهي أبدًا حلقة أحداث ، حيث تدخل في حالة سكون في بداية كل دورة وتنتظر حدثًا ما لإيقاظها. بمجرد استلام حدث، يُعالج البرنامج هذا الحدث، ثم يعود إلى بداية دورة الانتظار التالية.
تقوم بعض البرامج الأخرى بالتحقق دوريًا من الأحداث عن طريق الدخول في وضع السكون ثم استئناف التنفيذ بعد فترة زمنية محددة. عند استئناف التنفيذ، يتحقق البرنامج من الأحداث أو تغييرات الحالة، ثم يعالج أي أحداث حدثت أثناء وضع السكون. بعد معالجة الأحداث، يدخل البرنامج في وضع السكون مرة أخرى للفترة الزمنية التالية. يمكن لهذه البرامج توليد أنواع معينة من إشارات نبضات القلب أو إشارات الإبقاء على الاتصال .
يمكن استدعاء الدالة sleep()بشكل متكرر لفترات قصيرة لإبطاء تنفيذ برنامج أو كود قيد التشغيل. يوفر تقييد الكود بهذه الطريقة آلية تقريبية للتخفيف من آثار ارتفاع درجة حرارة الأجهزة [ 7 ] أو تسهيل مشاكل التوقيت للبرامج القديمة. أما عيب التناوب بين حالتي السكون والتشغيل، بدلاً من استخدام محاكاة الدورة (عبر برنامج محاكاة) للتحكم في سرعة تنفيذ البرامج، فهو أن البرامج التفاعلية ستُظهر تقطعًا ملحوظًا إذا كان وقت التشغيل قصيرًا جدًا، أو وقت السكون طويلًا جدًا، أو كليهما معًا. [ 8 ]
نوم متواصل
حالة السكون غير القابلة للمقاطعة هي حالة سكون لا تستجيب للإشارات فورًا. تستيقظ فقط عند توفر مورد مُنتظر أو بعد انقضاء مهلة الانتظار (إذا تم تحديد ذلك عند وضع العملية في حالة السكون). تُستخدم هذه الحالة غالبًا من قِبل برامج تشغيل الأجهزة التي تنتظر عمليات الإدخال/الإخراج من القرص أو الشبكة. عندما تكون العملية في حالة سكون غير قابلة للمقاطعة، ستُلاحظ الإشارات المتراكمة خلال فترة السكون عند عودة العملية من استدعاء النظام أو عند حدوث اعتراض.
في الأنظمة الشبيهة بنظام يونكس ،ps -l يستخدم الأمر `D ...SIGKILL
انظر أيضاً
مراجع
- ↑ مرجع مكتبة MSDN - Sleep()
- ↑ "winapi - هل يوجد ما يعادل nanosleep في نظام ويندوز؟" . Stack Overflow .
- ↑ – دليل لينكس من موقع Manned.org
- ↑ – دليل لينكس من موقع Manned.org
- ↑ – دليل لينكس من موقع Manned.org
- ↑ كون، ماركوس. " واجهة برمجة تطبيقات مُحدثة لـ ISO C" . www.cl.cam.ac.uk.
- ↑ mion (2016-12-06). "BES – Battle Encoder Shirase 1.6.3 (مستقر) و1.7.4 لأنظمة ويندوز 7/إكس بي/2000" . mion.faireal.net . تم الاطلاع عليه بتاريخ 2017-02-09 .
- ^ مارليتا ، أنجيلو (12/03/2015). "كبوليميت" . جيثب . تم الاسترجاع 2017/02/09 .
- ↑ "الصفحة الأولى من دليل لينكس" . man7.org . 12-12-2016 . تم الاطلاع عليه بتاريخ 9-02-2017 .
- ↑ "العمليات في حالة النوم غير المنقطع (D)" . نوفيل . 21-02-2009 . تم الاسترجاع في 09-02-2017 .
- ↑ فوسكو، جون (2007-03-06). أدوات مبرمج لينكس . بيرسون للتعليم. ISBN 9780132703048.
- عملية (حوسبة)
- الخيوط (الحوسبة)
