سؤال

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

while (state == BUSY) state = check_state();

ويبدو مثل مضيعة للموارد. أعتقد أن أفضل طريقة للقيام بذلك سيكون:

while (state == BUSY) {
    sched_yield();
    state = check_state();
}

وأتوقع أن أن رأس قائمة هذه العملية حيث النوم، حتى إذا لم تستهلك 100٪ من وحدة المعالجة المركزية في حين انها تفعل ذلك. بهذه الطريقة، وعملية أن (آمل) استطلاع "لطيف". ولكن هذا ليس ما يحدث. في هذه اللحظة لدي

while (state == BUSY) {
    sleep(1);
    state = check_state();
}

والذي هو مقبول تماما، لكنني أشعر بأن ذلك يمكن القيام به أفضل من هذا. هل هناك من الممارسات المعتادة لفعل هذا؟

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

المحلول

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

والجواب الصحيح يعتمد على ما check_state () يحتاج فعلا للقيام به. هل أنت متأكد تماما أنك لا يمكن ترتيب الأمور بحيث التغييرات دولتكم هي أحداث نواة واضحة على أن تتمكن من منع على؟

نصائح أخرى

وأنا لا افترض هذا هو شيء يمكنك استخدام <لأ href = "http://www.kernel.org/doc/man-pages/online/pages/man2/poll.2.html" يختلط = " noreferrer نوفولو "> استطلاع أو epoll على؟

ولسوء الحظ، ليس هناك شيء مثل الاقتراع الضميري. الاقتراع هو دائما مفاضلة بين وقت رد الفعل واستهلاك الموارد: أقصر فترة الاقتراع، وأفضل وقت رد الفعل ولكن كلما زاد استهلاك الموارد. وتعد فترة الاقتراع، والمزيد من الطاقة تقوم بحفظ ولكن أقل نشاطا يصبح التطبيق الخاص بك.

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

وأعتقد أنك يمكن أن تستخدم libevent أو <وأ href = "HTTP: / /software.schmorp.de/pkg/libev.html "يختلط =" noreferrer نوفولو "> libev .

وكلاهما يوفر مرافق للتعامل مع مثل هذه الامور.

في عملي الحقيقي، وأنا عادة اختيار مهلة معقولة (مثل 10US)، وتدور على حالة وRDTSC (الوقت ختم العداد).

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

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