المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : ) التطبيقات العاملة Processes ومسارات التنفيذ Threading



PaPEr Cut
21-07-2002, 02:13 PM
* تعريف البروسس


عندما تقوم بتشغيل او تنفيذ برنامج، فان البرنامج سيكون بالذاكرة طيلة فترة عمله. في هذه الاثناء، نطلق عليه الاسم برنامج عامل Process. باختصار، أي برنامج يتم تنفيذه بالذاكرة يسمى بروسس Process. واذا كنت من مستخدمي Win 2000 او NT فتستطيع معرفة جميع البرامج العاملة Processes عن طريق خانة التبويب Processes الموجودة في النافذة Windows Task Manager والتي تستطيع فتحها بالضغط على المفاتيح Ctrl + Shift + Esc





* مسارات التنفيذ


اما مسارات التنفيذ Threading فهو موضوع متقدم قليلا واود ان اعطيك فكرة مبسطة عنه الان. كل Process يحتوي على ثريد Thread واحد (على الاقل). لان البروسس قد يحتوي على اكثر من ثريد Thread ولكن الثريد الواحد لا يكون تابع الا لبروسس واحد فقط.


العادة جرت عند الكتاب بتوضيح معنى المصطلح قبل التوغل في تفاصيله ولا اعلم لماذا نسيت تعريف الثريد قبل التحدث عنه! على العموم، الثريد Thread عبارة عن مسار تنفيذي. فاي عملية تنفيذية يقوم الـ Process بانجازها تتم في ثريد Thread. مثلا، لو كان البروسس يقوم باجراء عملية حسابية فان عملية التنفيذ تتم في مسار خاص لها. تسمى عملية التنفيذ هذه بالثريد.


ذكرت قبل قليل ان الـ Process الواحد قد يحتوي على اكثر من ثريد، أي ان البروسس الواحد يقوم بعملية تنفيذ اكثر من اجراء في وقت واحد. مثلا، قد يقوم برنامج معين بالقيام بعملية طباعة المستندات، والتدقيق الاملائي لها، واجراء عملية الحفظ في وقت واحد. لاحظ انني ذكرت ثلاثة عمليات 1) طباعة 2) تدقيق 3) تخزين . يعني ان هذا البرنامج يحتوي على ثلاثة مسارات تنفيذية (ثريدز) Threads هي: ثريد خاص لعملية الطباعة وثريد خاص للتدقيق الاملائي وثريد خاص للتخزين. بما ان هذه العمليات الثلاث تتم في وقت واحد، لذلك نطلق عليها 3 ثريدات تابعة لبروسس (برنامج) واحد. اما لو كانت هذه العمليات الثلاث لا تتم في وقت واحد (أي الطباعة ثم التدقيق ثم الحفظ) فان جميع هذه العمليات الثلاث تتم في ثريد واحد. اتمنى من صميم قلبي ان تكون فكرة الثريد قد اتضحت لك، لانني سأعود اليها لاحقا.



* نظرات متقدمة الى مبدأ الـ Multitasking


يطلق على نظام Windows بنظام متعدد المهام Multitasking. مبدأ تعدد المهام Multitasking بسيط وسهل الاستيعاب، وهو امكانية تشغيل اكثر من تطبيق في وقت واحد. فمن الواضح لمبرمجي –وحتى مستخدمي- Windows قابلية هذا النظام لتشغيل اكثر من برنامج او تطبيق في وقت واحد. وبما ان هذه المقالة موجهة للمبرمجين فسأوضح برمجيا كيف يستطيع نظام التشغيل Windows بعملية تشغيل اكثر من تطبيق في واحد رغم وجود ذاكرة Memory واحدة ومعالج Processor واحد (باستثناء المعالجات المتعددة لبعض الاجهزة).


حسنا، بعد تعريف مبدأ تعدد المهام ما رأيك لو اخبرتك ان نظام التشغيل Windows لا يستطيع تشغيل اكثر من تطبيق في وقت واحد!! أي ان مبدأ تعدد المهام MultiTasking عبارة عن شئ غير حقيقي! والذي يعمل دائما تطبيق واحد فقط! كيف ستكون ردت فعلك يا ترى؟؟


