Ahmed Aljaberi
Ahmed Aljaberi

@ahmed_aljabri

12 تغريدة 15 قراءة Dec 03, 2021
قبل 1954م ما كان فيه interrupts و كان الكمبيوتر يحتاج يوقف اي عمل لأجل ينتبه لحركة الماوس او ضغطة كيبورد. كان شي اشبه بجملة while(true). الinterrupt كان اختراع عظيم و هذا ما قاله عنه عالم الكمبيوتر ديجكسترا الا انه اضاف انه "صندوق باندورا" اخر - مايقصد اللي في بالك.
( سلسلة )
كان ديجكسترا يلمح لقصة صندوق بندورا في الميثولوجيا الاغريقية حيث اعطوها الالهة كل شيء تحتاجه بالإضافة إلى هدية وهي صندوق "باندورا هدية بالاغريقية - من هنا اتت الكلمة". المهم ابلغوها ان لا تفتحه لكن الفضول او اللقافة جعلتها تفتحه واخرجت الشر للدنيا. لنعود للموضوع الرئيسي.
لو كان هناك حدث ما شاغلك في مكان بعيد و تحتاج انك تعرف عن مستجداته فأمامك طرق: مثلاً انك تتصل بشخص و تفتح مع اتصال مباشر طويل ليخبرك عن المستجدات ( مثل لما تتابع اخبار التلفزيون ) او انك تتصل به كل 5 دقايق و تسأله هل من جديد؟! او طريقة اخرى انك تخبره ان يتصل هو بك عندما يستجد شي.
الطريقة الأخيرة هي طريقة الInterrupts. او المقاطعات .. كأنك تقوله اتصل بي وقاطعني اول ما يكون هناك مستجد لأن لدي اشياء اخرى مهمة لأقوم بها. هذه الطريقة هي الأقل تكلفة بالنسبة لك.
اختراع الInterrupt في الخمسينيات مهد لظهور انظمة التشغيل في الستينيات لانه كان من الصعب ان تبني برنامج يراقب المدخلات وفي نفس الوقت ينتبه لادخالات المستخدم حتى ان الMultitasking لم يأتي الا في اخر الستينيات. اما الMulti-threading ففي التسعينيات و الMulti-processing في الالفينات.
لنعود لمثال التلفزيون. لاحظ ان قناة التلفزيون لا تعرف ماذا يهمك و تنشر publish اخبار عن events لكل من اختار أن يشترك بها Subscribe و لو بالمشاهده. لكن تبقى هناك مشكلة وهي انه مسؤوليتك ان تنتبه لما يهمك اثناء سرد الاخبار. اي تقوم بنفسك بعمل Filtering لما تشاهد او تسمع.
كثير من الانظمة تحتاج لأن تعرف عن احداث في انظمة اخرى. لكن من الصعب ان تستمع لكل الأحداث و تفلترها بنفسك. فبدلاً من ذلك من الأفضل أن تخبر النظام الآخر بما تحتاجه و هو من يقوم هو بالفلترة. مثل ان تخبر شخصاً يعرف مايهمك بأن يتصل بك callback عند كل حدث event.
لكن لحظة!. حتى مع هذا, كيف يعرف الCPU ان هناك حدث اتاه؟ فهو يحتاج لشيء يحل محل الWhile(true) شي يتردد على المكان ليعرف! كصديقك الذي اتصلت به. هنا يأتي دور الHardware Timer و هو على مستوى الدوائر الالكترونية باستخدام حجر الكوارتز. الان هذه مهمة كرت الشبكة حيث انه يحتوي CPU ايضا.
اذا هو ليس شأن البرامج ولا يؤثر على ادائها و ايضاً لأنه الصعب ان تقوم بعملية مراقبة دائماً من خلال while(true) فهذا يستهلك مواردك و لو خصصت شخصاً اخر بهذا الشيء كـ Thread مثلا. فالحلول على مستوى البرنامج هناك Design pattern هو الObserver ( المراقب ) ليخلصك من الWhile(true).
لكن على مستوى الArchitecture هناك الSub/Pub و هو مشتق من الObserver و هو اساس الEvent Driven Architecture. هناك انظمة كثيرة متخصصة توفره مثل Kafka و RabbitMQ و غيرها. و حتى Redis و بعض قواعد البيانات.
ايضاً يمكنك بناءه ايضاً بنفسك ببرتوكولات الشبكة سواء كان TCP او UDP. الثاني اسرع لانه لايحتاج لانشاء اتصال لكن الأضمن استخدام TCP عبر الWebSocket مثلا او باستخدام مكتبات مثل SignalR في دوت نت او غيرها للغات الاخرى. هذا على مستوى الApplication.
على مستوى قواعد البيانات فأغلبها توفره مثل Service Broker في SQL Server او Advanced Queuing في Oracle. في PostgreSQL من خلال LISTEN/NOTIFY و في MySQL ممكن من خلال اضافات مثل Q4M.
- انتهى.

جاري تحميل الاقتراحات...