
16-03-2008, 18:44
|
|
|
|
חבר מתאריך: 23.11.07
הודעות: 187
|
|
|
מאמר NET. מספר 1: AppDomains
הקדמה
מערכות הפעלה מודרניות, כפי שכולנו יודעים, מאפשרות ביצוע של מספר פעולות במקביל. ב-Windows לדוגמא, אנחנו יכולים להריץ מספר תוכניות ולעבור ביניהן. כל תוכנית כזו שרצה בנפרד נקראת תהליך (process). מבלי להכנס יותר מדי למה שעושה מערכת ההפעלה, נגיד רק שתהליך הוא יחידת הרצה עצמאית - יש הפרדה ברורה בין מה שנמצא 'בתוך' ו-'שייך' לתהליך, לבין כל מה שלא. את ההפרדה הזו אוכפת מערכת ההפעלה: לדוגמא, קוד שרץ בתהליך מס. 1000 לא יכול (באופן ישיר) להתערב בנתונים ובפעולות שרצות בתהליך מס. 2000. חשוב להבין שהפעלת תהליך הוא דבר 'כבד' יחסית ודורש משאבים רבים ממ'ה.
כמו כן, ניתן לבצע מספר פעולות במקביל בתוך תהליך אחד (למשל, העתקה של קובץ גדול ובמקביל עדכון progress bar על התקדמות). כל פעולה כזו מתבצעת בתוך ישות שנקראת נים (thread). לכל הנימים בתהליך אחד יש גישה לאותם נתונים ואותו מרחב זיכרון. שימוש במספר נימים דורש פחות משאבי מערכת מאשר שימוש במספר תהליכים, אבל הוא מסובך יותר: יש להביא בחשבון סינכרון בין נימים שונים, לוודא שאין נעילות הדדיות בין נימים ועוד אוסף בעיות שונות. שליטה בתכנות עם מספר נימים (multi-threaded programming) נחשבת - ובצדק - לרמת שליטה גבוהה.
למען השלמות, נזכיר מנגנון שלישי שנקרא סיבים (Fibers) וקשור לנימים. במאמר זה לא נפרט לגביו.
מהם AppDomains?
ראינו שמערכת ההפעלה מספקת יכולות הרצה במקביל בצורה של תהליכים ושל נימים. כאשר יצא ה-Net. Framework, מיקרוסופט הציעו יכולת נוספת להרצה במקביל שנקראת Application Domains (או בקיצור, AppDomains). למעשה, AppDomain הוא תהליך 'לוגי', בניגוד לתהליך 'פיזי' של מערכת ההפעלה. המשמעות המעשית היא שמערכת ההפעלה תריץ רק תהליך אחד (ותבצע הקצאת משאבים רק עבור תהליך אחד), בעוד שה-Framework יעשה שימוש באותו תהליך בודד להרצת מספרAssemblies (קבצים בינאריים של NET., בעלי סיומת dll או exe). היות וה-CLR (מנוע הריצה של ה-Framework) יודע לאיזה זכרון ניגש כל assembly (למעט מקרים של קוד שמשתמש בפעולות שמוגדרות unsafe, מצב שנתעלם ממנו כרגע) הרי שביכולתו למנוע התנגשויות בין assemblies שונים
ולהפעיל כל אחד מהם כאילו היה בתהליך משל עצמו.
לכל תהליך שמפעיל את ה-CLR (כלומר כל פעם שמריצים תוכנית שנכתבה בשפת NET. כלשהיא) נוצר AppDomain ראשי שנקרא Default AppDomain. במידה ולתוכנית יש הרשאות מתאימות, אזי ביכולתה ליצור ולמחוק AppDomains אחרים, ולהריץ בתוכם קוד. אלא אם כן התוכנית יוצרת AppDomains חדשים, כל הקוד בתוכנית ירוץ ב-default AppDomain
היתרונות של שימוש ב-AppDomains נפרדים הם בין היתר:- שימוש בפחות משאבי מערכת (פחות תהליכים)
- ניתן להפעיל ולעצור אפליקציה ב-AppDomain אחד מבלי להשפיע על אפליקציות ב-AppDomain אחר
- שגיאות ו-Exceptions ב-AppDomain אחד לא משפיעות על AppDomain אחר
- לכל AppDomain ניתן לתת הגדרות אבטחה בנפרד
- קוד ב-AppDomain אחד לא יכול להשפיע באופן ישיר על קוד ב-AppDomain אחר
למה זה טוב?
נראה כעת מספר דוגמאות לשימוש יעיל ב-AppDomains:
בדוגמא הראשונה, נחשוב על מערכת להגשה אוטומטית של תרגילי תכנות. המרצה/מורה חילק תרגיל תכנותי, ועל התלמידים להגיש קובץ exe שמבצע את המטלה. אם המורה פשוט יריץ את ה-exe, הרי שהתלמידים יוכלו לעשות במחשב מה שירצו - למחוק קבצים וספריות, לקרוא כל קובץ שירצו, וכו'. במערכת שמשתמשת ב-AppDomains, המורה ישתמש ב-Default AppDomain כדי להוריד את
ה-exe מהדוא'ל וליצור AppDomain חדש שבו לדוגמא לתוכנית מותר לקרוא רק מספרייה מסויימת, אסור לה לכתוב לשום מקום או לגשת לרשת, וכו'. בתוך ה-AppDomain החדש ירוץ קובץ ה-exe שהגיע מהתלמיד. כמו כן, אם מדובר בתוכניות שצריכות לרוץ זמן רב, ניתן ליצור מספר AppDomains מוגבלים ולהריץ כמה תוכניות ביחד. שגיאה בתוכנית של תלמיד אחד לא תשפיע על תוכניות של תלמידים אחרים.
בדוגמא השנייה, נסתכל על מימוש אמיתי - סביבת ה-ASP.NET של מיקרוסופט. זהו תהליך פיזי של מערכת ההפעלה (שנקרא aspnet.exe) אשר משמש כמארח (host) של ה-CLR. כל web application שמוגדר ל-ASP.NET יקבל AppDomain לעצמו. אם מתרחשת שגיאה כלשהיא באפליקצה אחת אז אין שום השפעה על אפליקציות אחרות על אותו שרת. כמו כן, המארח מספיק חכם כדי 'למחזר' AppDomains שרצים זמן ארוך מדי או צורכים יותר מדי זכרון, ובצורה כזו לשמור על ביצועים טובים. לבסוף, אם מעדכנים הגדרות של web application כלשהוא תוך כדי ריצה, הרי שגם כאן המארח חכם מספיק למחזר את ה-AppDomain המתאים ולהעלות את האפליקציה מחדש (עם ההגדרות החדשות כמובן).
סיכום
כפי שראינו, שימוש מושכל ב-AppDomains יכול להוביל לתוכניות שהן יציבות ומאובטחות יותר. כמו בכל יכולת טכנולוגית, יש להשתמש בהם בזהירות ותוך הבנה של כל הגורמים הרלוונטים. כאשר זה נעשה נכון, אין ספק ש-AppDomains הם כלי חזק ביותר שמציע ה-Framework.
|