OOZOU
تواصلوا معنا
العودة إلى المدونة

فهم تطبيقات OTP في Elixir، الجزء 3: الوقت الفعلي (المرن)

أستعرض في هذه السلسلة القصيرة المبادئ الأساسية للغتي Erlang وElixir واحدًا تلو الآخر. وفي هذا المقال أناقش لماذا تُعدّ Elixir لغة تعمل في الوقت الفعلي المرن (soft real-time)

1 يناير 2021
5 دقائق للقراءة
فهم تطبيقات OTP في Elixir، الجزء 3: الوقت الفعلي (المرن)

ناقشت في المقال السابق كيف تتعامل Elixir مع تحمّل الأعطال. والآن سنستعرض الأسباب التي تجعل Erlang وElixir تُعدّان لغتين تعملان في الوقت الفعلي، والآليات التي تمنحهما هذه القدرة.

ما لغة الوقت الفعلي؟

تعرّفها Wikipedia كما يلي:

يجب أن تضمن برامج الوقت الفعلي الاستجابة ضمن قيود زمنية محددة، يُشار إليها غالبًا باسم "المواعيد النهائية" (deadlines)

في نظام الوقت الفعلي الصارم (hard real-time)، يعني تفويت موعد نهائي واحد فشل النظام بالكامل. أما نظام الوقت الفعلي المرن (soft real-time) فيستطيع أن يضمن الالتزام بمجموعة فرعية من المواعيد النهائية، مع تحسينها بحسب كل نظام. فمثلًا، تُضمن جميع العمليات التي لا تتضمن إدخالًا وإخراجًا (IO) ضمن الموعد النهائي، بينما قد لا تُضمن عمليات IO. من المهم ملاحظة أن الوقت الفعلي لا يعني السرعة. قد يكون النظام سريعًا، لكن السرعة ليست شرطًا. يشير الوقت الفعلي إلى موثوقية الاستجابة ضمن إطار زمني معين. يجب أن يكون النظام قابلًا للتنبؤ. فإذا كان الموعد النهائي سنة واحدة وأعدنا الاستجابة خلال أسبوع واحد، فالنظام يعمل في الوقت الفعلي.

لماذا تُعدّ Erlang لغة وقت فعلي؟

فهم نشأة Erlang يساعد على تفسير قرارات التصميم التي اتُّخذت في اللغة. صُمّمت Erlang لبرمجة مقاسم الهاتف. أراد مصمموها استجابات بأجزاء من الثانية، والأهم أنهم أرادوها ثابتة. ولم يريدوا أن تعطّل العمليات الحسابية الطويلة عملياتٍ أخرى يمكن حسابها بشكل أسرع. وكما رأينا في المقال السابق، إذا فشلت عملية أو فوّتت موعدًا نهائيًا، تُعاد محاولتها. ولهذا تُعدّ Erlang لغة وقت فعلي مرن. فهي لا تحاول أن تكون خالية من الأعطال تمامًا، بل متحمّلة لها فقط. باختصار، صُمّمت Erlang للتعامل مع عدد كبير من العمليات طويلة العمر لكنها خاملة، فمثلًا تبدأ مكالمة، ثم ينتظر النظام انتهاءها. وأحيانًا تستهلك عملية ما قدرًا أكبر من المعالجة، لكنها لا تعطّل العمليات الأخرى. هذا النمط من الأنظمة يناسب تمامًا تطبيقات أخرى مثل خوادم الويب متعددة الإرسال (multiplexing). فآلة BEAM قادرة على التبديل السريع بين السياقات (context switching)، والإنشاء السريع للعمليات، والتمرير السريع للرسائل. والعمليات معزولة وغير معطِّلة (non-blocking). وهذا مثالي لـ web-sockets أو للأعداد الكبيرة من الطلبات المتزامنة، أو لكليهما.

ما قرارات التصميم التي تساعد Erlang على تحقيق متطلبات الوقت الفعلي؟

