مرجع
آخر الزيارات

تشعب (حوسبة)

1٬354 كلمة•0 مشاهدة•🗒️ منذ يوم
باختصار: في المعلوماتية والحوسبة، التشعب أو النَيْسَب أو شريط التعليمات أو التشعبات الحاسوبية هو عبارة عن مجموعة من التعليمات التي تشكل مساراً لتنفيذ العملية وبما أنه مجرد مسار فإنه لا يحتاج لموارد خاصة به حيث أنه يستعمل موارد العملية ذاتها. في هذه المقالة 10 أقسام: «التشعبات المتعددة والعمليات المتعددة»، «التشعبات المحظورة والمنتظرة Blocked and Waiting Threads» و«التشعب» وغيرها.
المحتويات
  1. التشعبات المتعددة والعمليات المتعددة
  2. التشعبات المحظورة والمنتظرة Blocked and Waiting Threads
  3. التشعب
  4. التشعبات المنتهية Terminated Threads
  5. التشعبات القابلة للتنفيذ Runnable Threads
  6. التشعبات الجديدة New Threads
  7. t.setDaemon(true);
  8. خواص التشعبات Thread Properties
  9. التشعبات الخفية Daemon Threads
  10. حالات التشعبات Thread states

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

من جهة ثانية، علاقة سلاسل مجال المستعمل وسلاسل تعليمات النواة: هناك اربع أنواع من العلاقات تربط النوعين من السلاسل وهي كالتالي.

كذلك، في الوقت الراهن، الكثير من أنظمة التشغيل تدعم تجزئة الزمن وتعدد المهام، أو التنفيذ متعدد المعالجات multiprocessor threading عن طريق منسق عمليات scheduler. تمكن نوى أنظمة التشغيل المبرمجين من التعامل مع عدة سلاسل تعليمات عن طريق واجهة استدعاءات النظام system call. بعض التطبيقات لهذا الموضوع يدعى سلسلة تعليمات النواة kernel thread حيث تكون العمليات الخفيفة lightweight process أنماطا خاصة من سلاسل تعليمات النواة والتي تتشارك بنفس الحالة ونفس المعلومات. ويبقى المبرمجون قادرين على تطبيق سَلسَلة التعليمات threading عن طريق المؤقتات، الإشارات، أو وسائل أخرى لتفسير تسلسل تنفيذ التعليمات وبالتالي الحصول على تجزئة زمنية جيدة. وهذا ما يدعى أحيانا: سلاسل تعليمات مجال المستعمل user-space threads.في أغلب أنظمة التشغيل لايتم تنفيذ سلاسل تعليمات المستعمل الا عبر سلسلة تعليمات النواة.

كذلك، متعدد لمتعدد: هذا النوع من العلاقات تقوم كل مجموعة من تشعبات النواة بإدارة مجموعة من تشعبات المستعمل.

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

من جانب آخر، في بعض الأحيان يستعملون مصطلح سلسلة تعليمات من اجل شفرة مجزأة threaded code وهو نمط من الشفرات البرمجية يتألف بالكامل من استدعاءات لأقسام برمجية subroutine.

ومن جهة أخرى، هناك ثلاث مكتبات أساسية للتشعبات أو السلاسل: (1) PThreads: وهي اختصار لل POSIX Threads وتستعمل في يونكس وماكنتوش وغيرهما كما تسمح باستخدام سلاسل على مستوى النواة أو على مستوى المستعمل. (2) Win32 Threads : وهي المستعملة في أنظمة تشغيل ويندوز «النوافذ» ولا تسمح للمستعمل في التعامل مع تشعبات «سلاسل» النواة وانما تتوفر له هذه السلاسل في مجال المستعمل فقط. (3) Java Threads : وهي خاصة ببرامج لغة الجافا وتقوم بإنشاء سلاسل خاصة بكل برنامج على حدة.

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

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

من جهة ثانية، واحد لواحد: في هذا النوع من العلاقات يرتبط كل تشعب من تشعبات المستعمل بتشعب واحد فقط من تشعبات النواة، يتضح لنا انه لو ان هناك تشعب واحد من تشعبات النواة تعطل فان تشعب المستعمل الذي كان متصلا به لن ينففذ ابداً.

