سؤال

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

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

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

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

المحلول

شريطة أن يكون نظام التشغيل لديه تطبيقات معقولة لهذه النوع من البدائيات التزامن، من الأفضل بالتأكيد الانتظار على كائن نواة.

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

سئلت على وجه التحديد عن تقليل وقت المعالج لخيط: في هذا المثال، فإن حظر مؤشر الترابط على كائن kernel سيستخدم الوقت الصفر؛ سوف يستخدم موضوع الاقتراع كل أنواع الوقت.

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

نصائح أخرى

الانتظار هو طريقة "النمل" للتصرف. عند الانتظار على كائن Kernel لن يتم منح موضوع الخيط الخاص بك أي وقت لوحدة المعالجة المركزية كما هو معروف به المجدول الذي لا يوجد عمل جاهز. يقع مؤشر الترابط الخاص بك فقط وقت وحدة المعالجة المركزية عندما تكون حالة الانتظار راضية. مما يعني أنك لن تكون صياغة موارد وحدة المعالجة المركزية دون داع.

أعتقد أن النقطة التي لم يتم رفعها حتى الآن هي أنه إذا كان لديك نظام التشغيل الخاص بك لديه الكثير من العمل للقيام به، فقم بحظر YEILDS مؤشر ترابطك إلى عملية أخرى. إذا كانت جميع العمليات تستخدم بدائريات الحظر حيث يجب عليهم (مثل Kernel Worits، File / Network IO وما إلى ذلك) أنت تعطي معلومات Kernel مزيدا من المعلومات لاختيار المواضيع التي يجب تشغيلها. على هذا النحو، سوف تفعل المزيد من العمل في نفس الوقت من الوقت. إذا كان التطبيق الخاص بك يمكن أن يفعل شيئا مفيدا أثناء انتظار هذا الملف لفتح أو الحزمة للوصول، فسوف تساعد YEILDING حتى التطبيق الخاص بك.

الانتظار ينطوي على المزيد من الموارد ويعني تبديل سياق إضافي. في الواقع، تستخدم بعض عمليات التزامن، مثل مراقبات CLR و Win32 الأقسام الحرجة، استخدم بروتوكول قفل مرحلتين - يتم إجراء بعض الانتظار في الانتظار في الواقع في الانتظار الحقيقي.

أتصور القيام بأي شيء من المرحلة الثانية سيكون صعبا للغاية، وسيشمل الكثير من الاختبارات والبحث. لذلك، ما لم يكن لديك الوقت والموارد، والتمسك بدائريات النوافذ ... لقد قاموا بالفعل بالبحث بالنسبة لك.

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

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

ينتظر (حظر) دائما أفضل خيار ("أفضل" ("أفضل" بمعنى جعل الاستخدام الفعال لمصادر المعالجة وتقليل التأثير إلى رمز آخر يعمل على نفس النظام). الاستثناءات الرئيسية هي:

  1. عندما تكون مدة الاقتراع المتوقعة صغيرة (مماثلة في الحجم لتكلفة سيسكول الحظر).
  2. في الغالب في الأنظمة المضمنة، عندما تكون وحدة المعالجة المركزية مخصصة لأداء مهمة محددة وليس هناك فائدة لاستخدام وحدة المعالجة المركزية الخمول (مثل بعض أجهزة توجيه البرامج التي تم بناؤها في التسعينيات في وقت متأخر يستخدم هذا النهج.)

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

هناك أربعة أساليب أساسية يمكن للمرء اتباعها:

  1. استخدم بعض أنظمة التشغيل المنتظرة البدائية للانتظار حتى وقوع الحدث
  2. استخدم بعض مؤقتات نظام التشغيل الأولية للتحقق بمعدل محدد ما إذا كان الحدث قد وقع بعد
  3. تحقق بشكل متكرر مما إذا كان الحدث قد وقع، ولكن استخدم نظام التشغيل البدائي للحصول على شريحة زمنية لمدة عشوائية وغير معروفة في أي وقت لم يحدث فيه ذلك.
  4. تحقق بشكل متكرر مما إذا كان الحدث قد وقع أم لا، دون الخضوع لوحدة المعالجة المركزية إذا لم يحدث ذلك.

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

النهج رقم 3 بسيط إلى حد ما، ولكنه قد يكون جيدًا في كثير من الحالات.غالبًا ما يؤدي ذلك إلى إهدار المزيد من وقت وحدة المعالجة المركزية ومواردها مقارنة بالرقم 1، ولكنه سيكون في كثير من الحالات أسهل في التنفيذ وسيكون إهدار الموارد في كثير من الحالات صغيرًا بما يكفي بحيث لا يهم.

غالبًا ما يكون النهج رقم 2 أكثر تعقيدًا من النهج رقم 3، ولكنه يتمتع بميزة القدرة على التعامل مع العديد من الموارد باستخدام مؤقت واحد وبدون سلسلة رسائل مخصصة.

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

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