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

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

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

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

أجزاء أخرى:

يمكنك أيضًا التحقق من قناتي على برقية =)

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

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

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

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

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

API العملية

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

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

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

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

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

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

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

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

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

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

حالة العملية

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

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

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

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

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

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

بنية البيانات

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

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

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

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

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

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

المصدر: www.habr.com

إضافة تعليق