أنظمة التشغيل: ثلاث قطع سهلة. الجزء 2: التجريد: العملية (الترجمة)

مقدمة في أنظمة التشغيل


مرحبا يا هبر! أود أن ألفت انتباهكم إلى سلسلة من المقالات المترجمة لأدب واحد مثير للاهتمام في رأيي - OSTEP. تناقش هذه المقالة بعمق أعمال أنظمة التشغيل المشابهة لنظام التشغيل يونكس ، أي العمل مع العمليات ، وجداول المواعيد المختلفة ، والذاكرة ، والمكونات المماثلة الأخرى التي تشكل نظام التشغيل الحديث. الأصلي لجميع المواد التي يمكنك أن ترى هنا . يرجى ملاحظة أن الترجمة تمت بدون احتراف (بحرية تامة) ، لكن آمل أن أحتفظ بالمعنى العام.

يمكن العثور على العمل المختبري حول هذا الموضوع هنا:

أجزاء أخرى:

ويمكنك إلقاء نظرة على قناتي في برقية =)


النظر في التجريد الأكثر جوهرية أن نظام التشغيل يوفر للمستخدمين: عملية. تحديد عملية بسيطة للغاية - إنه برنامج عمل . البرنامج نفسه هو شيء هامشي موجود على القرص - إنه عبارة عن مجموعة من الإرشادات وربما نوع من البيانات الثابتة في انتظار إطلاقها. إنه نظام التشغيل الذي يأخذ هذه البايتات ويقوم بتشغيلها ، مما يحول البرنامج إلى شيء مفيد.
في أغلب الأحيان ، يريد المستخدمون تشغيل أكثر من برنامج واحد في المرة الواحدة ، على سبيل المثال ، يمكنك تشغيل متصفح ولعبة ومشغل وسائط ومحرر نص وما شابه ذلك على الكمبيوتر المحمول. في الواقع ، يمكن لنظام نموذجي تشغيل عشرات ومئات العمليات في وقت واحد. هذه الحقيقة تجعل النظام أسهل في الاستخدام ، ولا داعي للقلق بشأن ما إذا كانت وحدة المعالجة المركزية مجانية ، فأنت تقوم فقط بتشغيل البرامج.

هذا يثير المشكلة: كيفية توفير الوهم من وحدات المعالجة المركزية متعددة؟ كيف يخلق نظام التشغيل وهم كمية لا حصر لها تقريبًا من وحدات المعالجة المركزية ، حتى لو كان لديك وحدة معالجة فعلية واحدة فقط؟

يخلق نظام التشغيل هذا الوهم من خلال وحدة المعالجة المركزية الافتراضية. من خلال بدء عملية ما ، ثم إيقافها ، وبدء عملية أخرى ، وهكذا ، يمكن لنظام التشغيل أن يدعم الوهم بوجود العديد من وحدات المعالجة المركزية الافتراضية ، على الرغم من أنها في الواقع ستكون معالجات فعلية واحدة أو أكثر. هذه التقنية تسمى مشاركة وقت وحدة المعالجة المركزية . تسمح هذه التقنية للمستخدمين بتشغيل أكبر عدد ممكن من العمليات في وقت واحد كما يحلو لهم. تكلفة مثل هذا الحل هي الأداء - لأنه إذا تمت مشاركة وحدة المعالجة المركزية بواسطة عدة عمليات ، فستتم معالجة كل عملية على نحو أبطأ.
لتنفيذ المحاكاة الافتراضية لوحدة المعالجة المركزية ، وخاصة للقيام بذلك بشكل جيد ، يحتاج نظام التشغيل إلى دعم منخفض المستوى وعالي المستوى. يُسمى الدعم ذو المستوى المنخفض الآليات - وهي طرق أو بروتوكولات منخفضة المستوى تقوم بتنفيذ الجزء الضروري من الوظيفة. مثال على هذه الوظيفة هو تبديل السياق ، والذي يمنح نظام التشغيل القدرة على إيقاف أحد البرامج وتشغيل برنامج آخر على المعالج. يتم تطبيق تقسيم الوقت هذا في جميع أنظمة التشغيل الحديثة.
في الجزء العلوي من هذه الآليات يوجد بعض المنطق في نظام التشغيل ، في شكل "سياسات". السياسة هي خوارزمية معينة لصنع القرار بواسطة نظام تشغيل. هؤلاء السياسيون ، على سبيل المثال ، يقررون البرنامج الذي سيتم تشغيله (من قائمة الأوامر) في المقام الأول. لذلك ، على سبيل المثال ، فإن السياسة التي تسمى سياسة الجدولة سوف تحل هذه المشكلة ، وعند اختيار الحل سيتم إرشادها بواسطة البيانات مثل: سجل بدء التشغيل (أي برنامج كان قيد التشغيل الأطول في الدقائق الأخيرة) ، ونوع التحميل الذي تنفذه هذه العملية (نوع البرامج التي تم إطلاقها) ) ، مقاييس الأداء (ما إذا كان النظام هو الأمثل للتفاعل التفاعلي أو لعرض النطاق الترددي) وهلم جرا.

التجريد: العملية


التجريد من برنامج تشغيل يتم تنفيذه بواسطة نظام التشغيل هو ما نسميه العملية . كما ذكرنا سابقًا ، فإن العملية هي مجرد برنامج عمل ، في أي وقت لحظي. برنامج يساعدنا في الحصول على معلومات موجزة من مختلف موارد النظام ، والذي يعالج هذا البرنامج أو يؤثر عليه أثناء تنفيذه.
لفهم مكونات العملية ، تحتاج إلى فهم حالة النظام: أنه يمكن للبرنامج القراءة أو التغيير أثناء تشغيله. في أي وقت من الأوقات ، تحتاج إلى فهم عناصر النظام المهمة لتنفيذ البرنامج.
إحدى العناصر الواضحة لحالة النظام التي تتضمنها العملية هي الذاكرة . التعليمات في الذاكرة. توجد البيانات التي يقرأها البرنامج أو يكتبها أيضًا في الذاكرة. وبالتالي ، فإن الذاكرة التي يمكن أن تعالجها العملية (ما يسمى مساحة العنوان) هي جزء من العملية.
السجلات هي أيضًا جزء من حالة النظام. تهدف الكثير من التعليمات إلى تغيير معنى السجلات أو قراءة معانيها ، وبالتالي تصبح السجلات أيضًا جزءًا مهمًا من العملية.
تجدر الإشارة إلى أن حالة الجهاز تتشكل أيضًا من بعض السجلات الخاصة. على سبيل المثال ، مؤشر تعليمات IP - مؤشر إلى التعليمات التي ينفذها البرنامج حاليًا. يوجد أيضًا مؤشر مكدس ومؤشر الإطار المقترن ، والذي يتم استخدامه للتحكم: معلمات الدالة ، المتغيرات المحلية وعناوين الإرجاع.
أخيرًا ، تصل البرامج غالبًا إلى ROM (ذاكرة للقراءة فقط). يجب أن تتضمن هذه المعلومات حول "I / O" (الإدخال - الإخراج) قائمة بالملفات المفتوحة حاليًا بواسطة العملية.

API عملية


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

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

صورة

إنشاء العملية: التفاصيل



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

في أنظمة التشغيل المبكرة ، تم تنفيذ عملية التمهيد بشغف ، مما يعني أنه تم تحميل الكود في الذاكرة تمامًا قبل بدء البرنامج. تقوم أنظمة التشغيل الحديثة بهذا بالكسل ، أي تحميل أجزاء من التعليمات البرمجية أو البيانات فقط عند الحاجة إليها من قبل البرنامج أثناء تنفيذه.

بعد أن يتم تحميل الشفرة والبيانات الثابتة في ذاكرة نظام التشغيل ، يجب عليك القيام ببعض الأشياء قبل بدء العملية. يجب تخصيص مقدار معين من الذاكرة للمكدس. تستخدم البرامج المكدس للمتغيرات المحلية ومعاملات الوظائف وعناوين الإرجاع . يخصص نظام التشغيل هذه الذاكرة ويعطيها لهذه العملية. يمكن أيضًا تخصيص المكدس مع بعض الوسائط ، وتحديداً يملأ معاملات الدالة main () ، على سبيل المثال ، باستخدام صفيف argc و argv.