يبدو ان كلامي متعارض وقد يجعلك تسهر في التفكير اكثر من العاشقين! لذلك، سنعود الى الوراء وعدد ليس ببعيد من السنين الى ايام نظم 16 bit كاصدارات Windows 3.x حتى تفهم كيف تتم عملية تنفيذ اكثر من بروسس في وقت واحد.



* نظم 16 bit


في الاصدارات القديمة لنظم Windows كان بامكانك تشغيل اكثر من تطبيق في وقت واحد، لكن عملية التنفيذ تكون موجهة لبرنامج واحد فقط وهو البرنامج النشط Active Process. فلو كان لديك برنامجان مفتوحان على سطح المكتب، فالبرنامج النشط هو الذي يعمل حاليا، اما الاخر فهو متوقف تماما ولا يقوم باي شئ، فكل ما تراه عبارة عن واجهة ثابتة تمثل الواجهة الاخيرة التي كان عليها البرنامج قبل ان يفقد التركيز او التنشيط.

فعندما تقوم بتنشيط البرنامج الثاني، يقوم نظام التشغيل باجراء جميع العمليات الازمة لاعادة انعاش واستمرار عملية تنفيذ البرنامج من النقطة التي وقف عندها. طبعا معظم هذه العمليات منخفضة المستوى low level وهي خاصة بنقل المسجلات Registers وساعة التنفيذ CPU Time واشياء خاصة بالمعالج وهي خارج عن موضوعنا الان.


اذن حتى لو وجد عشرات التطبيقات المفتوحة امامك، فتذكر ان واحد منها يعمل فقط وهو التطبيق النشط. وكل ما تراه عبارة عن ديكور لا يعمل الا اذا اصبح التطبيق هو التطبيق النشط. تذكر دائما ان المظاهر خداعة، وقد خدعنا نظام التشغيل Windows منذ زمن بعيد بانه يستطيع تنفيذ اكثر من تطبيق في وقت واحد!


والان سأثبت لك هذه الحقيقة بهذا المثال البسيط، قم بانشاء برنامج بسيط لطباعة ارقام في حلقة تكرارية كهذا البرنامج بلغة C او ما يشابهه باي لغة برمجة اخرى:




==================================

#include


void main ()

{

int iCounter = 0;


while (true)

printf ("r%d", iCounter++);

}

==================================




والان اريد منك تشغيل نسختين من هذا البرنامج، ووضع النافذتين متجانبتين على الشاشة. تلاحظ ان نسخة واحدة من النسختين يتم تنفيذها (النسخة النشطة) اما الاخرى فهي ساكنة وواقفة لا تتحرك. ولو تجعل النسخة الثانية هي النشطة ستتم عملية الايقاف المؤقت للاولى وستستمر الثانية بالعمل. وهذه طريقة تنفيذ اكثر من تطبيق –على قولتهم في وقت واحد!.



* نظم 32 bit


في نظم 32 بت والتي بدأت منذ اصدار Win 95 وما بعده اصبح عملية تنفيذ اكثر من تطبيق اكثر واقعية من نظم 16 بت. وقد تطورت ميكانيتها تطور كبير. فلو تقوم بعملية تشغيل نسختين من البرنامج السابق في وقت واحد، لن يكون هنالك وقف مؤقت! بل ستلاحظ ان كلا البرنامجين يعملان بشكل طبيعي. مع ذلك اريد ان اذكرك ان المظاهر خداعة! فالبرنامجان لا يعملان في وقت واحد، وانما تتم عملية التناوب بينهما بشكل استمراري.


لتوضيح فكرة عملية التناوب، راقب في الخطوات التالية كيف يقوم نظام التشغيل بتنفيذ تعليمات كلا البرنامجين Processes:


1) سيتحول نظام التشغيل الى النسخة الاولى ويبدأ بطباعة قيمة العداد iCounter وهي صفر

2) سينتقل نظام التشغيل الى النسخة الثانية ويبدأ بطباعة قيمة العداد iCounter وهي صفر