وفي هذا السياق، يمكن تنفيذ تشعبات تعليمات متعددة بشكل متوازٍ على نفس المعالج وهذا ما يدعى بالتنفيذ المتعدد للتشعبات ويحدث عن طريق تعدد المهام computer multitasking أو ما يدعى بتجزئة الوقت time slicing وحيث يقوم معالج مركزي بالتبديل بين سلاسل التعليمات المختلفة. (ضمن هذا المفهوم التنفيذ ليس متزامنا بالنسبة لمعالج واحد لكننا نعتبره تزامنا مزيفا لأن التبديل يتم بسرعة كبيرة تعطينا انطباع بوهم التزامن)، بالمقابل يمكننا انجاز تزامن حقيقي عن طريق الاستعانة بحاسوب متعدد المعالجات أو معالجات متعددة الأنوية.

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

وفي هذا السياق، نمط المستويين: يستعمل هذا النوع من العلاقات هجين من النوعين السابقين بحيث يسمح بعلاقات واحد لواحد ومتعدد لمتعدد، هذا النوع هو الأكثر استخداما في الوقت الحالي

التشعبات المتعددة والعمليات المتعددة

وفي هذا الصدد، عندما تكون كل عملية لديها وضعية متكاملة من المتغيرات متغير (علم الحاسوب)

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

الفرق بين التشعبات المتعددة والعمليات المتعددة .

إضافةً إلى ذلك، وإذا اطلعنا على GUI كل منها يحمل thread منفصل يجمع الحدث ليراه المستعمل من بيئة تشغيل المضيف

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

من جهة ثانية، في بعض انظمة التشغيل threads تكون من "lightweight " أكثر من العمليات processes

التشعبات المحظورة والمنتظرة Blocked and Waiting Threads

علاوةً على ذلك، يمكن ان يتنقل الـ التشعب من حالة لاخرى عندما يكون التشعب محظور أو في الانتظار وايضا عندما يخرج من البرنامج يأتي تشعب آخر ينظم التشغيل.

من جانب آخر، وهذه الحالة تستمر حتى نفاذ الوقت أو ان تتلقى المنبه الصحيح دوال timeout تتضمن Threas.sleep و timed version of

Object.wait, Thread.join, lock.tryLock and Condition.await

وفي هذا السياق، عندما يكون التشعب محظور (blocked) أو في الانتظار (waiting). هو مؤقتًا غير فعال لاينفّذ أي شفرة ويستهلك مصادر أقل ويعتمد كذلك على thread scheduler لإعادة التشغيل وهذه التفاصيل تعتمد على كيفة الوصول إلى الحالة الغير مفعلة. عندما يحاول thread ان يكتسب كائن محظور (lock) لايتضمن حظره على java.util.concurrent library . الـ thread يصبح غير محظور (unblocked) عندما تكون كل التشعبات threads تنازلت عن الحظر و thread scheduler يسمح لهذه التشعبات ان تمسك بهذا الكائن. عندما ينتظر التشعب تشعب اخر لينبه منظم التشعبات (thread scheduler) لحالة معينة، يدخل في حالة الانتظار وهذا يحدث عن طريق نداء دالة Object.wait or Thread.wait أو عن طريق انتظار lock أو condition في java.util.concurrent library الكثير من الدوال تحتوي على parameters غير ثابتة خارج الوقت timeout.

مناداتها يسبب للتشعب (thread)ان يدخل في حالة timed waiting

التشعب

  • إذا نظرنا في برنامج لا يستعمل التشعبات الحاسوبية المتعددة multiple threads
  • يصعب على المستعمل ان يؤدي عدة مهام في هذا البرنامج اما إذا كان هناك برنامج
  • يستعمل separate threads سنجد سهولة في عمل البرنامج.
  • دالة thread.sleep لا تنشأ دالة جديدة بل هي دالة ثابتة في مصفوفة تشعب (حاسوب)
  • بشكل مؤقت توقّف عمل النشاط الذي يستعمل الـ تشعب (حاسوب) الحالي