قد يخصص نظام التشغيل أيضًا مقدارًا معينًا من الذاكرة كومة الذاكرة المؤقتة للبرنامج. يتم استخدام كومة الذاكرة المؤقتة بواسطة البرامج للبيانات المخصصة بشكل حيوي المخصصة بشكل صريح . تطلب البرامج هذه المساحة عن طريق استدعاء وظيفة malloc () ومسحها صراحةً عن طريق استدعاء الدالة free () . هناك حاجة إلى كومة لبنية البيانات مثل الأوراق المرتبطة وجداول التجزئة والأشجار وغيرها. في البداية ، يتم تخصيص كمية صغيرة من الذاكرة تحت الكومة ، ولكن بمرور الوقت ، خلال عملية البرنامج ، قد تطلب الكومة مزيدًا من الذاكرة من خلال مكتبة API استدعاء malloc (). يشارك نظام التشغيل في عملية تخصيص المزيد من الذاكرة للمساعدة في مواجهة هذه التحديات.

سيقوم نظام التشغيل أيضًا بتنفيذ مهام التهيئة ، خاصة تلك المتعلقة بـ I / O. على سبيل المثال ، على أنظمة UNIX ، تحتوي كل عملية على 3 واصفات ملفات مفتوحة بشكل افتراضي ، لتدفقات الإدخال والإخراج والخطأ القياسية. تتيح هذه الواصفات للبرامج قراءة المدخلات من الجهاز ، وكذلك عرض المعلومات على الشاشة.

وبالتالي ، فإن تحميل الكود والبيانات الثابتة في الذاكرة ، وإنشاء التهيئة وتهيئتها ، وأيضًا القيام بأعمال أخرى متعلقة بتنفيذ مهام I / O ، يعد نظام التشغيل الموقع للعملية. في النهاية ، تبقى المهمة الأخيرة: تشغيل البرنامج من خلال نقطة الدخول الخاصة به ، وتسمى الوظيفة الرئيسية (). بالانتقال إلى الوظيفة الرئيسية () ، يقوم نظام التشغيل بنقل التحكم في وحدة المعالجة المركزية إلى العملية التي تم إنشاؤها حديثًا ، بحيث يبدأ البرنامج في التشغيل.

حالة العملية


الآن وقد أصبح لدينا بعض الفهم لماهية العملية وكيف يتم إنشاؤها ، ندرج حالات العملية التي يمكن أن تكون فيها. في أبسط أشكاله ، يمكن أن تكون العملية في إحدى الحالات التالية:
الجري . في حالة التشغيل ، تعمل العملية على المعالج. هذا يعني أن التعليمات يتم تنفيذها.
جاهز في حالة الاستعداد ، تكون العملية جاهزة للبدء ، لكن لسبب ما ، لا يقوم نظام التشغيل بتنفيذها في وقت معين.
محظور . في حالة القفل ، تنفذ العملية بعض العمليات التي تمنعها من الاستعداد للتنفيذ حتى وقوع حدث. أحد الأمثلة الشائعة هو عندما تبدأ عملية ما عملية إدخال / إخراج (IO) ، تصبح محظورة وبالتالي يمكن لبعض العمليات الأخرى استخدام المعالج.

صورة

يمكنك تخيل هذه الحالات في شكل رسم بياني. كما نرى في الصورة ، يمكن أن تتغير حالة العملية بين RUNNING و READY وفقًا لتقدير نظام التشغيل. عندما تتغير حالة العملية من READY إلى RUNNING ، فهذا يعني أنه تم جدولة العملية. في الاتجاه المعاكس - إزالتها من التخطيط. في الوقت الذي تصبح فيه العملية محظورة ، على سبيل المثال ، أبدأ عملية إدخال / إخراج (IO) ، سيبقيها نظام التشغيل في هذه الحالة إلى أن يحدث بعض الأحداث ، على سبيل المثال ، إكمال IO. في هذه اللحظة ، انتقل إلى حالة الاستعداد وربما على الفور إلى حالة التشغيل ، إذا قرر نظام التشغيل ذلك.
دعونا نلقي نظرة على مثال لكيفية عمليتين تمر هذه الحالات. أولاً ، تخيل أن كلتا العمليتين تعملان ، وأن كل منهما يستخدم وحدة المعالجة المركزية فقط. في هذه الحالة ، ستبدو ولاياتهم كما يلي.

