لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 08/13/22 في كل الموقع
-
الإصدار 1.0.0
62900 تنزيل
لا يخفى على أي متعلم لمجال علوم الحاسوب كثرة الاهتمام بمجال الذكاء الاصطناعي وتعلم الآلة، وكذلك الأمر بالنسبة لمستخدم التقنية العادي الذي بات يرى تطورًا كبيرًا في الآلات والتقنيات التي تحيط به بدءًا من المساعد الصوتي الآلي في جواله وحتى سيارته وبقية الأشياء الذكية المحيطة به. تتوالى الاختراعات والاكتشافات يومًا بعد يوم وتتنافس كبرى الشركات حول من يحرز أكبر تقدم ليخطف الأضواء من غيره. ونظرًا لهذا الاهتمام، ولضعف المحتوى العربي وسطحيته في هذا المجال أيضًا، قررنا توفير مصدر عربي دسم لشرح مجال الذكاء الاصطناعي وتعلم الآلة نظريًا وعمليًا لذا وضعنا فهرس المحتوى آنذاك وبدأنا العمل. هذا الكتاب هو الجزء الأول النظري التأسيسي من أصل جزآن عن الذكاء الاصطناعي وتعلم الآلة، ويبدأ بعرض أهمية الذكاء الاصطناعي وتعلم الآلة عبر الإشارة إلى المشاريع والإنجازات التي قدَّمها هذا المجال إلى البشرية حتى يومنا هذا وكيف أثرت على كل مجالات حياتنا اليومية. ينتقل بعدها إلى لمحة تاريخية عن المجال وكيفية ولادته ومراحل حياته حتى يومنا الحالي. ستجد بعدئذٍ المعلومات الدسمة في الفصل الثالث الذي يشرح المصطلحات المتعلقة بمجال تعلم الآلة ويشرح أساليب تعليم الإنسان للآلة والأسس التي بنيت عليها عمليات تعليم الآلة (منها شرح طرائق تعلم الآلة التقليدية ثم التجميع والتعلم المعزز وحتى الشبكات العصبية والتعلم العميق). يعرض الفصل الأخير تحديات عملية تعليم الآلة وما علاقة البيانات فيها، ثم أخيرًا عرض خارطة طريق لأهم المفاهيم التي يجب أن تتقنها في حال أردت التوسع في المجال وإتقانه. بعد الانتهاء من الجزء الأول في هذا الكتاب وتأسيس المفاهيم والمصطلحات التي يقوم عليها مجال الذكاء الاصطناعي وتعلم الآلة، يمكنك الانتقال إلى الجزء الثاني وهو كتاب عشرة مشاريع عملية عن الذكاء الاصطناعي لبدء تطبيق مشاريع عملية تطبيقية مبنية على بيانات واقعية وتنفيذ أفكار مشاريع من الحياة العملية باستخدام الذكاء الاصطناعي. ساهم بالعمل على هذا الكتاب، محمد لحلح تأليفًا، وجميل بيلوني تحريرًا وإشرافًا، وأخرجه فنيًا فرج الشامي. أرجو أن نكون قد وُفقنَا في هذا العمل لسد ثغرةً كبيرةً في المحتوى العربي -كما خططنا لذلك- الذي يفتقر أشد الافتقار إلى محتوى جيد ورصين في مجال الذكاء الاصطناعي وتعلم الآلة. هذا الكتاب مرخص بموجب رخصة المشاع الإبداعي Creative Commons «نسب المُصنَّف - غير تجاري - الترخيص بالمثل 4.0». يمكنك قراءة فصول الكتاب على شكل مقالات من هذه الصفحة، «الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية»، أو من مباشرةً من الآتي: الفصل الأول: الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية الفصل الثاني: الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها الفصل الثالث: المفاهيم الأساسية لتعلم الآلة الفصل الرابع: تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال1 نقطة -
شفرات جافاسكريبت لا تعمل عندي نهائيا مع ويبباك توقفت الشفرات عن العمل1 نقطة
-
بصراحة يا صديقي عمر 14 صغير للعمل، يعني يعتبر عمر للأطفال (بغض النظر عن الحالة الذهنية و معدل الذكاء و الفطنة) عمر 14 يكون لديك حياة اجتماعية مع أصدقاء من عمرك، تكتشف الحياة و تكون في المدرسة. أنت تعتبر متقدم على عمرك، وترغب في العمل من هذا العمر، بصراحة تحية لك، بالنسبة ادلي أشجعك على عيش المراهقة بصورة عادية لأنه من المبكر عليك البدء في العمل. إن كانت رغبتك بالعمل ولا بد من ذلك، انشر على فيسبوك لديك و أخبر أصدقاءك أنه لديك معرفة في تصميم الواجهات والمواقع و قم بعمل لهم و انشر مشاريعك على حساباتك على مواقع التواصل ليعلم بك المجتمع المحيط، ثم يمكنك الحصول على زبائن من معارفك أو أصدقاء والدك و أقاربك.. تقوم بتصميم مواقع لعملهم و تساعدهم في ذلك، وبالطبع بمقابل مادي مقبول. أنت شاب يافع وذكي و مثابر وهذا جيد جدا، أتمنى أن تجد فرصتك مع التحفظ على ان تعيش حياتك بالتدرج مع أصدقاء مم عمرك أو أكبر بقليل. يوجد متسع من الوقت للعمل عندما تصبح بالغاً، لا أحبذ تحملك لهذه المسؤولية بهذا العمر.1 نقطة
-
1 نقطة
-
هل حاوبت تقديم عروض على مشاريع في مستقل؟ حتى لو بسيطة مثل تعديل تصميم موقع؟1 نقطة
-
قمت بكتابة بعض الإعدادات في الملف config/app.php بالشكل التالي: return [ //... 'author' => 'Emad Saif', 'version' => 'v1.0', //... ] ولكن عندما حاولت إستخدام هذه الإعدادات في ملفات العرض views بالشكل التالي: <footer> <!-- ... --> <div>{{Config::get('author')}} - {{Config::get('version')}}</div> </footer> يظهر يخطأ بسبب أن الدالة Config::get تُعيد null ولا تُعيد قيمة النص الموجود في الملف config/app.php هل يوجد خطأ في الكود الخاص بي؟1 نقطة
-
لدي جدول وأريد تحديث بعض صف واحد في هذا الجدول ببعض البيانات المرسلة ضمن الطلب request، ولهذا قمت بكتابة التالي: public function store(Request $request) { Feature::update($request->id, Request::all()); return redirect('settings.features'); } لكن يظهر الخطأ التالي عندما يعمل الكود السابق: Non-static method Illuminate\Database\Eloquent\Model::update() should not be called statically, assuming $this from incompatible context ما المشكلة في الكود؟ هل يمكن تعديل صف معين في قاعدة البيانات بطريقة مختلفة؟1 نقطة
-
يحدث هذا لأن التابع update تابع غير ثابت، على عكس insert او create مثلا. يجب الاشارة الى انموذج من الصنف Feature لتعديل بياناته فأنت تستهدف عنصرا معينا. فبدل: Feature::update($request->id, Request::all()); للبحث عن "ميزة" معينة وتعديل بياناتها. نستعين بـ find للبحث والاستعلام و update للتحديث والتجاوز: Feature::find($request->id)->update(Request::all()); مقدمة إلى رابط الكائنات بالعلاقات Eloquent1 نقطة
-
أحاول التحقق من صيغة الملف المرفوع في لارافيل Laravel ويجب أن يكون الملف عبارة عن فيديو، لذلك قمت بعمل الكود التالي: $validated = $request->validate([ 'file' => 'mimes:mp4,mov,ogg | max:20480' // ... ]); لكن المشكلة هنا هي أنه يظهر لي يخطأ يخبرني أن الملف يجب أن يكون أحد الأنواع السابقة (mp4,mov,ogg) بالرغم من أن الملف ينتهي بصيغة mov، أعدت الأمر أكثر من مرة ومع أكثر من ملف إلا أن الخطأ مازال موجود. ما سبب المشكلة هنا وكيف أقوم بحلها؟1 نقطة
-
1 نقطة
-
طيب اخي وائل كيف ممكن ان امنعه من ظهور البيانات على شكل json عند الضغط على enter في الادخال1 نقطة
-
مرحبا.. كيف يمكنني التاكد من وجود عنصر في ملف html من عدمه ب لستخدام JavaScript1 نقطة
-
يمكنك فعل ذلك بإستخدام ال dom كالتالي : <h1 id="myElementId"> العنصر الذي نريد التأكد منه </h1> <script> // نستدعي العنصر باستخدام الجافاسكريبت const myElement = document.getElementById("myElementId"); // نتحقق من وجود العنصر if (myElement) { // في حال كان موجود نطبع ان العنصر موجود console.log("my element exists") } else { // وإذا كان غير موجود نطبع انه غير موجود console.log("my element doesn`t exists") } </script>1 نقطة
-
السلام عليكم , لدي استفسار بخصوص الحصول على الشهادة , لقد اتممت اربع مسارات من دورة علوم الحاسوب ثم انتقلت إلى اساسيات دورة تطوير واجهات المستخدم و رأيت في تعليق إحدى الدروس مدرب يوضح لطالب طريقة الحصول على الشهادة , و قال له "يجب الاحتفاظ بالمشاريع العملية الناتجة لإرسالها للمراجعة" , لم افهم ما المشاريع الذي يجب علي حفظها و تقديمها للحصول على الشهادة ؟ , و لماذا لم يذكروا لنا المدربين هذه النقطة في الفيديوهات !! , و شكرًا لكم1 نقطة
-
مرحبا مهند، كل مسار فيه تطبيقات عملية، ينتج عن تطبيقك مع المدرب مشروع وبعض الملفات خاصة به، من المفترض أنك لا تحذف هذه الملفات وتحتفظ بها لتقديمها مع طلب إجراء الامتحان. مهمتها التأكد من أنك قمت بالتطبيق مع المدرب ومراجعة هذه المشاريع. يمكنك التواصل مع مركز المساعدة - أكاديمية حسوب - وطلب إرشادك بكيفية تقديم الملفات مع التقدم للامتحان.1 نقطة
-
نعم، هذا يعيد رد عبارة عن بيانات فقط، إن لم تطلبه بشكل AJAX و تستقبله و تحشره في الصفحة (ضمن success في جيكويري مثلاً)، سيتم عرضه كنص فقط أي بدون HTML1 نقطة
-
اذا اذا كان لدي الاتي المعهد يخاطب الادارة والادارة تخاطب المنطقة والمنطقة تخاطب القطاع والعكس لهم كلهم يتطلب مني انشاء اربع جداول هل يوجد حل اخر او فكرة اخرى1 نقطة
-
ما المشكلة في اعتبار هاته الطلبات نموذج بيانات مثلها مثل اي نموذج آخر؟ حيث ان مدير المدرسة هو من يقوم بإنشاء هاته الطلبات. يمكنك التوصل الى انشاء جدول orders يحوي تفاصيل هذا الطلب (منشئ من طرف، موجه الى المدير الفلاني ، نوع الطلب فيما ان كان طلب عجز، زيادة او شكوى او غيرها). يمكنك ايضا اضافة حقل seen او reviewed يخزن قيمة بوليانية تعبر عن ما ان كان الاطلاع عليه من قبل مدير الادارة. حيث: مدير المدرسة يمكنه انشاء طلبات، يمكنه الوصول الى هاته الطلبات في صفحة ما. مدير الادارة يمكنه الوصول الى الطلبات الموجهة له في صفحة مخصصة. ولنقل ايضا انه يمكنه تغيير حالتها كمقروءة مثلا، او حتى الرد عليها. واسطة كل من هؤلاء العملاء هي قاعدة البيانات، يمكنك الاعتماد على مركزيتها في انشاء اي نموذج بيانات ترغبيه.1 نقطة
-
يخبروك أن البطاقة التعريفية يجب أن تكون بالانكليزية و مطابقة لمعلوماتك التي سجلت بها الحساب في غوغل، تأكد منها. أي اختلاف في الاسم سوف يسبب عدم مطابقة البيانات1 نقطة
-
في توثيق node.js، تختص كل صفحة بشرح كائن معين أو وحدة معينة، وفي بداية كل صفحة من هذه الصفحات يوجد رقم باسم "مؤشر الاستقرار Stability Index"، ويكون له رقم 0 أو 1 أو 2، وكل رقم من هذه الأرقام يُشير إلى حالة هذا الكائن أو الوحدة (المشروحة في الصفحة): صفر 0 : تعني أن هذا الكائن أو الوحدة تم التخلي عنها Deprecated ولا يجب إستعمالها بعد الآن. واحد 1 : تعني أن هذا الكائن أو الوحدة مازال في حالة الإختبار Experimental، ومازل يتم العمل عليها من فرق Node.js وهي قابلة للتغير في المستقبل، لذلك لا يجب الإعتماد عليها في مشاريع حقيقية في الوقت الحالي (إلى أن يتم الإنتهاء من تطويرها). اثنان 2 : تعني أن هذا الكائن أو الوحدة في حالة مستقرة Stable ومتوافقة مع كل أكواد Node.js، ويمكنك الإعتماد عليها في مشاريع حقيقية بدون مشكلة على الإطلاق. يجدر بالذكر أن هذه الأرقام يتم تغيرها حسب حالة الكائن أو الوحدة من حين إلى آخر، وفي الغالب ستريد أن تستعمل الكائنات والوحدات التي لديها مؤشر إستقرار 2 فقط.1 نقطة
-
كل لغة من هذه اللغات لها نقاط قوة ونقاط ضعف، فعلى سبيل المثال لغة PHP تُعد أشهر لغة للواجهات الخلفية Backend وذلك لأنها مُعدة لهذا الأمر في الأساس ومنذ فترة كبيرة لكن لن تستطيع إستعمال هذه اللغة في مجال الذكاء الإصطناعي أو صناعة الألعاب، الأمر ممكن بالتأكيد ولكن قلة مصادر التعلم في هذه المجالات وندرة المكتبات تجعل هذا الأمر أصعب بكثير، بينما لغة مثل Python مستعملة على نطاق واسع في مجال الذكاء الاصطناعي والبيانات الضخمة Big Data وصناعة سكربتات الأتمتة Automation scripts، لذلك عليك أن تحدد ما إذا كنت تريد إستعمال اللغة التي ستتعلمها في مجالات أخرى غير الواجهات الخلفية أم لا. بما أنك مشترك في دورة تطوير واجهات المستخدم، فستجد أن المسار الأول من كل دورة متاح لك لمشاهدته بالكامل، فيمكنك أن تقوم بالمقارنة بين هذه اللغات وتختار اللغة التي تراها مناسبة أكثر لك. أيضًا يمكنك أن تلقي نظرة على هذه المقالة حيث توجد كمقارنة شاملة بين اللغات بايثون و PHP وروبي: المقالة السابقة تحتوي على أهم التقنيات المستخدمة في كل لغة من هذه اللغات، وكذلك أشهر المكتبات وإطارات العمل في كل لغة منهم.1 نقطة
-
مرحبا، لايمكن الحكم على أي شخص فقط عن طريق شهاداته حتى لو كانت جامعية، في مجال البرمجة تبقى الخبرة و المهارات هي العامل الأساسي في التوظيف. بالنسبة لشهادة الأكاديمية، لن تحصل عليها إلا باجتياز الامتحان وهذا يعطيها أفضلية عن دورات أخرى. طبيعة الامتحان بعد اتمامك للدورة، سيكون عليك التواصل معنا من خلال مركز مساعدة حسوب لتحديد موعد امتحان وسيكون على الشكل التالي: اجراء محادثة صوتيّة لمدة 30 دقيقة يطرح المدرّب عليك أسئلة متعلّقة بالدورة والأمور التي نفّذتها خلالها. يحدد لك المدرّب مشروعًا مرتبطًا بما قمت به أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع الى أسبوعين. اجراء محادثة صوتيّة أخرى لمدّة 30 دقيقة يناقش بها مشروعك وما نفذته وتطرح أسئلة خلالها. ان سارت على جميع الخطوات السابقة بشكل صحيح، تحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل معنا من جديد. بعد الانتهاء من الدورة، يمكنك البدء بتقديم عروض العمل على منصات العمل الحر مثل مستقل للفترة الأولى لتكتسب بعض الخبرة، ثم بعد فترة تقوم بالتقديم على الشركات في حال أحببت ذلك مع تقديم جميع الأعمال التي قمت بها خلال الدورة و المشاريع الخاصة. بعد اجتيازك الامتحان ستتم المتابعة معك خطوة بخطوة وتوضيح جميع الطرق التي ستسلكها للحصول على عمل. حيث أحد البنود التي توفرها لك الأكاديمية عند شرائك دورة هو: إرشاد وتوجيه أثناء فترة بحثك عن عمل: هذا هو الهدف الأساسي لجميع دورات أكاديميّة حسوب. بعد إتمامك للدورة سيتم الإطّلاع على سيرتك الذاتية من قبل المختصّين لدينا وتقديم ارشادات مخصّصة لك لتحسينها وكذلك على ملفّك الشخصي في مواقع العمل الحر. بالتوفيق1 نقطة
-
يتضمن المعالج نوى متعددة في العديد من الحواسيب الحالية وهذا يعني أنه يستطيع تشغيل عدة عمليات في نفس الوقت، وكل نواةٍ لديها القدرة على القيام بتعدد المهام (multitasking) أي يمكنها التبديل من عملية لعمليةٍ أخرى بسرعة، وبذلك تخلق وهمًا بوجود عدة عمليات مُشغَّلة في الوقت ذاته. يسمى جزء نظام التشغيل الذي يطبّق تعدد المهام بالنواة (kernel) وهي الجزء الأعمق في نظام التشغيل وتكون محاطةً بالصدفة (shell) سواء كان نظام تشغيل يشبه الجوزة (nut) أو البذرة (seed)، فالنواة (kernel) هي المستوى الأدنى من البرمجيات (software) في نظام التشغيل وتكون هذه النواة محاطةً بطبقات أخرى متعددة، وإحدى هذه الطبقات واجهةٌ (interface) تسمى صدفة (shell) حيث تلاحظ أن الاختصاصيين في علوم الحاسوب يحبون الاستعارات (metaphors). عمل النواة الأساسي هو معالجة المقاطعات، والمقاطعة هي الحدث الذي يوقِف دورة التعليمة (instruction cycle) القياسية ويسبب قفز تدفق التنفيذ (flow of execution) إلى جزءٍ خاص من الشيفرة يدعى معالج المقاطعة (interrupt handler). للمقاطعة نوعان هما: مقاطعة عتادية (hardware interrupt) ومقاطعة برمجية (software interrupt)، حيث تحدث المقاطعة العتادية (hardware interrupt) عندما يرسل جهازٌ ما إشارات إلى المعالج مثل تسبُّب واجهة الشبكة (network interface) بحدوث مقاطعة عند وصول حزمة بيانات (packet of data) أو مثل المقاطعة التي يسببها القرص الصلب (disk drive) عند اكتمال عملية نقل البيانات، وتحوي معظم الأنظمة مؤقتات (timers) تسبِّب مقاطعات عند الفواصل الزمنية المنتظمة (regular intervals) أو بعد انتهاء الوقت المستغرَق (elapsed time). تحدث المقاطعة البرمجية (software interrupt) بسبب برنامجٍ قيد التشغيل مثل عدم اكتمال تعليمةٍ لسببٍ ما، فتُنبّه هذه التعليمة مقاطعةً وبالتالي يعالج نظام التشغيل الشرط الخاص بالعملية المُقاطَعة، حيث تُعالَج أخطاء الأعداد العشرية (floating-point errors) مثل خطأ القسمة على صفر (division by zero) باستخدام المقاطعات. ينشئ برنامج استدعاء نظام (system call) عندما يريد هذا البرنامج الوصول إلى جهاز عتادي، ويشبه استدعاءُ النظام استدعاءَ دالةٍ ولكن بدلًا من القفز إلى بداية الدالة ينفّذ استدعاءُ النظام تعليمةً خاصة، وتنبّهُ هذه التعليمة مقاطعةً مسببةً قفز تدفق التنفيذ إلى النواة، ثم تقرأ النواة معامِلات استدعاء النظام وتجري العمليات المطلوبة ثم تستأنف العملية المُقاطَعة. حالة العتاد (Hardware state) تتطلب معالجة المقاطعات تعاونًا بين العتاد والبرمجيات، حيث من الممكن وجود تعليمات متعددة قيد التشغيل ضمن المعالج (CPU) وبيانات مُخزَّنة في المسجلات بالإضافة إلى حالة عتادٍ (hardware state) أخرى عند حدوث مقاطعة. يكون العتاد عادةً مسؤولًا عن وصول المعالج إلى حالة الاستقرار (consistent state) فيجب أن تكتمل كل تعليمة أو أن تتصرف كأنها لم تبدأ من الأساس أي لا وجود لتعليمةٍ نصفها مكتملٌ على سبيل المثال، والعتاد مسؤولٌ أيضًا عن حفظ عدّاد البرنامج (program counter) ويختصر إلى PC الذي تستخدمه النواة (kernel) لتعرف من أين ستستأنف تنفيذ التعليمات، ثم يستلم معالج المقاطعة (interrupt handler) مسؤولية حفظ بقية حالة العتاد قبل أن يقوم بأي شيء آخر يعدّل حالة العتاد هذه ثم يستعيد حالة العتاد المحفوظة سابقًا قبل استئناف العملية المُقاطعَة، حيث يمكن اختصار سلسلة الأحداث السابقة كما يلي: يحفظ العتاد عدّاد البرنامج في مسجّلٍ خاص عند حدوث المقاطعة ثم يقفز العتاد إلى معالج المقاطعة المناسب. ثم يخزّن معالجُ المقاطعة عدادَ البرامج وحالة المسجل (status register) في الذاكرة إلى جانب محتويات مسجلات البيانات التي من المُخطَّط استخدامها. ثم يُشغّل معالج المقاطعة الشيفرة المطلوبة لمعالجة هذه المقاطعة. يستعيد معالج المقاطعة محتويات المسجلات التي خزّنها سابقًا ثم أخيرًا يستعيد عداد البرنامج للعملية المقاطعة وهذا يؤدّي إلى العودة إلى التعليمة المُقاطَعة. إذا استخدِمت هذه الآلية بصورة صحيحة فلا يمكن أن تعلم العملية المقاطَعة بحدوث المقاطعة أبدًا إلّا إذا اكتشفت تغيّرًا في الوقت الفاصل بين التعليمات. تبديل السياق (Context switching) يمكن أن تكون معالجات المقاطعة سريعةً لأنها غير ملزمةٍ بحفظ كامل حالة العتاد وإنما تحفظ المسجلات التي من المخطط استخدامها فقط، ولكن لا تستأنف النواةُ العمليةَ المقاطعة دائمًا عند حدوث مقاطعةٍ ما وبالتالي يكون للنواة حرية التبديل إلى عملية أخرى، وتدعى هذه الآلية بتبديل السياق (context switch). لا تعلم النواة أيّ مسجلات ستستخدمها العملية لذلك يجب أن تحفظ كل المسجلات، ويجب على النواة تصفير البيانات المخزنة في وحدة إدارة الذاكرة (memory management unit) عند التبديل إلى عملية جديدة، حيث يمكن أن يستغرق تحميل بيانات العملية الجديدة إلى الذاكرة المخبئية بعض الوقت بعد تبديل السياق إليها لذلك يكون تبديل السياق بطيئًا نسبيًا فقد يستغرق آلاف الدورات أو عدة ميكرو ثانية. يُسمَح لكل عملية في نظام متعدد المهام أن تُشغَّل لفترة زمنية قصيرة تدعى بشريحة زمنية (time slice) أو حصّة (quantum)، وتضبط النواة مؤقت العتاد (hardware timer) خلال عملية تبديل السياق، وهذا يسبب حدوث مقاطعة عند نهاية الشريحة الزمنية، وبالتالي تستطيع النواة عند حدوث مقاطعةٍ التبديلَ إلى عملية أخرى أو السماح للعملية المقاطَعة أن تستأنف عملها، وجزء نظام التشغيل الذي يقرّر اختيار أحد هذين الخيارين هو المجدول (scheduler). دورة حياة العملية (The process life cycle) يخصص نظام التشغيل للعملية عند إنشائها بنية بيانات تتضمن معلومات عن هذه العملية وتدعى بينة البيانات هذه بكتلة تحكم العملية (process control block) وتختصر إلى PCB التي تتتبّع حالة العملية (process state)، ويكون للعملية أربع حالات هي: التنفيذ (Running): عند تنفيذ العملية ضمن النواة (core). الاستعداد (Ready): عندما تكون العملية جاهزة للتنفيذ ولكنها لا تُنفَّذ ويجب عليها الانتظار لأن عدد العمليات القابلة للتنفيذ أكبر من عدد الأنوية (cores). الإيقاف (Blocked): إذا كان غير ممكن أن تُنفَّذ العملية لأنها تنتظر حدثًا مستقبليًا مثل اتصال شبكة أو قراءة من القرص الصلب. الاكتمال (Done): إذا اكتمل تنفيذ العملية ولكنها تملك معلومات حالة المغادرة (exit status information) التي لم تُقرَأ بعد. الأحداث التي تسبب انتقال العملية من حالة إلى أخرى هي: تُنشَأ العملية عندما ينفّذ البرنامج المُشغَّل استدعاء نظام مثل fork، حيث تصبح العملية المنشَأة أو الجديدة في نهاية استدعاء النظام في حالة الاستعداد ثم قد يستأنف المجدول العملية الأصلية التي تسمى العملية الأب (parent) أو يبتدئ المجدول العملية الجديدة التي تسمى العملية الابن (child). تتغير حالة العملية من حالة الاستعداد إلى حالة التنفيذ عندما يبتدئها المجدول أو يستأنفها. تتغير حالة العملية من حالة التنفيذ إلى الاستعداد عندما تُقاطَع العملية ويختار المجدول ألا يستأنفها. إذا نفّذت العملية استدعاء النظام الذي لا يكتمل على الفور وإنما يحتاج وقتًا مثل الطلب من القرص الصلب فتصبح العملية بحالة الإيقاف وعندها يختار المجدول عمليةً أخرى لتنفيذها. إذا اكتملت عمليةٌ ما مثل عملية طلب من القرص الصلب فإنها تسبب مقاطعة، ويحدد معالج المقاطعة العملية المنتظرة لعملية الطلب هذه ويبدّل حالتها من حالة الإيقاف إلى الاستعداد ثم يختار المجدول أن يستأنفها أم لا. إذا استدعت العملية الدالة exit فإن معالج المقاطعة يخزّن شيفرة المغادرة (exit code) في كتلة تحكم العملية (PCB) ثم يغير حالة العملية إلى حالة الاكتمال. الجدولة (Scheduling) من الممكن وجود مئات العمليات على الحاسوب ولكن معظمها في حالة إيقاف (blocked) ويكون عدد قليل منها في حالة استعداد أو تنفيذ، والمجدول هو الذي يقرر أية عمليةٍ تبدأ التنفيذ أو تستأنف عملها عند حدوث مقاطعة. هدف المجدول الرئيسي هو تقليل وقت الاستجابة (response time) قدر الإمكان على الحاسوب المحمول (laptop) أو على محطة العمل (workstation)، حيث يجب أن يستجيب الحاسوب بسرعة لإجراءات المستخدم. وقت الاستجابة مهمٌ أيضًا في المخدمات (servers) بالإضافة إلى أنه يجب على المجدول زيادة الإنتاجية (throughput) والتي هي عدد الطلبات المنجزة خلال واحدة الزمن، وفي الحقيقة لا يملك المجدول معلومات كثيرة عمّا تفعله العمليات لذلك تعتمد قراراته في اختيار العملية على عدة استنتاجات هي: يمكن أن تكون العمليات محدودةً بموارد مختلفة، فالعملية التي تقوم بعمليات حسابية كثيرة محدودةٌ بالمعالج (CPU-bound) أي أن وقت تشغيل هذه العملية يعتمد على كمية الوقت الذي تأخذه من وقت المعالج، أما العملية التي تقرأ بيانات من الشبكة أو من القرص الصلب فتكون محدودةً بعمليات الإدخال والإخراج (I/O-bound) أي تكون هذه العملية أسرع إذا كان إدخال أو إخراج البيانات أسرع، ولكنها لن تنفّذ أسرع إذا كان وقت المعالج الخاص بها أكبر، ويمكن أن تكون العملية التي تتفاعل مع المستخدم في حالة الإيقاف حيث ستبقى منتظرةً إجراءات المستخدم معظم الوقت. يصنّف نظام التشغيل العمليات أحيانًا تبعًا لسلوكها السابق ويجدولها بناءً على ذلك، فمن المحتمل أن تنفّذ العملية التفاعلية (interactive process) مباشرةً عندما تنتهي من حالة الإيقاف لأن المستخدم ينتظر ردًا منها، بينما تكون العملية المحدودة بالمعالج (CPU-bound) والتي ما زالت تنفّذ منذ مدة طويلة أقلَّ حساسيةً لعامل الوقت. إذا كان من المحتمل أن تُشغَّل العملية لفترة قصيرة ثم تطلب شيئًا يجعلها في حالة إيقاف، فيمكن أن تُشغَّل على الفور لسببين هما: (1) إذا استغرق الطلب بعض الوقت لإكماله فيجب أن يبدأ في أقرب وقت ممكن، و (2) من الأفضل أن تنتظر عملية ذات وقت تنفيذ طويل لفترةٍ قصيرة وليس العكس، بصورة مشابهة افترض أنك تصنع فطيرة تفاح، حيث يستغرق تحضير الطبقة الخارجية للفطيرة 5 دقائق ولكن يجب تركها لتبرد لمدة نصف ساعة ويستغرق تحضير حشوة الفطيرة 20 دقيقة، فإذا حضّرت الطبقة الخارجية أولًا فيمكنك تحضير الحشوة ريثما تبرد الطبقة الخارجية وبالتالي تنهي تحضير الفطيرة خلال 35 دقيقة، أما إذا حضّرت الحشوة أولًا فيستغرق تحضير الفطيرة 55 دقيقة. تستخدم معظم المجدولات بعض نماذج الجدولة المعتمدة على الأولوية (priority-based scheduling)، حيث يكون لكل عملية أولوية تزيد أو تنقص خلال الوقت ويختار المجدول العملية القابلة للتنفيذ ذات الأولوية العليا، وهناك عدة عوامل لتحديد أولوية العملية هي: تبدأ العملية عادةً برقم أولوية عالٍ نسبيًا لذلك تبدأ التنفيذ بسرعة. إذا طلبت العملية شيئًا ما جعلها في حالة إيقاف قبل انتهاء شريحتها الزمنية ضمن المعالج فمن المحتمل أن تكون عملية تفاعلية مع المستخدم (interactive) أو عملية محدودة بعمليات الإدخال والإخراج (I/O-bound) لذلك يجب أن تصبح أولويتها أعلى. إذا انتهت الشريحة الزمنية الخاصة بالعملية ضمن المعالج ولم ينتهِ تنفيذ هذه العملية فمن المحتمل أن تكون عملية ذات وقت تنفيذ طويل (long-running) ومحدودة بالمعالج (CPU-bound) لذلك يجب أن تصبح أولويتها أقل. إذا توقفت مهمةٌ لمدة طويلة ثم أصبحت بحالة استعداد فيجب أن تحصل على زيادة في الأولوية لتتمكن من الاستجابة على الشيء الذي انتظرته. إذا توقفت العملية A بسبب انتظارها للعملية B وهاتان العمليتان مرتبطتان عن طريق أنبوب (pipe) مثلًا فيجب أن تصبح أولوية العملية B أعلى. يسمح استدعاء النظام nice للعملية بتقليل أولويتها (ولا تسمح بزيادتها) مما يسمح للمبرمجين بتمرير معلومات محددة إلى المجدول. لا تؤثر خوازرميات الجدولة (scheduling algorithms) كثيرًا على أداء معظم أنظمة التشغيل التي تعمل بأحمال (workloads) عادية فسياسات الجدولة (scheduling policies) البسيطة جيدة كفاية لهذه الأنظمة. الجدولة في الوقت الحقيقي (Real-time scheduling) الجدولة مهمةٌ جدًا بالنسبة للبرامج التي تتفاعل مع العالم الحقيقي، فقد يضطر البرنامج الذي يقرأ بيانات من الحسّاسات (sensors) والذي يتحكم بالمحركات إلى إكمال المهام المتكررة بالحد الأدنى من التكرار وأن يتفاعل مع الأحداث الخارجية بالحد الأقصى من وقت الاستجابة. يُعبّر عن هذه المتطلبات بالمهام التي يجب إكمالها قبل المواعيد النهائية (deadlines). تدعى جدولة المهام من أجل الوفاء بالمواعيد النهائية بالجدولة في الوقت الحقيقي (real-time scheduling)، ويمكن تعديل أنظمة التشغيل التي تستخدم للأغراض العامة مثل Linux لتتعامل مع الجدولة في الوقت الحقيقي بالنسبة لبعض التطبيقات، وقد تشمل هذه التعديلات ما يلي: توفير واجهات برمجة تطبيقات (APIs) أثرى للتحكم في أولويات المهام. تعديل المجدول لضمان تشغيل العملية ذات الأولوية الأعلى خلال مدة زمنية محددة. إعادة تنظيم معالجات المقاطعة لضمان أكبر وقت لاكتمال العمليات. تعديل الأقفال (locks) وآليات المزامنة الأخرى (synchronization mechanisms) (سنتطرق إليها لاحقًا) للسماح لمهمة ذات أولوية عالية أن تسبق مهمة ذات أولوية أقل. اختيار تطبيق تخصيص الذاكرة الديناميكي الذي يضمن أكبر وقت لاكتمال العمليات. توفر أنظمة التشغيل في الوقت الحقيقي (real-time operating systems) إمكانيات متخصصة بالنسبة للتطبيقات الأكثر طلبًا وخاصة في المجالات التي تمثل فيها الاستجابة في الوقت الحقيقي مسألةَ حياة أو موت، وتكون هذه الأنظمة ذات تصميم أبسط بكثير من أنظمة التشغيل ذات الأغراض العامة. ترجمة -وبتصرّف- للفصل Multitasking من كتاب Think OS A Brief Introduction to Operating Systems1 نقطة
-
عليك أنّ تدرك أنّه لا يوجد ما يُسمى "أفضل طريقة"، الطرق كثيرة وعليك اكتشاف الطريقة الّتي تُناسبك، ولكن بعد تعلّم الأساسيات، سواء بقراءة الكتب أو مُتابعة دورة ما، عليك مُتابعة التعلّم بالتطبيق العمليّ، وهو ما يُسمى Learn by doing.عندما يكون لديك هدف في تعلّم البرمجة، مثلًا لديك فكرة تطبيق أوفكرة موقع وتريد تطبيقها، سيكون ذلك حافزًا قويًا جدًا لك للمُتابعة.اللغة الإنكليزية لا مَفر منها خصوصًا في المرحلة المتوسطة والمُتقدمة، وليس من المُفترض أنّ تكون "بلبلًا" كل ما عليك أنّ تعرفه هو الأساسيات والباقي ترجمة -الجميع يفعل ذلك على الأقل في البداية-فأنت لا تقرأ كتابًا أدبيًا، والكتب التقنيّة أسهل بكثير.أبتعد عن المُقارنات بين لغات البرمجة ولا تلتفت إليها أبدًا، وعندما تقرأ عنوان "لغة x بطيئة" فهذا إشارة لك لكي تُغلق الموضوع على الفور، وضع في بالك أنّه عندما تتعلّم أي لغة فأنت تتعلم أساسيات باقي اللغات، وعليه اختر اللغة الّتي تُناسب رغبتك وميولك.النقطة الأخيرة وهي أهم نقطة في رأي، في مرحلة ما خلال تعلمك وبعد تعلّم الأساسيات، سوف تصل إلى نقطة تظن بها أنّ البرمجة أمرًا صعبًا وهو مجال ليس لك، هذه المرحلة بالذات إنّ تجاوزتها فاعتبر نفسك مُبرمجًا.1 نقطة