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

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

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

يمكن العثور على عمل معمل حول هذا الموضوع هنا:
- إبداعي: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- إبداعي: github.com/remzi-arpacidusseau/ostep-code
- تكيفي الشخصي: github.com/bykvaadm/OS/tree/master/ostep

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

تشغيل البرنامج

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

نموذج فون نيومان للحساب

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

نظام التشغيل

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

افتراضية وحدة المعالجة المركزية

ضع في اعتبارك البرنامج التالي:
(https://www.youtube.com/watch؟v=zDwT5fUcki4&feature=youtu.be)

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

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

الذاكرة الافتراضية

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

استدعاء malloc ()

ضع في اعتبارك البرنامج التالي ، الذي يخصص منطقة من الذاكرة باستخدام المكالمة مالوك () (https://youtu.be/jnlKRnoT1m0):

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

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

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

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

التناسق

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

ضع في اعتبارك البرنامج التالي:

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

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

لنقم بتشغيل هذا البرنامج باستخدام وسيطة تساوي 1000. كما قد تكون خمنت ، يجب أن تكون النتيجة 2000 لأن كل مؤشر ترابط زاد المتغير 1000 مرة. ومع ذلك ، كل شيء ليس بهذه البساطة. دعنا نحاول تشغيل البرنامج بترتيب أكبر من التكرارات.

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

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

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

إضافة تعليق