28/6/2013 - البرمجة المُتعددة (Multiprogramming) و المشاركة الزمنية (Time-Sharing) في نُظم التشغيل




عند دراسة مفاهيم نُظم التشغيل، أو حتى القراءة عن تاريخ الحواسيب و نُظم التشغيل القديمة، سيصطدم القارئ بمصطلحين وهما "البرمجة المُتعددة" (Multiprogramming) و "المشاركة الزمنية" (Time-Sharing)، هذان المُصطلحات مُرتبطان مباشرة بمفهوم تعدد المهام (Multi-Tasking) وبالتالي حتى تتمكن من فهم الفرق بينهما لابد من فهم ماهية تعدد المهام أولاً، قمت مسبقاً بالتحدث عن تعدد المهام في تدوينة بعنوان "ما هو تعدد المهام (Multi-tasking) في نُظم التشغيل؟" أنصحك بقراءتها قبل إكمال هذه التدوينة.

كما علمنا مُسبقاً فإنّ ميزة تعدد المهام في نُظم التشغيل تجعل من نظام التشغيل قادراً على توزيع وقت المُعالج بين العمليات و بالتالي كُل عملية تأخذ وقتها من المعالج ويُوهَم المُستخدم على إنّ هذه العمليات تعمل معاً بشكل متوازي. (كما أوضحنا في التدوينة السابقة إنّ العملية Process عبارة عن برنامج مُشغَّل تحت التنفيذ).

على كُل حال، كُل من البرمجة المُتعددة و المشاركة الزمنية تُعتبر من أشكال "تعدد المهام"، فالهدف منها بالنهاية إستغلال وقت المُعالج بقدر الإمكان، في الماضي وقبل ظهور المُشاركة الزمنية (Time-Sharing) و التي سنتحدث عنها بعد قليل كان هناك شَكل آخر من تعدد المهام يختلف عن ما هو موجود حالياً، و كان يُطلق عليه إسم البرمجة المُتعددة (Multiprogramming).

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

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

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

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

كما أسلفت، فإنّ هذا الإسلوب من "تعدد المهام" قديم و الأسلوب الأكثر تطوراً هو "المشاركة الزمنية".

المُشاركة الزمنية (Time-Sharing)
في الأيام الحالية عندما نستخدم مُصطلح "تعدد المهام" (Multi-Tasking) فإننا نقصد بذلك أسلوب "المُشاركة الزمنية" (Time-Sharing) في تعدد المهام و لا نقصد أسلوب "البرمجة المُتعددة" (Multiprogramming).

وفقاً لكتاب Operating System Concepts فإنّ المُشاركة الزمنية تُعتبر تطور مَنطقي للبرمجة المُتعددة، ففي البرمجة المُتعددة لا يتم إيقاف العملية مؤقتاً و إستبدالها بعملية أخرى لتستخدم المُعالج إلا في حالة واحدة و هي أن تكون العملية الحالية في حالة إنتظار، و بالتالي يتم إيقافها مؤقتاً و تُستبدل بعملية أخرى لتستفيد من المعالج بينما تكون الأولى مُنتظره، و نفس القانون بالنسبة للعملية الثانية.

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

بطبيعة الحال هذا الأسلوب أفضل لأنه يضمن توزيع وقت المعالج على جميع العمليات و يُبدّل العملية التي تستغل المُعالج حالياً في كل فتره زمنية قصيره، بالإضافة إلى أنها لا تجعل أي عملية في حالة إنتظار تُهدر وقت المعُالج.

كما أسلفت عندما نقول في هذه الأيام نظام تشغيل مُتعدد المهام فغالباً المقصود إنه يستخدم المُشاركة الزمنية لينفّذ ميزة تعدد المهام.