محاكاة مشفى
سنقوم في هذا البرنامج بمحاكاة تدفق المرضى عبر غرفة الإسعاف في مشفى. يمثل كل مريض بنيسب يمر بعدة مراحل (تسجيل الدخول، الفحص، المعالجة، إعادة الفحص، تسجيل الخروج). تحتاج كل مرحلة لعدة مصادر (أطباء، ممرضون، أسرّة، موظفون) عددها محدود كما سنرى لاحقاً. يجب على المريض الانتظار عند عدم توفر المصادر اللازمة لكل مرحلة.
البرنامج المرفق hospital.c هو هيكل للبرنامج المطلوب تطويره. لا تغير أسماء التوابع الموجودة فيه. عند تشغيل هذا الملف، سترى رسائل تعبر عن وصول مريض واحد لغرفة الإسعاف ومروره عبر المراحل الخمس ثم مغادرته.
القسم الأول
عدل البرنامج السابق بحيث ينشئ عدداً من النياسب (عشرة مثلاً) وإعطاء كل منها id مختلفة (أعداد متزايدة ابتداءاً من 1). يقوم كل نيسب بالمرور بالمراحل كلها بشكل مستقل. ستحصل في النهاية على رسائل تبين مرور كل المرضى بكل المراحل. عرّف ثابتاً عاماً لعدد النياسب لكي نتمكن من تغييره بسهولة.
القسم الثاني
لدينا 4 أنواع من المصادر: ممرضين، أطباء، موظفين، أسرة. نفترض أنه متاح لدينا 6 ممرضين، طبيبين، موظف واحد و 6 أسرة. أضف متحولات عامة تعبر عن هذه المصادر ومتحولات mutex اللازمة لحمايتها.
القسم الثالث
يبين الجدول التالي المراحل الخمس مع المصادر المطلوبة في كل مرحلة والزمن اللازم لتنفيذها:
المرحلة المصادر زمن التنفيذ (بالثانية)
تسجيل الدخول موظف 4
الفحص ممرض، سرير 6
المعالجة طبيب، سرير 10
إعادة الفحص ممرض، سرير 5
تسجيل الخروج موظف 2
عدّل البرنامج بحيث تفحص كل مرحلة من المحاكاة فيما إذا كانت المصادر المطلوبة لها متوفرة. إذا كانت متوفرة، تحجز المرحلة هذه المصادر وتحاكي زمن الانتظار المحدد لها (باستعمال تعليمة sleep). إذا لم تكن متوفرة، تنتظر في رتل (على mutex مخصص) لحين توفرها. حجز المصدر هو إنقاص للعدد متاح منه