العمليات التي يقوم بها الكمبيوتر يمكن تصنيفها إلى نوعين إما Compute و إما IO , الأولى يعني ان العملية تتم بالكامل على معالج الكمبيوتر مثل حساب عملية رياضية , او تنفيذ خوارزمية و النوع الأخر IO هي العمليات التي فيها تواصل مع اجهزة خارجية مثل الشبكة او الهاردسك.
(سلسلة)
(سلسلة)
اللي يهمنا هنا هو النوع الثاني , اللي تحتاجه لما تطلب معلومة من موقع خارجي او لما تستعلم في قاعدة البيانات او حتى لما تكتب او تقرأ من ملف في الهاردسك. عادة هذي العمليات هي اللي تأخذ وقت في الأنظمة.
أي برنامج تكتبه فالويندوز مثلاً يغلفه بداخل Process و هذي الProcess مقسمة لقسمين رئيسين , الUser Mode اللي فيه الStack و الHeap و القسم الاخر الKernel Mode اللي
يديره الويندوز فقط و تكون الThreads فعّاله بداخل هذي الProcess. (هناك تعقيد تخطيته للتبسيط)
يديره الويندوز فقط و تكون الThreads فعّاله بداخل هذي الProcess. (هناك تعقيد تخطيته للتبسيط)
اللي يصير انك لما مثلاً تكتب كود لقراءة ملف بالسي شارب و تستخدم ميثود Read من كلاس FileStream فهذا الميثود من خلال الThread ينادي ميثود ReadFile في مكتبة الWin32 اللي بدوره ينشيء object للطلب يسمى اختصاراً IRP فيه معلومات الطلب مثل اي ملف و من أين و هل للقراءة او للكتابه الخ.
يقوم نفس الThread و يمرر الIRP إلى Kernel Mode اللي يشوف أي جهاز مسؤول عن هذا الطلب و يقوم ايضاً نفس الThread بارساله لذلك الجهاز واللي هو في حالتنا الHarddisk او على الاقل للDriver الخاص به.
الهاردسك نفسه فيه كمبيوتر هو المسؤول عن تشغيله و قراءة البيانات و كتابتها فالويندوز يفوض الهادرسك بهذه العملية و يكون العقد بينهم هو الIRP المرسل. يقوله اقرأ او اكتب من هنا إلى هنا هذه البايتات اللي مكانها من هنا إلى هنا. فيأخذها الهاردسك و يضعها في طابور طويل مع الطلبات الأخرى
اللي يحصل هنا هو انه يصير الThread فاضي ما عنده شغل او يصير له إما Block و ينتظر لحد ما ينتهي الهاردسك و يرد عليه و بعدها يرجع بنفس الطريق و يعيد المعلومة.
هذي العملية تحدث Synchronous اي متزامنة.
هذي العملية تحدث Synchronous اي متزامنة.
الطريقة الثانية هي لما تكون العملية Asynchronous بدل أمر Read السابق بنستخدم امر ReadAsync من نفس الكلاس.
فهنا بينطلق Thread في نفس الرحلة و يوصل الIRP إلى الهاردسك و يرجع مباشرة بدون انتظار و يكمل اعماله الاخرى.
فهنا بينطلق Thread في نفس الرحلة و يوصل الIRP إلى الهاردسك و يرجع مباشرة بدون انتظار و يكمل اعماله الاخرى.
بعد ما يكمل الهادرسك معالجة الIRP بيرسله إلى الThread Pool و هنا يقوم thread اخر بتولي مهمة ارجاع النتيجة و ليس الأول.
الخلاصة: إذا تتعامل مع ملفات او قاعدة بيانات او مع الشبكة استخدم طرق الAsync المتاحة و المناسبة في لغتك.
اما اذا تتعامل مع عمليات حقيقية تحتاج معالجة مثل عمليات حسابية او خوارزميات استخدم الThreads لكن بحذر كما فصلت في السلسلة السابقة.
ننتقل الآن الى Nodejs الذي قادنا إلى هنا.
اما اذا تتعامل مع عمليات حقيقية تحتاج معالجة مثل عمليات حسابية او خوارزميات استخدم الThreads لكن بحذر كما فصلت في السلسلة السابقة.
ننتقل الآن الى Nodejs الذي قادنا إلى هنا.
قلنا ان الV8 يستخدم Thread واحد فقط و بالتالي فجافاسكريبت Single Threaded. و كان لا بد من ايجاد طريقة لجعل جافاسكريبت تقبل اكثر من عمل في نفسا لوقت. المشكلة لا تخص جافاسكريبت فPython نفس المشكلة Julia ايضاً Ruby و لكن تلك اللغات كما نعلم تدعم الMultithreading.
عندما صمم Ryan Dahl و كتب كود nodejs انشأ مكتبة اسمها libuv بلغة C لدعم خاصية الAsynchronous هذه المكتبة هدفها دعم الـ Cross platform بمعنى انها مجرد Layer يكلمها مرة واحدة و يختلف كودها حسب نظام التشغيل.فهي في ويندوز تكلم الIOCP و في لينكس تكلم epoll و في ماك تكلم kqueue .
ايضاً جوليا تستخدم نفس المكتبة ويمكن استخدامها مع روبي و بايثون. بالإضافة ان Ryan Dahl استخدمها ايضاً في Dino
و هو مشروعه بعد nodejs و الذي حاول فيه تفادي اخطاءه التي وقع فيها اثناء تصميم Nodejs. ( انتهى )
طابت اوقاتكم.
و هو مشروعه بعد nodejs و الذي حاول فيه تفادي اخطاءه التي وقع فيها اثناء تصميم Nodejs. ( انتهى )
طابت اوقاتكم.
جاري تحميل الاقتراحات...