تعدد المهام multi-threading, multi-tasking

السلام عليكم ورحمة الله

طلب مني أحد الإخوة أن أقوم بشرح تعدد المسارات، وأظن أنه يعني به multi-tasking أو multi-threading  أو multi-process، وذلك بإستخدام بيئة التطوير لازاراس. وأريد أن أتكلم عن هذا الموضوع بعمومية أكثر ثم في النهاية بإذن الله أن اصحبه بمثال بلغة فري باسكال بإستخدام أداة التطوير لازاراس، وذلك لوضوح هذه اللغة في مثل هذا المجال.

مقدمةCpuTimeonSingleCpuMultiTaskingSystem

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

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

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

الموارد

من أهم اﻷشياء المتعلقة بتعدد المهام هي الموارد، أو الموارد المشتركة، حيث أن من واجب نظام التشغيل الذي يقوم بتشغيل أكثر من برنامج أو إجراء في نفس الوقت أن يتولى -مثلاً- حماية الذاكرة المخصص لكل واحد ولا يسمح للآخر بالتعدي على الذاكرة المؤقتة التي تم تخصيصها لبرنامج أو معالجة ما. هذه الذاكرة يتم حجزها إلى أن يقوم البرنامج باﻹنتهاء.

الموارد اﻷخرى تشمل الملفات واﻷجهزة الملحقة بنظام التشغيل. لابد من حمايتها أيضاً، حيث يُمكن أن تشترك فيها أكثر من معالجة (process).

أمثلة

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

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

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

متى نحتاج لتعدد المهام

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

حسب تجربتنا فإن تعدد المهام في برنامج واحد يصلح لأنواع معينة من الإجراءات أو المعالجات، وهي التي تأخذ وقت طويل لكن لا تستهلك المُعالج، مثل تحميل ملف من اﻹنترنت، فمهما بلغ حجم الملف المُراد تحميله من إنترنت أو شبكة فإن ذلك لا يُرهق المُعالج إنما يتحمله كرت الشبكة أو المودم. كذلك من المهام الطويلة هي إنتظار اﻹتصال waiting for socket connection كما يحدث في محركات قواعد البيانات ومخدمات الويب وغيرها من البرامج الخدمية والتي تنتظر إتصال من العملاء، فهي تظل في هذه الحالة دون أن تستهلك المعالج.

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

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

في دورة حياة البرنامج الواحد (من تشغيله إلى إغلاقه) يُمكن تشغيل مهمات فرعية في شكل threads أكثر من مرة، أي تشغيلها ثم تنتهي، ثم نقوم بتشغيلها مرة أخرى ثم تنتهي. ويُمكن كذلك تشغيل أكثر من مهمة في نفس الوقت، مثل تحميل أكثر من ملف من اﻹنترنت قبل أن ينتهي الملف اﻷول. كذلك يُمكن تشغيل مهمة فرعية أو أكثر بصورة مستمرة من بداية تشغيل البرنامج إلى نهايته، ومثال لذلك إنتظار إتصال server socket connection، بذلك تكون دورة حياة المهمة الثانوية مساوية لدورة حياة البرنامج.

المثال في تدوينة التالية

4 thoughts on “تعدد المهام multi-threading, multi-tasking

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s