إدارة الذاكرة: في معظم اللغات، توقف عملية جمع المهملات (garbage collection) النظام بأكمله مؤقتًا. وفي الأنظمة التي تعمل لفترات طويلة، قد يؤدي ذلك إلى توقف العمليات المتزامنة حين تنفد الذاكرة. تتبع BEAM نهجًا مختلفًا. فلكل عملية heap خاص بها في الذاكرة يمكن جمع مهملاته على حدة، بمعزل تام عن جميع العمليات الأخرى. وهذا لا يمنع جمع المهملات من تعطيل جميع العمليات فحسب، بل يجعل دورات جمع المهملات أسرع بكثير أيضًا، لأن كل heap أصغر بكثير. تنقسم البيانات في هذه الـ heaps الخاصة إلى جيلين: جيل شاب وجيل قديم. الجيل الشاب هو البيانات التي أُنشئت منذ آخر دورة لجمع المهملات. والجيل القديم هو البيانات التي نجت من آخر دورة لجمع المهملات. يعمل GC (جمع المهملات) في كل مرة يتجاوز فيها حجم الـ heap إعداد min_heap_size. وإذا لم تصل عملية قصيرة العمر إلى min_heap_size، فلن يعمل GC لتلك العملية أبدًا. يعمل GC بنمطين: المسح الكامل (full sweep) وجمع المهملات حسب الأجيال (generational). يفحص المسح الكامل عناصر الجيلين الشاب والقديم. أما جمع المهملات حسب الأجيال فيفحص الجيل الشاب، ويجمع ما يمكن التخلص منه، ثم ينقل العناصر المتبقية إلى الـ heap القديم. في كل مرة يصل فيها حجم الـ heap إلى min_heap_size، يُنفَّذ مسح حسب الأجيال. وإذا تجاوز الـ heap الحد الذي يضبطه spawn_opt(fun(),[{fullsweep_after, N}]). تحدد هذه الدالة عدد دورات جمع مهملات الجيل الشاب التي يجب تنفيذها قبل تشغيل مسح كامل آخر. وإذا لم يتمكن GC من تحرير مساحة كافية، يزداد حجم الـ heap تلقائيًا. الجدولة في الوقت الفعلي: تستخدم آلة BEAM الافتراضية مجدولًا استباقيًا (preemptive scheduler)، أي أن كل عملية تُمنح قدرًا صغيرًا من وقت المعالج من دون تعاونها، فالمجدول مثلًا لا يستأذن قبل إيقاف مهمة لاستئناف المهمة التالية أو بدئها. يبدّل المجدول بين السياقات باستمرار، ويستأنف العمليات واحدة تلو الأخرى. وهذا يسمح لجميع العمليات بمواصلة العمل حتى حين تحتاج إحداها إلى عدد كبير من دورات المعالج. ومع أن المجدول لا يتطلب تعاون المهام، فإنه يجدولها انتقائيًا بحسب الأولوية. ويمكن تحديد الأولوية عند إنشاء العملية باستخدام الدالة erlang:process_flag/2. توضع العملية في الطابور، ثم يختار المجدول العملية التي سيستأنفها بحسب الأولوية. ومن العوامل الأخرى في الجدولة ما يُعرف بالاختزالات (Reductions). الاختزال عدّاد يزداد في كل مرة تُستدعى فيها دالة. وهو تقدير لمقدار وقت المعالج المستهلك. يمكن للعملية أن تسجّل وقت نظام التشغيل، لكن ذلك مكلف، لذا فالاختزال تقريب أسرع. في كل مرة تُستأنف فيها عملية، تُمنح "ميزانية" من الاختزالات قدرها 2000. وحين تُنفَّذ 2000 عملية اختزال، يُجري المجدول التبديل التالي بين السياقات.

الخلاصة

بفضل هذه الآليات، تتميز Erlang وElixir بقابلية عالية للتنبؤ. وهذا يتيح لنا بناء أنظمة موثوقة وقابلة للتوسّع. وفي العادة لا تحتاجون إلى معرفة الكثير عن طريقة عمل ذلك عند استخدام Elixir، لأن كثيرًا منه يُدار نيابةً عنكم.

سنلقي نظرة في الحلقة القادمة على قدرة Elixir على استبدال الكود أثناء التشغيل (hot-swap).

Related Articles

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

تصميم البرمجيات عملية ممتعة لكنها معقدة، تتطلب الإبداع والتفكير المنطقي ومهارات حل المشكلات.

اقرأوا المزيد
مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

يتطور المشهد الرقمي بسرعة، وعلى الشركات أن تتكيّف لتواكب الطلب المتزايد على السرعة والكفاءة والمعالجة في الوقت الفعلي.

اقرأوا المزيد
مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

يتطور قطاع التجزئة بوتيرة غير مسبوقة بفضل الذكاء الاصطناعي (AI) والواقع المعزّز (AR) وتقنيات التحوّل الرقمي. فلم تعد المتاجر التقليدية مجرد أماكن لبيع المنتجات، بل أصبحت متاجر ذكية وتفاعلية.

اقرأوا المزيد

Have a Project in Mind?

Let's discuss how we can help bring your ideas to life with our expertise in web and mobile development.

ابدأوا المحادثةhello@oozou.com
OOZOU Logo

بانكوك · سنغافورة · هونغ كونغ

X
Facebook
Instagram
LinkedIn
OOZOU Co., Ltd.
548 One City Centre
Ploenchit Road
Bangkok 10330
Thailand
+66 2544 0000
hello@oozou.com

الخدمات

  • تطوير الويب
  • وكلاء الذكاء الاصطناعي والذكاء الاصطناعي التوليدي
  • تطوير تطبيقات الجوال
  • تحليلات البيانات وهندستها
  • تصميم تجربة المستخدم وواجهته (UX/UI) وتصميم المنتجات
  • التحوّل الرقمي

الشركة

  • من نحن
  • الوظائف
  • المدونة
  • دراسات الحالة
  • عروض حية
  • تعلّمت اليوم
  • تواصل معنا

المزيد

  • القطاعات
  • شبكة الشركاء
© 2026 OOZOU. جميع الحقوق محفوظة.
سياسة الخصوصيةمدونة قواعد السلوكسياسة مكافحة الرشوة والفساد