سؤال

يتم سؤالي باستمرار عن AppDomains في المقابلات، و أنا أعرف الأساسيات:

  • فهي مستوى عزل داخل التطبيق (مما يجعلها مختلفة عن التطبيقات)
  • يمكن أن يكون لديهم خيوط (مما يجعلها مختلفة عن الخيوط)
  • الاستثناءات في مجال تطبيق واحد لا تؤثر على مجال آخر
  • لا يمكن لنطاقات التطبيق الوصول إلى ذاكرة بعضها البعض
  • يمكن أن يتمتع كل مجال تطبيق بأمان مختلف

ما زلت لا أفهم ما يجعلها ضرورية.أنا أبحث عن ظرف ملموس معقول عندما تستخدمه.

الإجابات:

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

أي شيء آخر؟

هل كانت مفيدة؟

المحلول

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

أيضًا، ليس من الممكن إلغاء تحميل تجميع معين، ولكن يمكنك إلغاء تحميل AppDomains.

للحصول على الملخص الكامل، كان لدى كريس بروم مدونة ضخمة حول هذا الموضوع:

http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx

https://devblogs.microsoft.com/cbrumme/appdomains-application-domains/

نصائح أخرى

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

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

أيضًا، على الرغم من أن بنيات المكونات الإضافية المُدارة في تطبيقات الطرف الثالث تعد بالتأكيد استخدامًا جيدًا لـ AppDomains، فإن السبب الأكبر لوجودها هو وجود مضيفين معروفين مثل SQL Server 2005 وASP.NET.على سبيل المثال، يمكن لموفر استضافة ASP.NET تقديم حل استضافة مشترك يدعم مواقع متعددة من عملاء متعددين، كل ذلك في نفس المربع الذي يعمل ضمن عملية Windows واحدة.

تعد مجالات التطبيق رائعة لاستقرار التطبيق.

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

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

يستخدم ASP.NET أيضًا AppDomains منفصلة لكل تطبيق ويب ضمن عملية عاملة واحدة.

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

يُقارن هذا بشكل إيجابي مع Java حيث يكون لديك دائمًا JVM واحد لكل تطبيق، مما يؤدي غالبًا إلى تشغيل العديد من مثيلات JVM جنبًا إلى جنب مع الموارد المكررة.

أرى حالتين أو ثلاث حالات استخدام رئيسية لإنشاء مجالات تطبيق منفصلة:

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

2) تنفيذ تعليمات برمجية غير موثوقة في مجال تطبيق منفصل بأذونات أمان معينة (يرتبط هذا في الواقع بالسبب الأول).كما قال الأشخاص بالفعل، يمكنك تحميل المكونات الإضافية التابعة لجهات خارجية أو ملفات dll غير الموثوق بها في مجالات تطبيقات منفصلة.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top