التشعبات المنتهية Terminated Threads

  • يقطع الــthread لسبب من هذه الاسباب:
  • يموت بشكل طبيعي لان دالة التشغيل تخرج بشكل عادي
  • يموت فجأة إذا uncaught Exception قطع دالة التشغيل

علاوةً على ذلك، يمكن قتل الـ Thread بتنفيذ دالة stop وهذه الدالة throws ThreadDeath error تلقي كائن يقتل الـ thread

التشعبات القابلة للتنفيذ Runnable Threads

كذلك، تعتمد runnable state على نظام التشغيل في العمل. عندما يعمل التشعب thread ليس من الضروري ان يبقى قيد التشغيل، ولكن يستحق التشغيل إذا كان هناك الكثير من الـ running threads وتوقفت لسبب فهنا تأتي الفرصة للتشعبات الأخرى بالعمل. تفاصيل التشعبات threads تعتمد على الخدمة التي يوفرها نظام التشغيل. نظام المنظم scheduler system يعطي runnable thread جزء من الوقت ليؤدي مهامه. عندما نختار الـ thread التالي نظام التشغيل يأخذ في الحسبان اولوية الـthread

علاوةً على ذلك، عندما تنفذ دالة start، التشعب الحاسوبي (thread) يكون في حالة runnable state

التشعبات الجديدة New Threads

في هذا الإطار، عندما تنشآ thread بأداة التشغيل new مثال: new Thread(r) - the thread is not running yet هنا التشعب لم يتم تشغيله بعد، وهذا يعني ان البرنامج لم ينفذ الشفرة (codes). هناك كمية معينة من الحسابات التي تحتاج ان تنتهي قبل تشغيل الـ تشعب (thread)

t.setDaemon(true);

من جانب آخر، وظيفته الوحيدة هي خدمة الغير، مثال: timer thread وظيفته يرسل الدقّات المعتادة للساعة للتشعبات الأخرى أو التشعب الذي ينظف catche من البقايا القديمة. الآلة الفعلية virtual machine تخرج إذا كانت كل التشعبات Daemon Threads

لانه لامعنى لعمل البرنامج إذا كانت كل التشعبات Daemon

خواص التشعبات Thread Properties

  • MIN_PRIORITY (معرفه كـ 1 في Thread class)
  • و MAX_PRIORITY معرفه كـ 10 NORM_PRIORITY معرف كـ 5.
  • كلما اتيحت الفرصة لمنظم التشعبات ان يختار تشعب جديد يفضل ذا اولوية عالية.

علاوةً على ذلك، اولويات التشعبات هي highly system dependent, عندما تعتمد الآلة الفعلية على تطبيق التشعب لبرنامج المضيف الذي يحتوي على تشعب أو أكثر من مستويات الاولوية

في هذا الإطار، مثال: Windows يحمل 7 مستويات للاولوية. بعض اولويات الجافا تشير إلى نفس مستوى نظام التشغيل في The Sun JVM for Linux كل التشعبات تحتوي على نفس المستوى

علاوةً على ذلك، في لغة البرمجة كل تشعب له اولوية. وكل تشعب يورّث اولوية للتشعب الذي ينشأه. ويمكن زيادة أو انقاص اولوية أي تشعب عن طريق دالة setPriority تستطيع ضبط الاولوية لأي قيمة بين:

التشعبات الخفية Daemon Threads

ومن ناحية أخرى، تستطيع تحويل التشعب أو thread إلى daemon thread بمناداة دالة

حالات التشعبات Thread states

  • ممكن ان يكون في واحدة من هذه الحالات
  • New
  • Runnable
  • Block
  • Waiting
  • Time waiting
  • Terminated
  • لتحديد حالة الـ thread الحالي، دالة getState
  • تقوم بتحديد حالة التشعب الحالي

ما رأيك في هذه المقالة؟

📝 هل في هذه المقالة خطأ؟

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