صورة

في المثال التالي ، بعد فترة ، تطلب العملية الأولى إدخال / إخراج وإدخال حالة الحظر ، مما يمنح العملية الأخرى القدرة على البدء (الشكل 1.4). يرى نظام التشغيل أن العملية 0 لا تستخدم وحدة المعالجة المركزية وتبدأ العملية 1. أثناء تنفيذ العملية 1 - ينتهي IO وتتغير حالة العملية 0 إلى جاهزة. أخيرًا ، اكتمال العملية 1 ، وفي نهايتها ، تبدأ العملية 0 وتنفذ وتنتهي من عملها.

صورة

هيكل البيانات


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

لذلك ، على سبيل المثال ، يجب على نظام التشغيل حفظ حالة سجلات المعالج. في اللحظة التي تتوقف فيها العملية ، يتم حفظ حالة السجلات في مساحة عنوان العملية ، وفي وقت متابعتها ، من الممكن استعادة قيم السجلات وبالتالي متابعة العملية.

بالإضافة إلى الحالات الجاهزة المحظورة والجارية ، هناك بعض الحالات الأخرى. في بعض الأحيان ، في وقت الإنشاء ، يمكن أن تحتوي العملية على حالة INIT. أخيرًا ، يمكن وضع عملية في الحالة النهائية عندما تكون قد اكتملت بالفعل ، ولكن لم يتم بعد مسح المعلومات المتعلقة بها. على أنظمة UNIX ، تسمى هذه الحالة عملية غيبوبة . هذه الحالة مفيدة للحالات التي ترغب فيها العملية الأصل في معرفة رمز الإرجاع الخاص بالسليل ، على سبيل المثال ، تشير 0 إلى الإكمال الناجح ، وتشير 1 إلى حدوث خطأ ، لكن يمكن للمبرمجين إنشاء رموز إخراج إضافية ، مما يشير إلى مشاكل متعددة. عند الانتهاء ، تجري العملية الأصل آخر استدعاء للنظام ، على سبيل المثال ، انتظر () ، لانتظار اكتمال العملية التنازلية والإشارة إلى نظام التشغيل بأن أي بيانات مرتبطة بالعملية المكتملة يمكن محوها.



النقاط الرئيسية للمحاضرة:


العملية - التجريد الرئيسي لبرنامج قيد التشغيل في نظام التشغيل. في أي وقت ، يمكن وصف العملية بحالتها: محتويات الذاكرة في مساحة العنوان الخاصة بها ، ومحتويات سجلات المعالج ، بما في ذلك مؤشر التعليمات ومؤشر مكدس الذاكرة المؤقتة ، وكذلك بمعلومات حول IO ، على سبيل المثال ، الملفات المفتوحة التي تتم قراءتها أو كتابتها.
● تتكون واجهة برمجة تطبيقات Process من مكالمات يمكن للبرامج إجراؤها فيما يتعلق بالعمليات. عادة ما تكون هذه مكالمات لإنشاء أو حذف أو غير ذلك.
● العملية في واحدة من العديد من الحالات ، بما في ذلك التشغيل ، جاهزة ، محظورة. يمكن للأحداث المختلفة ، مثل التخطيط أو الاستبعاد من التخطيط أو التوقعات ، ترجمة حالة العملية من واحدة إلى أخرى.
● تحتوي قائمة العمليات على معلومات حول جميع العمليات في النظام. يسمى كل إدخال فيه كتلة التحكم في العملية ، والتي هي في الواقع هيكل يحتوي على جميع المعلومات اللازمة حول عملية معينة.

Source: https://habr.com/ru/post/ar446866/


All Articles