نظام التشغيل (الزنبرك)

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

تاريخ

غلاف قرص Spring Research Distribution 1.0

بدأ مشروع Spring بشكل غير مباشر عام 1987، كجزء من تعاون شركتي Sun و AT&T لإنشاء نظام UNIX موحد . وقررت الشركتان أن هذه فرصة جيدة لإعادة برمجة UNIX بأسلوب كائني التوجه. [ 2 ] إلا أن هذا الجزء من المشروع توقف بعد اجتماعات قليلة.

قررت شركة صن الإبقاء على فريقها متماسكًا والتركيز بدلًا من ذلك على استكشاف نظام متطور. إلى جانب دمج نكهات يونكس، كان النظام الجديد قادرًا على تشغيل أي نظام آخر تقريبًا، وبطريقة موزعة . بدأ تشغيل النظام بشكل كامل في عام 1993، وأنتج سلسلة من الأبحاث. في عام 1994، صدرت نسخة "بحثية" منه بترخيص غير تجاري، ولكن من غير الواضح مدى انتشار استخدامها. وُصف البرنامج بأنه "بداية جديدة" تهدف إلى مساعدة صن على تحسين منتجات يونكس الحالية، ووُفر بسعر 75 دولارًا، حيث استهدفت صن الجامعات وعلماء الحاسوب. [ 3 ] بينما كان بإمكان مؤسسات البحث التجارية الحصول على البرنامج بسعر 750 دولارًا. [ 4 ] انفصل الفريق وانتقل إلى مشاريع أخرى داخل صن، مستخدمًا بعض مفاهيم سبرينغ في مشاريع متنوعة أخرى.

خلفية

بدأ مشروع Spring بعد فترة وجيزة من إصدار Mach 3. في الإصدارات السابقة، كان Mach مجرد نسخة معدلة من نواة BSD الموجودة ، ولكن في Mach 3، تم فصل خدمات Unix وتشغيلها كبرنامج في مساحة المستخدم كأي برنامج آخر، وهو مفهوم أطلق عليه Mach اسم "الخادم" . البيانات التي كانت تُعتبر خاصة في النواة في نظام Unix التقليدي، أصبحت الآن تُنقل بين الخوادم وبرامج المستخدم باستخدام نظام اتصال بين العمليات (IPC)، وتنتهي في منافذ مشتركة بين البرنامجين. نفّذ Mach هذه المنافذ في النواة، مستخدمًا الذاكرة الافتراضية لنقل البيانات بين البرامج، معتمدًا على وحدة إدارة الذاكرة (MMU) وخوارزمية النسخ عند الكتابة لتحقيق أداء معقول.

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

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

الأساس المنطقي

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

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

استكشف نظام Spring أيضًا عددًا من التطورات البرمجية المحددة في أنظمة الملفات والذاكرة الافتراضية وأداء الاتصال بين العمليات. وكانت النتيجة نظامًا واحدًا شبيهًا بنظام Unix بأداء أفضل بكثير من نظام Mach. بعض هذه التغييرات موضحة بالتفصيل أدناه.

وصف

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

النواة

قُسِّمَت نواة نظام التشغيل Spring إلى جزأين: نظام ذاكرة افتراضية ونواة النظام . ورغم أن نواة النظام تُعادل جزءًا واحدًا فقط من نواة نظام التشغيل Mach، إلا أن نوى كل نظام تشغيل متشابهة بما يكفي لاعتبارها تؤدي الوظيفة نفسها.

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

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

نموذج IPC

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

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

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

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

على عكس حل Mach الموحد للاتصال بين العمليات، استخدم Spring طرقًا متنوعة لنقل البيانات فعليًا بين البرامج. إحدى هذه الطرق، وهي المسار المجمع (Bulk-path )، كانت مطابقة تقريبًا لمنافذ Mach ورسائله، ولكن عمليًا، كان المسار المجمع أقل أنواع الرسائل شيوعًا. بالنسبة للرسائل الأصغر حجمًا، وفر Spring المسار العادي (Vinilla-path )، الذي ينسخ البيانات مباشرةً من مساحة تخزين إلى أخرى، وهو ما أثبت أنه أسرع من تعيين الذاكرة في الواقع العملي للبيانات التي يقل حجمها عن 5 كيلوبايت.

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

كان المسار السريع متاحًا فقط للمكالمات التي تمرر قيمًا بسيطة لا تتطلب ترجمة (مثلًا، لا تتضمن مراجع أبواب) بحد أقصى 16 قيمة. على الرغم من أن هذا قد يبدو مقيدًا، إلا أن المسار السريع يُستخدم فعليًا من قِبل الغالبية العظمى من المكالمات في Spring - أي ما يزيد عن 80% من المكالمات ونحو 60% من عمليات الإرجاع. غالبًا ما تُرسل عمليات الإرجاع كتلًا كبيرة من البيانات، مثل كتلة بيانات على القرص، مما يفسر سبب استخدام أنظمة الاتصال بين العمليات الأخرى في أغلب الأحيان.

