الـ Concurrency والـ Parallelism اتنين من المصطلحات المهمة جدًا واللي أغلبنا حصله لبس وماقدرش انه يستوعبهم من أول مرة بشكل كويس. ولكن هم من أهم المصطلحات اللي تهمنا في الـ Software.
إيه هي الـ Concurrency؟
الـ Concurrency هي لما يكون عندك أكتر من عملية (task) شغالة في نفس الوقت، بس مش شرط كل العمليات دي تشتغل في نفس اللحظة. بمعنى تاني، الجهاز بتاعك بيتعامل مع كذا عملية في نفس الوقت بس مش شرط يشتغل عليهم كلهم في نفس الثانية.
تخيل إنك طباخ في مطبخ وعندك أكتر من طلبية، بتبدأ شوية في الطلبية الأولى، وبعدها بتسيبها مثلا لحد ما تجهز على النار وتروح للطلبية التانية وتبدأ فيها، وبعدين ترجع للأولى وهكذا. كده إنت بتتعامل مع كل الطلبات في نفس الوقت، بس مش بتخلصهم كلهم مرة واحدة.
مثال تاني على الـ Concurrency في Microsoft Word
تخيل إنك بتكتب مستند في الـ Word، وفي نفس الوقت بتعمل تدقيق إملائي (spell check) وتنفيذ بعض الصيغ (formulas) في نفس المستند.
- البرنامج بيقسم وقته بين كتابة النص والتدقيق الإملائي وتنفيذ الصيغ. بمعنى إنه شوية يتأكد من الكلمات المكتوبة وشوية ينفذ الصيغ وشوية يسمح لك بالكتابة.
- البرنامج هنا بيدير كل العمليات دي بشكل متزامن، بس مش شرط يكون شغال عليهم كلهم في نفس اللحظة بالظبط.
استخدامات الـ Concurrency
- تصفح الويب: لما تفتح أكتر من (tab) في المتصفح وكل (tab) بيحمل صفحة مختلفة، المتصفح بيقسم وقته بين التبويبات دي.
- التطبيقات اللي بتتعامل مع المدخلات الخارجية: تطبيق بيستقبل بيانات من المستخدم وفي نفس الوقت بيحدث قاعدة البيانات وبيعمل عملية حسابية، البرنامج بيعمل كل المهام دي بشكل Concurrent، بيستغل الوقت اللي بياخده في انتظار المدخلات عشان ينفذ عمليات تانية بدل ما يفضل مستني وما يعملش حاجة.
- السيرفرات والتعامل مع الطلبات المتعددة: سيرفر ويب بيتعامل مع أكتر من طلب (request) من مستخدمين مختلفين، بيوزع وقت البروسيسور بين الطلبات دي عشان يقدر يرد عليهم بشكل متزامن.
مميزات الـ Concurrency
خلونا نرجع لمثال المطبخ , طب احنا كده استفدنا ايه من اني عمال ابدل بين الطلبيات في المطبخ؟
بالطريقة دي بدل ما كنت هتشتغل على حاجة واحدة كاملة وتخلصها وبعدين تشتغل على حاجة تانية انت كده وفرت جزء كبير من الوقت , فتخيل معايا ان الطلبية اللي محتاج تعملها في المطبخ بتاخد منك 20 دقيقة , فايه هيكون الافضل ؟
ان بعد 10 دقايق تحط الطلبية الاولى على النار وتستناها كمان 10 دقايق وتفضل مستني الـ 20 دقيقة كاملين لحد مالطلبية تخلص وما تعملش اي حاجة تانية ؟
ولا وتبدأ في التانية والاولى على النار , وبعدين لما الاولى يعدي عليها 10 دقايق تانيين على النار ترجعلها وتخلصها وتسيب التانية على النار ؟ كده انت خليت وقت الانتظار بين الطلبيتين 10 دقايق مش 20 دقيقة زي المرة الاولى اللي كنا هناخد فيها طلبية واحدة ونعملها للاخر.
فالـ Concurrency من الحاجات الجميلة جدًا اللي بتسرع من وقت تنفيذ المهام , بدل الوقت الضايع في انتظار العمليات انها تتم.
فمميزات الـ Concurrency هي كالآتي:
- تحسين استغلال الـ Resources: بتحسن استغلال البروسيسور عن طريق تشغيل أكتر من عملية في نفس الوقت، وبتقلل الوقت الضايع في انتظار العمليات.
- زيادة الاستجابة: بتخلي البرامج أكتر استجابة للمستخدم عن طريق توزيع المهام بشكل متوازي.
- تبسيط إدارة العمليات: بتسهل إدارة العمليات اللي بتعتمد على بعضها أو اللي محتاجة تنفذ بشكل متزامن.
عيوب الـ Concurrency
ولكن زي ما احنا عارفين كل فايدة بيكون قصادها تضيحات , ففيه تحديات كتير بتقابلنا في الـ Concurrency زي الـ Context Switching وان الـ CPU عمال كل شوية يبدل بين الـ Tasks وبعضها فالعيوب او التحديات كالآتي:
- صعوبة في البرمجة: كتابة كود يعتمد على الـ Concurrency بيكون معقد وصعب، وبيحتاج من المطورين يكونوا على دراية بكيفية التعامل مع المشاكل المحتملة زي الـ (race conditions) والـ (deadlocks).
- أداء أقل مقارنة بالـ Parallelism: الأداء ممكن يكون أقل من الـ Parallelism لأن العمليات مش بتتنفذ في نفس اللحظة بالظبط، فممكن يكون فيه تأخير بسيط في الاستجابة.
إيه هي الـ Parallelism؟
الـ Parallelism بقى هي لما يكون عندك أكتر من عملية شغالة في نفس اللحظة. يعني لو عندك جهاز كمبيوتر بيقدر يشغل أكتر من عملية مع بعض فعلًا في نفس الثانية.
نرجع لمثال المطبخ. تخيل إن في طباخين اتنين في المطبخ، وكل واحد فيهم شغال على طلبية مختلفة في نفس اللحظة. الطباخ الأول شغال على طبق السلطة والتاني شغال على طبق الشوربة في نفس الوقت بالظبط. هنا بقى بنقول إن في Parallelism.
مثال على الـ Parallelism في Microsoft Word
تخيل إنك بتفتح مستند Word كبير جدًا ومعقد، وبتعمل فيه بحث عن كلمة معينة (Find and Replace).
- لو عندك بروسيسور بعدة أنوية (multi-core processor)، الـ Word ممكن يوزع عملية البحث دي على أكتر من نواة بحيث كل نواة تدور على الكلمة دي في جزء مختلف من المستند في نفس الوقت.
- في الحالة دي، عملية البحث بتتنفذ في أجزاء مختلفة من المستند بشكل متوازي وبنفس اللحظة، فده بيسرع عملية البحث ويخلصها في وقت أقل بكتير مقارنة لو كانت بتتنفذ بنواة واحدة.
استخدامات الـ Parallelism
- تحليل البيانات: برنامج بيحلل مجموعة كبيرة من البيانات، بيقدر يقسم البيانات دي لأجزاء صغيرة وكل جزء يتحلل في نواة (core) مختلفة من البروسيسور في نفس الوقت، بيزيد سرعة التحليل بشكل كبير.
- ألعاب الفيديو: الألعاب الحديثة اللي بتحتاج معالجة رسوميات معقدة، بتستخدم أكتر من نواة في البروسيسور وفي كارت الشاشة (GPU) عشان تعالج الرسوميات دي في نفس الوقت، وده بيخلي اللعبة سلسة وسريعة.
- المعالجة العلمية والهندسية: برامج المحاكاة العلمية اللي بتعمل نماذج لمشاكل معقدة زي التنبؤ بالطقس أو محاكاة فيزياء الجسيمات، بتستخدم الـ Parallelism عشان تقدر تعالج الحسابات المعقدة دي في وقت أقل.
مميزات الـ Parallelism
طب احنا كده استفدنا ايه من اني اصبح عندي طباخين اتنين في المطبخ؟
بالطريقة دي بدل ما كنت هتشتغل على حاجة واحدة كاملة وتخلصها وبعدين تشتغل على حاجة تانية انت كده وفرت جزء كبير جدا جدا من الوقت مقارنة حتى بالـ Concurrency , فتخيل معايا ان الطلبية اللي محتاج تعملها في المطبخ بتاخد منك 30 دقيقة.
كده الوضع هيكون عامل ازاي ؟ كده بدل ما تعمل طلبيتين اتنين في 60 دقيقة , انت باه بقدرتك تعمل طلبيتين اتنين في 30 دقيقة , ولو عدد الطباخين زاد الـ Throughput والانتاجية بتاعتك هتزيد بالمعدل ده , وده لان لو فيه 3 طباخين هتعمل في نفس الـ 30 دقيقة , 3 طلبيات.
فالـ Parallelism من أحسن الحاجات اللي بنعتمد عليها في تحسين الـ Performance , خصوصا ان في وقتنا الحالي باه فيه تطور رهيب في البروسيسور وباه بيدعم أكتر من Core في نفس الوقت واللي بينتج عنه اداء عالي جدًا في عمليات الـ Parallelism.
فمميزات الـ Parallelism هي كالآتي:
- أداء عالي: بيحسن الأداء بشكل كبير عن طريق تنفيذ العمليات في نفس اللحظة بالظبط، وده بيقلل الوقت المستغرق في تنفيذ المهام.
- سرعة في المعالجة: بيساعد في تنفيذ المهام الكبيرة والمعقدة بسرعة عن طريق تقسيمها لأجزاء وتنفيذها بشكل متوازي.
- كفاءة عالية: بيساعد في استغلال الإمكانيات الكاملة للأجهزة الحديثة اللي بتدعم تشغيل أكتر من نواة (core) في نفس الوقت.
عيوب الـ Parallelism
- استهلاك عالي للموارد: بيحتاج موارد أكتر زي البروسيسور والذاكرة، وده ممكن يكون مشكلة في الأجهزة اللي إمكانياتها محدودة.
- تعقيد في إدارة العمليات: إدارة العمليات اللي بتتنفذ بشكل متوازي ممكن تكون معقدة وصعبة، وبيحتاج من المطورين يكونوا على دراية بكيفية التعامل مع المشاكل المحتملة زي الـ Synchronization والـ Race-Conditions.
- توافقية مع الأجهزة: مش كل الأجهزة بتدعم الـ Parallelism بشكل كامل، فممكن تكون فيه مشاكل في التوافقية مع بعض الأجهزة.
في الختام
فهم الفرق بين المصطلحين دول مهم جدًا لمهندسي البرمجيات عشان يصمموا برامج أكتر كفاءة وتستغل إمكانيات الأجهزة بشكل أحسن. استخدام الـ Concurrency بيساعد في تحسين أداء البرامج حتى لو الجهاز مش بيدعم الـ Parallelism الكامل، وبيساعد في استغلال الوقت والموارد بشكل أحسن. أما الـ Parallelism فبيساعد في زيادة سرعة المعالجة وتقليل الوقت المستهلك في تنفيذ المهام الكبيرة.
فالخلاصة الـ Concurrency هو لما الجهاز يتعامل مع أكتر من عملية في نفس الوقت بس مش شرط في نفس اللحظة بينما الـ Parallelism هو لما الجهاز يشغل أكتر من عملية في نفس اللحظة.