سؤال

أنا أعمل من خلال بعض التمارين في لغة البرمجة C++ من قبل Bjarne Stroustrup.أنا في حيرة من مشكلة 11 في نهاية الفصل 12:

(*5) تصميم وتنفيذ مكتبة كتابة الحدث يحركها المحاكاة.تلميح:<task.h>....كائن من الفئة المهمة يجب أن تكون قادرة على انقاذ الدولة من أجل استعادة الدولة بحيث أنها يمكن أن تعمل بوصفها coroutine.مهام محددة يمكن تعريفها بأنها كائنات من الفئات المشتقة من المهمة.البرنامج يتم تنفيذه من خلال فريق عمل قد يكون تعريف دالة ظاهري....يجب أن يكون هناك جدولة تنفيذ مفهوم الظاهري الوقت....المهام التي سوف تحتاج إلى الاتصال.تصميم فئة انتظار ذلك....

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

تحرير: يرجى الاطلاع على موقعي أدناه مع المزيد من المعلومات.

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

المحلول

تلميح:<task.h>.

هو إشارة إلى قديم التعاونية متعددة المهام المكتبة التي يتم شحنها مع الإصدارات في وقت مبكر من CFront (يمكنك أيضا تحميل على هذه الصفحة).

إذا كنت تقرأ الورق "مجموعة من C++ فصول Co-روتين أسلوب البرمجة"الأمور سوف تجعل الكثير من معانيها.


إضافة قليلا:

أنا لست من العمر ما يكفي مبرمج استخدمت مهمة المكتبة.ومع ذلك أعرف أن C++ تم تصميمه بعد Stroustrup كتب المحاكاة في سيمولا أن العديد من نفس خصائص مهمة المكتبة ، لذلك كنت دائما غريبة عن ذلك.

إذا كنت لتنفيذ التمرين من الكتاب ، ربما أود أن تفعل ذلك من هذا القبيل (يرجى ملاحظة أنه لم يتم اختبار هذا الرمز أو حتى حاول تجميع):

class Scheduler {
    std::list<*ITask> tasks;
  public:
    void run()
    {
        while (1) // or at least until some message is sent to stop running
            for (std::list<*ITask>::iterator itor = tasks.begin()
                      , std::list<*ITask>::iterator end = tasks.end()
                    ; itor != end
                    ; ++itor)
                (*itor)->run(); // yes, two dereferences
    }

    void add_task(ITask* task)
    {
        tasks.push_back(task);
    }
};

struct ITask {
    virtual ~ITask() { }
    virtual void run() = 0;
};

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

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

هذا التنفيذ لا (1) اتبع جدولة عادلة (ربما حفظ ما مجموعه تشغيل على مدار الساعة القراد قضى في مهمة تشغيل (طريقة) ، و تخطي المهام التي استخدمت الكثير من الوقت بالنسبة إلى الآخرين حتى المهام الأخرى "اللحاق"), (2) تسمح المهام التي يتعين إزالتها ، أو حتى (3) تتيح جدولة إلى أن توقفت.

أما بالنسبة للتواصل بين المهام ، قد ترغب في النظر في الخطة 9 libtask أو روب بايك newsqueak عن الإلهام (في "UNIX تنفيذ Newsqueak" تحميل تتضمن ورقة "تنفيذ Newsqueak" الذي يناقش الرسالة التي تمر مثيرة للاهتمام الجهاز الظاهري).

ولكن أعتقد أن هذا هو الأساسية العظمي Stroustrup في الاعتبار.

نصائح أخرى

هنا هو بلدي فهم من "الحدث يحركها محاكاة":

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

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

تحرير:من المهم أن تعرف الفرق بين النمذجة والمحاكاة.النموذج هو تمثيل رياضي نظام أو عملية.محاكاة بنيت من واحد أو أكثر من النماذج التي يتم تنفيذها على مدى فترة من الزمن.مرة أخرى حدث مدفوعة محاكاة القفزات من الحدث إلى الحدث ، في حين أن الوقت مدفوعة محاكاة العائدات في وقت ثابت الخطوة.

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

ويستند الهيكل المعمم لمحاكاة الحدث منفصلة في طابور الأولوية مرتبطا على قيمة الوقت. على مستوى واسع وغني عن مثل:

    While (not end condition):
        Pop next event (one with the lowest time) from the priority queue
        Process that event, which may generate more events
        If a new event is generated:
            Place this on the priority queue keyed at its generated time
تتغير

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

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

(أنا لست C++ dev)

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

إذا كنت بحاجة إلى مساعدة في المنفصلة محاكاة الجانب ، والمضي قدما في تحرير المسألة.

وهذا هو ردا على تعليق titaniumdecoy على الجواب SottieT812 ل. في كثير كبير جدا بالنسبة تعليق، لذلك قررت أن تجعل من إجابة أخرى.

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

وهذا هو على النقيض من وقت مدفوعة المحاكاة، حيث يتم احتساب الموضع الدقيق للصاروخ (وكل شيء آخر في المحاكاة) بعد كل خطوة الوقت، ويقول 1 ثانية.

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

وتحرير: إذا كان أي شخص مهتم بمعرفة المزيد، وتحقق من ورقات من مؤتمر محاكاة الشتاء

في ورقة مرتبطة من قبل "me.yahoo.com/..." الذي يصف المهمة.h الدرجة:

  1. المهام تنفذ بالتوازي مع
  2. قد تكون مهمة تعليق المستأنفة في وقت لاحق

المكتبة يوصف أسلوب متعدد البرمجة.

هل من الممكن أن تفعل هذا دون استخدام مؤشرات الترابط أو منفصلة العمليات ؟

scroll top