في أنظمة SPARC V8 ذات 32 بت ، استغرقت عملية استدعاء كاملة ذهابًا وإيابًا باستخدام المسار السريع ما يزيد قليلًا عن 100 تعليمة، مما يجعلها أسرع بكثير من استدعاء Mach التقليدي. ولا يزال من غير الواضح ما إذا كان بالإمكان تطبيق المسار السريع على أجهزة أخرى، لذا يصعب مقارنة التحسن الإجمالي في أداء Spring مع Mach، الذي كان يُقاس عادةً على أنظمة IA-32 . فعلى وجه التحديد، استغرق استدعاء النظام الكامل أقل من 20  ميكروثانية على معالج 486DX-50 لأنظمة BSD Unix الحالية ، و114  ميكروثانية باستخدام Mach. وقد أدى ذلك إلى انخفاض في الأداء بنسبة 50% أو أكثر، مما أدى إلى فشل معظم مشاريع Mach. في المقابل، تميز Spring باستخدام المسار السريع بزمن تنفيذ تعليمات لكل دورة (IPC) يبلغ 11  ميكروثانية فقط على SPARCstation 2 .

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

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

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

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

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

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

خدمة الأسماء

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

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

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

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

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

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

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

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

نظام الملفات

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

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

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

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

تجدر الإشارة إلى أن استخدام Spring لمصطلح " نظام الملفات" قد يكون مُربكًا بعض الشيء. ففي الاستخدام الشائع، يشير المصطلح إلى طريقة مُحددة لتخزين الملفات فعليًا على القرص.

محاكاة يونكس

كان على Spring أيضًا دعم تطبيقات Unix الحالية، التي تُشكّل أساس أعمال Sun. ولتحقيق ذلك، تم تزويد Spring بامتدادين رئيسيين: خادم عمليات Unix يُحاكي نظام Unix كاملًا، وإعادة كتابة لمكتبة libc القياسية المسماة libue، والتي تُعيد توجيه طلبات نواة Unix إلى خوادم مختلفة. على سبيل المثال، يتم توجيه تطبيق Unix الذي يتطلب خدمات الملفات أو الشبكة إلى خادم Spring المُناسب، بينما يتم توجيه التطبيق الذي يُريد عرض قائمة البرامج قيد التشغيل إلى خادم عمليات Unix. كان خادم العمليات مسؤولًا أيضًا عن معالجة الإشارات ، وهو مفهوم لم يكن له نظير في Spring ، ولم تكن هناك حاجة إليه فعليًا إلا للتوافق مع الإصدارات السابقة، لأن الإشارات هي في الأساس آلية اتصال بين العمليات (IPC) غير مرنة وذات غرض واحد.

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

عقود من الباطن

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

أنظمة أخرى

أضافت شركة صن نسخة "متوافقة مع نظام يونكس" من برنامج Doors إلى نظام سولاريس.

في السنوات التي تلت انتهاء العمل على نظام Spring، توقف العمل على أنظمة التشغيل بشكل عام. ومع تحول السوق سريعًا إلى عالم يهيمن عليه نظام Windows وأنظمة التشغيل الشبيهة بنظام Unix، يبدو أن الأسواق المتاحة لأي نظام آخر محدودة للغاية. إضافةً إلى ذلك، يبدو أن الأداء الضعيف لنظام Mach 3 قد أثر سلبًا على العديد من المشاريع.

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

مراجع

  1. "ما هي الأجهزة التي أحتاجها لتشغيل Spring؟" . شركة صن مايكروسيستمز، 1996. مؤرشف من الأصل في 20 ديسمبر 1996. تم الاطلاع عليه في 21 أبريل 2023 .
  2. ميتشل، جيم (1994). مقدمة لـ "نظرة عامة على نظام الزنبرك" . مختبرات صن مايكروسيستمز: 10 سنوات من التأثير (تقرير). شركة صن مايكروسيستمز. مؤرشف من الأصل بتاريخ 16 يناير 2010. تم الاطلاع عليه بتاريخ 8 أبريل 2023 .
  3. بوزمان، جان س. (27 مارس 1995). "التنظيف الربيعي لبرنامج صن سوفت" . مجلة كمبيوتر وورلد . ص 12. تم الاطلاع عليه بتاريخ 8 أبريل 2023 . 
  4. مونتغمري، جون (فبراير 1996). "درس صن سوفت في البرمجة الكائنية" (ملف PDF) . بايت . الصفحات 117-120 ، 122. تاريخ الاسترجاع: 21 أبريل 2023 . 
  5. هاميلتون، غراهام؛ كوغيوريس، بانوس (أبريل 1993). النواة الزنبركية: نواة مصغرة للكائنات (ملف PDF) (تقرير فني). مختبرات صن مايكروسيستمز . تم الاطلاع عليه بتاريخ 21 أبريل 2023 .