3) يعود نظام التشغيل الى النسخة الاولى ويطبع قيمة العداد iCounter وهي واحد

4) يعود نظام التشغيل الى النسخة الثانية ويطبع قيمة العداد iCounter وهي واحد

5) يعود نظام التشغيل مجددا الى النسخة الاولى ويطبع قيمة العداد iCounter وهي 2

وهكذا ... حتى تتم عملية انتهاء البرنامجين.



* نظم NT وفلسفة الأسبقية Priority


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

والحل الذي طوروه مصمموا نواة التشغيل Windows يعرف بالاسبقية Priority. وهي ببساطة شديدة اعطاء البرنامج النشط وقت اكثر وفرصة اكثر للمعالجة من البرامج الاخرى.


ساوضح مدى تأثير الاسبقية على المثال السابق، الخطوات التالية تعرض لك كيف تقوم نظم NT و 2000 بتنفيذ البرنامجين:


اذا كان النسخة الاولى هي النشطة:

1) سيتحول نظام التشغيل الى النسخة الاولى ويبدأ بطباعة قيمة العداد iCounter وهي صفر

2) سيزيد من قيمة العداد ويطبع قيمة iCounter وهي واحد

3) سيزيد من قيمة العداد ويطبع قيمة iCounter وهي 2

4) سيتحول نظام التشغيل الى النسخة الثانية ويطبع قيمة iCounter وهي صفر

5) يعود نظام التشغيل الى النسخة الاولى ويطبع قيمة iCounter وهي 3

6) سيزيد من قيمة العداد ويطبع قيمة iCounter وهي 4

7) سيزيد من قيمة العداد ويطبع قيمة iCounter وهي 5

8) سيتحول نظام التشغيل الى النسخة الثانية ويطبع قيمة iCounter وهي 1

9) يعود نظام التشغيل الى النسخة الاولى ويطبع قيمة iCounter وهي 6


وهكذا..


تلاحظ ان نظام التشغيل يقوم بتنفيذ تعليمات اكثر للنسخة الاولى للبرنامج من النسخة الثانية والسبب ان النسخة الاولى هي النشطة، لذلك يعطيها نظام التشغيل اسبقية اعلى ووقت معالجة اكثر من النسخة الثانية.


وكي اثبت لك كلامي، قم بتشغيل النسختين، وضعهما متجانبتين. ستلاحظ ان كلا النسختين تعلمان وتطبعان الارقام بسرعة. لكن لو كنت قوي الملاحظة، سنلاحظ ان النسخة النشطة هي اسرع في التنفيذ من النسخة غير النشطة.


وهذه هي فلسفة الاسبقية التي ظهرت منذ اصدار NT وحتى اصدارات 2000. تستطيع التحكم بالاسبقية عن طريق الضغظ بالزر الفأرة الايمن على البروسس في خانة التبويب Processes في النافذة Windows Task Manager .

ايضا، تستطيع زيادة الاسبقية لبرنامجك اذا اردت عن طريق اجراءات متقدمة من اجراءات API والتي بصراحة شديدة لا اود اللعب معها كثيرا، في تتطلب مبرمجين شجعان! وحتى لو كنت من المستخدمين، تستطيع الغاء تقنية الاسبقية التي يوفرها نظام Win 2000 وتجعل عملية تنفيذ البرامج كما تعمل في اصدارات Win 9x وذلك عن طريق الخطوات التالية:

1) من ايقونة My Computer اضغط الزر الايمن ثم اختر Properties

2) حدد خانة التبويب Advanced ثم اضغط على الزر Performance Options

3) حدد BackGround Services ذا اردت الغاء تطبيق مبدأ الاسبقية. او Applications اذا رغبت غير ذلك.


اخيرا، اتمنى ان يكون التوضيح غير معقد! فان مثل هذه المسائل المتقدمة قد قضى المبرمج شهور طويلة –ان لم تكن اعوام- لتعلمها واستعيباها فارجوا ان تضع ذلك في ذهنك ومعرفة مدى الصعوبة التي اواجهها في توصيل مثل هذه المواضيع لك في مقالات او دروس مبسطة!