לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 16-03-2008, 18:44
  sigsig sigsig אינו מחובר  
 
חבר מתאריך: 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.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 16-03-2008, 19:32
  sigsig sigsig אינו מחובר  
 
חבר מתאריך: 23.11.07
הודעות: 187
AppDomains: דוגמת קוד
בתגובה להודעה מספר 1 שנכתבה על ידי sigsig שמתחילה ב "מאמר NET. מספר 1: AppDomains"

להלן דוגמת קוד לשימוש ב-AppDomains. יש לקמפל את הקוד לתוך exe ולהריץ. התוכנית סופרת מ-0 עד 9, פעם ב-Default AppDomain ופעם ב-AppDomain שנוצר באופן מפורש. שתי נקודות לתשומת לבכם:

1. את היצירה, מחיקה והרצת הקוד ב-AppDomain החדש אנחנו עושים בתוך בלוק של try..finally. הסיבה היא שבגלל שהפעלנו את הקוד מתוך ה-Default AppDomain, כל exception שנזרק מתוך ה-AppDomain החדש יגיע אלינו. על מנת להריץ קוד נפרד לחלוטין יש לעשות את זה דרך ה-CLR Host, וזה נושא מורכב הרבה יותר.
2. שימו לב למחיקת ה-AppDomain בסוף - ניתן למחוק רק AppDomain מלא ולא Assemblies ספציפים בתוכו.

לא דיברתי בכלל על תקשורת בין AppDomains שונים. לצורך זה יש לעשות שימוש ב-Remoting ויש מספר פעולות שצריך לבצע. אם מישהו מעוניין, אני אראה דוגמא גם לזה.

קוד:
using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace AppDomainSample { classProgram { staticvoid Main(string[] args) { // This code only runs in the default AppDomain if (AppDomain.CurrentDomain.IsDefaultAppDomain()) { AppDomain newAppDomain = null; try { // Create a new AppDomain newAppDomain = AppDomain.CreateDomain("new AppDomain"); // Run this assembly in the new AppDomain newAppDomain.ExecuteAssemblyByName( Assembly.GetExecutingAssembly().FullName); } finally { // Delete the new AppDomain if(newAppDomain != null) AppDomain.Unload(newAppDomain); } } // Do some work, and write in which AppDomain it runs for (int i = 0; i < 10; i++) { Console.WriteLine("Number {0} in AppDomain {1}", i, AppDomain.CurrentDomain.FriendlyName); } } } }
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 20-03-2008, 16:33
  sigsig sigsig אינו מחובר  
 
חבר מתאריך: 23.11.07
הודעות: 187
בתגובה להודעה מספר 6 שנכתבה על ידי רמי ד שמתחילה ב "1. הבנתי. תודה 2. בסופו של..."

1. בכיף. תבוא כל יום...
2. שאלה מצויינת, והתשובה היא בשני חלקים. לגבי קריאה לתכנית אחרת - אם התכנית כתובה בשפת Net. כלשהיא (managed code) אז מנגנון ה-stack walk של ה-Framework יוודא שלא תוכל להריץ אותה (מתואר בחלק השני של המאמר על CAS). אם התוכנית היא unmanaged code, אז תצטרך להפעיל אותה עם Process.Start - ולכך אתה צריך הרשאות מתאימות.
לגבי קריאה למערכת ההפעלה - אתה למעשה מדבר על P\Invoke, שזה מנגנון הקריאה הישירה לקוד שהוא unmanaged. גם לזה אתה צריך הרשאות מתאימות. כך שאם הגדרת מדיניות אבטחה שאוסרת על כתיבת קבצים אבל מרשה קריאה ל-Win32 API, אז די ירית לעצמך ברגל... ה-Framework נותן לך הרבה חבל, אבל לא תמיד יכול להבטיח שלא תתלה את עצמך בעזרתו.
Hope that helps
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 16:26

הדף נוצר ב 0.04 שניות עם 11 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2025 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר