مدخل إلى جافا الأحداث غير المتزامنة: حلقات الجس Polling Loops والمقاطعات Interrupts في المعالج


Rama Alkhayer

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

  • القرص الصّلب (hard disk) أو وسيط التّخزين ذو الحالة الثابتة (solid state drive أو SSD) لتخزين ملفّات البرامج والبيانات. لاحظ أن الذّاكرة الرّئيسيّة تحتفظ بكميّة صغيرة نسبيًّا من المعلومات وتحتفظ بها طالما هناك تغذية كهربائيّة. يُستخدم القرص الصّلب أو وسيط التّخزين ذو الحالة الثّابتة للتّخزين الدّائم لكميّات ضخمة من المعلومات لكن يجب تحميل البرامج منه إلى الذّاكرة الرّئيسيّة قبل أن يتمّ تنفيذها فعليًّا. يُخزّن القرص الصّلب البيانات على قرص مغناطيسي دوّار، بينما يُمثّل وسيط التّخزين ذو الحالة الثّابتة ssd جهازًا إلكترونيًّا صرفًا بدون أيّ أجزاء متحرّكة.
  • لوحة المفاتيح والفأرة لدخل المستخدم.
  • الشّاشة والطّابعة لعرض خرج الحاسوب.
  • جهاز إخراج صوت للسّماح للحاسوب بتشغيل أصوات.
  • واجهة شبكة للسماح للحاسوب بالتّواصل مع الحواسيب الأخرى المتّصلة به على الشبكة، سواء سلكيًّا أو لاسلكيًّا.
  • الماسحة لتحويل الصور إلى أرقام ثنائيّة مُرمّزة يمكن تخزينها وتعديلها على الحاسوب.

قائمة الأجهزة هذه لا نهاية لها وتُبنى الأنظمة الحاسوبية على نحوٍ يجعل توسعتها بإضافة أجهزة جديدةٍ أمرًا سهلًا. يتوجّب على وحدة المعالجة المركزيّة بطريقةٍ ما التّواصل مع جميع هذه الأجهزة والتّحكم بها وتقوم بذلك من خلال تنفيذ تعليمات لغة الآلة فقط – في الواقع، إنّ تنفيذ تعليمات لغة الآلة هو الأمر الوحيد الذي تستطيع وحدة المعالجة المركزيّة فعله. يسير الأمر على النّحو الآتي: لكل جهازٍ في النّظام هناك تعريفٌ (device driver) خاصّ به هو عبارةٌ عن برمجيّة تُنفّذها وحدة المعالجة المركزيّة عندما تتعامل مع هذا الجهاز. عادةً ما تكون هناك خطوتان عند تركيب جهازٍ جديد على النظام: توصيل الجهاز فيزيائيًّا مع الحاسوب وتثبيت برمجية التّعريف الخاصّة بهذا الجهاز. يكون الجهاز عديم الجدوى بدون هذا التّعريف نظرًا لأنّ وحدة المعالجة المركزيّة غير قادرةٍ على التّواصل معه بدونه.

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

001OverviewAsy.jpg

تستطيع الأجهزة مثل لوحة المفاتيح، الفأرة، وواجهة الشّبكة أن تُنتج الدّخل الذي ستعالجه وحدة المعالجة المركزيّة. كيف تعرف وحدة المعالجة المركزيّة أنّ البيانات قد وصلت؟ من خلال فكرةٍ بسيطةٍ – وإن كانت غير مُرضِية – وهي أن تقوم وحدة المعالجة المركزيّة بالتّفحص المستمر لوجود بيانات واردة؛ وحالما تجد البيانات، تُعالجها فورًا. ولمّا كانت وحدة المعالجة المركزيّة "تجسّ" أجهزة الدّخل باستمرار لتفقّد ما إذا كان لديها بيانات دخلٍ تريد الإبلاغ عنها، فقد دُعيت هذه العمليّة بالجسّ (polling). لسوء الحظّ، رغم بساطة عمليّة الجسّ إلّا أنّها غير فعالّةٍ أبدًا حيث تُضيع وحدة المعالجة المركزيّة الكثير الكثير من الوقت في انتظار الدّخل فقط.

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

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

تسمح المقاطعات لوحدة المعالجة المركزيّة بالتعامل مع الأحداث غير المتزامنة. في دورة الجلب والتّنفيذ المُنتظمة، تحدث الأشياء بترتيب مُسبق التّحديد؛ كل ما يجري تنفيذه "مُتزامنٌ" مع كل شيء آخر. تُمكّن المقاطعاتُ وحدةَ المعالجة المركزيّة من التعامل بفعاليّة مع الأحداث التي تحدث على نحوٍ "غير متزامن" أو – بكلمات أخرى – في أوقات يتعذّر التّنبؤ بها.

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

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

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

