העברת מסרים

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

במדעי המחשב, העברת מסריםאנגלית: message passing) היא צורת תקשורת המשמשת בחישוב מקבילי, בתכנות מונחה-עצמים, ובתקשורת בין תהליכים. במודל זה, תהליכים או אובייקטים יכולים לקבל ולשלוח מסרים (המורכבים מאפס או יותר בתים, מבני נתונים מורכבים, או אפילו קטעי קוד) אל תהליכים אחרים. על ידי המתנה לקבלת מסרים, ניתן גם לסנכרן תהליכים.

העברת מסרים היא פרדיגמת תקשורת בה מסרים נשלחים מהשולח אל נמען אחד או יותר. מסרים יכולים לבוא בצורה של קריאות להפעלת פרוצדורות מרוחקות, סיגנלים, וחבילות נתונים.

כאשר מתכננים מערכת העברת מסרים יש לבחור בין מספר אפשרויות:

  • האם המסרים יועברו בצורה אמינה (reliably).
  • האם העברת המסרים לפי הסדר היא מובטחת.
  • האם המסרים מועברים בצורה של יחיד-ליחיד (unicast), יחיד-לרבים (multicast או broadcast), או רבים-לרבים (all-to-all).
  • האם התקשורת תהיה סנכורנית או אסינכרונית.

מערכות מבוזרות ומערכות להפעלת פרוצדורות מרוחקות כגון: SOAP ,.NET Remoting ,DCOM ,CORBA ,Java RMI ,JMS הן דוגמאות לטכנולוגיות המשתמשות בהעברת מסרים.

העברת מסרים סנכורנית לעומת העברת מסרים אסינכרונית[עריכת קוד מקור | עריכה]

מערכות סינכרוניות להעברת מסרים דורשות שהשולח והמקבל ימתינו האחד לשני לצורך העברת המסר. כלומר, השולח לא ימשיך עד שהנמען לא קיבל את המסר.

לתקשורת סינכרונית יש שני יתרונות: היתרון הראשון הוא בכך שהלוגיקה של התוכנית יכולה להיות פשוטה יותר מכיוון שקיימת נקודת סנכרון בין השולח למקבל בזמן העברת המסר. היתרון השני הוא שאין צורך בשמירה של מסרים בחוצץ (buffering). המסר תמיד יכול להישמר בצד המקבל, מכיוון שהשולח לא ימשיך לפני שהצד המקבל שוב מוכן.

מערכות אסינכרוניות להעברת מסרים מעבירות מסרים מהשולח למקבל, מבלי לחכות שהמקבל יהיה מוכן. היתרון של תקשורת אסינכורנית הוא בכך שהשולח והמקבל יכולים לעבוד במקביל מכיוון שהם לא מחכים האחד לשני.

ניתן לממש תקשורת סינכרונית על גבי מערכת אסינכרונית על ידי שימוש באלגוריתם סנכרון (synchronizer algorithm). לדוגמה, אלגוריתם מסוג Alpha synchronizer דואג שהשולח תמיד יחכה להודעת אישור קבלה (acknowledgment) מהנמען. השולח ישלח את המסר הבא רק לאחר שקיבל acknowledgement.

החוצץ (buffer) שנדרש בתקשורת אסינכרונית יכול לגרום לבעיות כאשר הוא מתמלא. כאשר נגמר המקום בחוצץ של המקבל יש להחליט האם לחסום את השולח או האם להתעלם מהודעות חדשות. אם השולח נחסם, זה יכול להוביל לקיפאון (deadlock) בלתי צפוי. ואילו אם מסרים נזרקים, זה הופך את התקשורת לבלתי אמינה.

העברת מסרים ומנעולים[עריכת קוד מקור | עריכה]

ניתן להשתמש בהעברת מסרים בתור אמצעי לבקרה על גישה למשאבים במערכת מקבילית או אסינכרונית. אחת האלטרנטיבות העיקריות היא מניעה הדדית (mutual exclusion) או נעילה (locking). דוגמה למשאב יכול להיות זיכרון משותף, קובץ השמור על הדיסק או חלק ממנו, טבלה בבסיס נתונים או מספר שורות שלה.

בשימוש בנעילה, המשאב הוא משותף ותהליכים שרוצים לקבל גישה אליו (או לחלק ממנו) חייבים קודם לקבל מנעול (lock). ברגע שהתקבל המנעול, תהליכים אחרים חסומים מלגשת למשאב, ובכך מובטח שלא תתרחש השחתה של המשאב על ידי כמה תהליכים שכותבים אליו בו זמנית. לאחר שהתהליך עם המנעול סיים עם המשאב, הוא משחרר את המנעול.

בפתרון המשתמש בהעברת מסרים, מניחים שהמשאב אינו חשוף, ושכל השינויים עליו נעשים על ידי תהליך מנהל (handler) המקושר אליו, כך שהמשאב עצמו מכומס (encapsulated). תהליכים המעוניינים לקבל גישה למשאב שולחים מסר עם בקשה ל-handler. אם המשאב (או חלק ממנו) זמין, ה-handler מבצע את השינוי המבוקש כפעולה אטומית. כלומר, בקשות מתנגשות לא מבוצעות בו זמנית, עד שהבקשה הראשונה לא הושלמה. אם המשאב אינו זמין, בדרך כלל הבקשה נשמרת בתור של בקשות. התוכנית השולחת יכולה להחליט האם לחכות להשלמת הבקשה או לא.

ראו גם[עריכת קוד מקור | עריכה]