21/6/2013 - ما هو تعدد المهام (Multi-tasking) في نُظم التشغيل؟




سأتحدث اليوم عن مفاهيم نُظم التشغيل و بالضبط سأتحدث عن تعدد المهام (Multi-tasking) كتقديم لموضوع آخر سأتحدث عنه إن شاء الله في تدوينة أخرى.

في الأيام الخوالي قبل بداية إنتشار الهواتف الحديثة بأنواعها معظم مستخدمي الحاسوب غير المتخصصين لم يكونوا يعلموا عن ميزة تعدد المهام (Multi-tasking)، و لكن بعدما تم إستخدام هذه الكلمة في التسويق للمنتجات التجارية أصبحت الكلمة دارجة بين غير المتخصصين في الحاسوب و نُظم التشغيل، و لأنّني سأتحدث في تدوينة منفصله عن موضوع له علاقة مباشرة في ميزة تعدد المهام فلابد من توضيح هذا المفهوم أولاً.

عندما يحتوي الحاسوب على مُعالج (Microprocessor) واحد فقط فإنّه في الحقيقة لا يُمكنه تشغيل أكثر من برنامج واحد في نفس الوقت (يُمكنك الإستزادة فيما يخص موضوع المُعالجات بقراءة التدوينة "نظره على المعالجات" )، هذا يعني ببساطة إنه إذا كان لديك في الحاسوب معالج واحد فقط فإنّك فعلياً لن تتمكن من تشغيل أكثر من برنامج واحد و عندما ينتهي هذا البرنامج من عمله فيمكنك تشغيل برنامج آخر، قبل عشر سنوات من الآن تقريباً كانت أغلب الحواسيب المكتبية في منازلنا لا تحتوي إلا على معالج واحد فقط، ولكن قبل سنوات قليلة و مع تطوّر المعالجات أصبح مفهوم المعالجات مُتعددة الأنوية (Multi-core processor) شائعاً، ففي هذه الأيام عندما تنوي شراء حاسوب فإنك تجد من ضمن ميزات المُعالج إنه ثنائي النواة (Dual-Core) أو رباعي النواة (Quad-Core) أو حتى ثماني النواة (Octa-Core) أو أي عدد آخر من الأنوية.

المقصود بالنواة (Core) هو معالج منفصل، فالمعالجات الجديدة تأتي كقطعه واحدة و لكن هذه القطعة تحتوي على عدد من المُعالجات المُنفصلة التي تعمل معاً في نفس الوقت و التي يُطلق عليها إسم نواة (Core)، و بالتالي عندما تجد إنّ معالج معين ثُماني النواة (Octa-Core) فهذا يعني إنه قطعة واحدة تحتوي على ثمان معالجات مُختلفه تعمل في نفس الوقت، و بالتالي يُمكننا القول إن الحاسوب (أو الهاتف أو أي جهاز آخر) إن كان يحتوي على معالج ثماني النواة فإنه في الحقيقة يحتوي على ثمان معالجات.

حسناً حتى مع هذه المعالجات الحديثة و التي تحتوي على عدد من الأنوية، نعود إلى نفس القاعدة، لا يُمكن للمعالج الواحد تشغيل أكثر من برنامج واحد في نفس الوقت، هذا يعني إنّ المعالجات القديمة التي كُنّا نستخدمها قبل عشر سنوات كان لا يُمكنها تشغيل أكثر من برنامج واحد في الوقت نفسه، وكذا بالنسبة للمعالجات الحديثة و إن كانت مُتعددة الأنوية ففي الحقيقة لا يُمكنها تشغيل أكثر من "س" برنامج في وقت واحد، و "س" = عدد الأنوية في المعالج، فإن كان المعالج الموجود في حاسوبك رُباعي النواة (Quad-Core) فإنّ عدد البرامج التي يُمكنك تشغيلها في الوقت ذاته هو أربع برامج فقط، و هذه حقيقه هامه.

على الرغم من ذلك، وحتى قبل أكثر من عشر سنوات مضت و حتى في أيام نُظم التشغيل القديمة مثل Window 95 و Mac OS و توزيعات لينكس القديمة في سنوات الـ 90 و حتى قبل ظهور المُعالجات مُتعددة الأنوية في الأسواق، كان بإمكاننا تشغيل العديد من البرامج و إستخدامها في وقت واحد، فلم يُحدد لنا من قبل أحد هذه النُظم عدد البرامج التي يُمكننا تشغيلها في وقت واحد، حالياً و أنا أكتب هذه التدوينة فإنّ هناك خمس برامج مفتوحة أتنقل ما بينها و مع ذلك معالجي ثنائي النواة.

حسناً كيف يُمكننا تشغيل ما أردنا من البرامج في نفس الوقت على الرغم من القاعدة العريضة التي تحدثنا عنها في الأعلى و هي عدم إمكانية تشغيل المعالج الواحد لأكثر من برنامج واحد في نفس الوقت؟

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

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

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

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

عكس تعدد المهام (Multi-tasking) (و الذي تدعمه أغلبية نُظم التشغيل الحديثة و الذي يُوهمنا بإننا نُشغّل أكثر من برنامج واحد في نفس الوقت) هو المُهمه الأُحادية (Single-tasking) و هي عكس تعدد المهام تماماً، ففي تعدد المهام يكون هدف نظام التشغيل هي توزيع وقت المعالج على عدّة برامج في نفس الوقت، بينما نُظم المُهمة الأحادية فإنّها تُشغّل برنامجاً واحداً فقط و تُعطي وقت المعالج بأكمله لهذا البرنامج إلى أن ينتهي البرنامج من عمله، ثم يعود المُعالج لنظام التشغيل الذي يكون مستعداً لتشغيل برنامج آخر، أقرب مثال لهذا النوع من نُظم التشغيل هو نظام DOS.

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

هناك نوعان من تعدد المهام قد يأتي نظام التشغيل بأحد منهما، النوع الأول يُطلق عليه إسم "تعدد المهام الوقائي" (Preemptive multitasking) و في هذا النوع يقوم نظام التشغيل في كل فتره زمنيه معينه بإيقاف العملية (المقصود بالعملية Process هنا هو برنامج مُشغَّل تحت التنفيذ و هو مفهوم هام في نُظم التشغيل) التي تعمل الآن مؤقتاً و الإنتقال إلى عملية أخرى، أغلب النُظم الحالية تستخدم هذا النوع مثل لينكس، Mac OS X و Windows NT.

أما النوع الثاني من تعدد المهام هو "تعدد المهام غير الوقائي" (Nonpreemptive multitasking) و له إسم آخر وهو "تعدد المهام التعاوني" (Cooperative multitasking)، و في هذا النوع لا يقوم نظام التشغيل بإيقاف العملية التي تستخدم المعالج حالياً، و إنما يقوم بإنتظار العملية حتى تُعلن بنفسها إنها إنتهت من إستخدام المعالج و بالتالي يُمكن توفيرها لعمليات أخرى، بالطبع يفترض هذا النوع من تعدد المهام إنّ العمليات مُتعاونة ولن يستحوذ أحدها بشكل دائم على المعالج، مثال على النُظم التي كانت تستخدم هذا النوع : نظام Mac OS القديم الذي سبق Mac OS X.