تُدعى كلُّ مهمةٍ فريدة من المهام التي تعمل عليها وحدة المعالجة المركزيّة بالخيط (thread أو العمليّة [Process]) – هناك فروق تقنيّة بين الخيوط والعمليّات لكنّها ليست ذات أهمية هنا على نظرًا لأنّ الخيوط فقط هي المُعتمدة في لغة جافا. تستطيع العديد من وحدات المعالجة المركزيّة تنفيذ أكثر من خيط في آن واحد حقًا. تحتوي وحدات المعالجة المركزيّة كهذه عدّة أنوية (core) تُنفّذ كلّ واحدة منها خيطًا مع العلم أنّ هناك حدًّا عدد الخيوط التي يمكن تنفيذها في آن واحد. ولمّا كان المُرجّح وجود خيوط أكثر ممّا يمكن تنفيذه في آن واحد، ينبغي على الحاسوب نقل التّنفيذ من خيط لآخر تمامًا كما يقوم حاسوب المشاركة الزّمنية بنقل التّنفيذ من مستخدمٍ لآخر. في الحالة العامّة، يستمرُّ الخيط الذي يجري تنفيذه بالعمل حتى يحدث أحد الأمور التّالية:

  • قد يتنازل الخيط طوعًا عن سيطرته على النّواة ليمنح الخيوط الأخرى فرصةَ تنفيذ.
  • قد يضطر الخيط لانتظار حصول حدثٍ غير متزامن. على سبيل المثال، قد يطلب الخيط بعض البيانات من القرص الصّلب أو يضطّر لانتظار أن يضغط المستخدم مفتاحًا. يُقال عن الخيط أثناء انتظاره أنّه محجوب (blocked) وتستطيع الخيوط الأخرى، في حال وجودها، أن تدخل التّنفيذ. عند حصول الحدث، تقوم مقاطعةٌ بإيقاظ الخيط لاستئناف تنفيذه.
  • قد يستنفذ الخيط حصّته الزّمنية المخصّصة ويُعلّق مؤقتًا للسّماح بتنفيذ الخيوط الأخرى. تستطيع معظم الحواسيب تعليق خيطٍ قسريًّا بهذه الطريقة، يقال عندئذٍ أنّ هذه الحواسيب تستخدم تعدّد المهام الشُّفعي (preemptive multitasking). يحتاج الحاسوب للقيام بتعدّد المهام الشُّفعي إلى جهاز مؤقّت زمنيٍ خاص يُولّد مقاطعةً عند فواصل زمنيّة مُنتظمة، 100 مرةٍ في الثّانية مثلًا. عندما تحدث مقاطعة المؤقّت، يتسنّى لوحدة المعالجة المركزيّة الانتقال من خيطٍ إلى آخر بغضّ النّظر عن حالة أو حاجة الخيط الذي يجري تنفيذه. تستخدم جميع الحواسيب الحديثة المكتبيّة منها والمحمولة وحتّى الهواتف الذكيّة والأجهزة اللّوحية تعددَ المهام الشُّفعي.

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

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

وعلى نفس المقدار من الأهميّة، في جافا والبرمجة الحديثة على حدٍّ سواء، نجد مفهوم الأحداث غير المتزامنة. وفي حين لا يضطّر المبرمجون للتّعامل مع المقاطعات مباشرةً، يجدون أنفسهم باستمرار وهم يكتبون معالجات أحداث (Event Handler). تُستدعى معالجات الأحداث، كما معالجات المقاطعات، على نحو غير متزامن عند حصول أحداث معينة. تختلف البرمجة المقادة بالأحداث (event-driven programming) هذه كليًّا عن البرمجة التّزامنيّة المباشرة التّقليديّة. سنبدأ أولًا بالبرمجة التقليدية التي لا تزال مستخدمة في برمجة المهام المفردة، ثمّ سنعود إلى الخيوط والأحداث لاحقًا بدءًا من الفصل 6.

ولأن الشّيء بالشّيء يُذكر، فالبرمجيّة التي تقوم بجميع عمليّات معالجة المقاطعات وتتولّى التّواصل مع المستخدم وأجهزة العتاديّات، كما تضبط أيّ خيط يُسمح بتنفيذه تُدعى بنظام التّشغيل (Operating System). نظام التّشغيل هو البرمجيّة الجوهريّة الأساسيّة التي لا يستطيع الحاسوب أن يعمل بدونها. أمّا البرامج الأخرى، كمعالجات النّصوص ومتصفّحات الويب، فهي معتمدةٌ كليًّا ومنوطةٌ بنظام التشغيل. نذكر من أنظمة التّشغيل الشّائعة للحواسيب لينوكس (Linux)، ويندوز (Windows)، وماك (Mac OS) ومن أنظمة تشغيل الهواتف الذكية والأجهزة اللّوحية آندرويد (Android) و iOS.

ترجمة -وبتصرف- للفصل Asynchronous Events: Polling Loops and Interrupts من الكتاب Introduction to Programming Using Java





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن