העברת מסרים

במדעי המחשב, העברת מסרים (באנגלית: message passing) היא צורת תקשורת המשמשת בחישוב מקבילי, בתכנות מונחה-עצמים, ובתקשורת בין תהליכים. במודל זה, תהליכים או אובייקטים יכולים לקבל ולשלוח מסרים (המורכבים מאפס או יותר בתים, מבני נתונים מורכבים, או אפילו קטעי קוד) אל תהליכים אחרים. על ידי המתנה לקבלת מסרים, ניתן גם לסנכרן תהליכים. העברת מסרים היא פרדיגמת תקשורת בה מסרים נשלחים מהשולח אל נמען אחד או יותר. מסרים יכולים לבוא בצורה של קריאות להפעלת פרוצדורות מרוחקות, סיגנלים, וחבילות נתונים. כאשר מתכננים מערכת העברת מסרים יש לבחור בין מספר אפשרויות: האם המסרים יועברו בצורה אמינה (reliably). האם העברת המסרים לפי הסדר היא מובטחת. האם המסרים מועברים בצורה של יחיד-ליחיד (unicast), יחיד-לרבים (multicast או broadcast), או רבים-לרבים (all-to-all). האם התקשורת תהיה סינכרונית או א-סינכרונית. מערכות מבוזרות ומערכות להפעלת פרוצדורות מרוחקות כגון, NET Remoting., JMS, Java RMI, DCOM, CORBA ו-SOAP הן דוגמאות לטכנולוגיות המשתמשות בהעברת מסרים. מערכות סינכרוניות להעברת מסרים דורשות שהשולח והמקבל ימתינו האחד לשני לצורך העברת המסר. כלומר, השולח לא ימשיך כל עוד הנמען לא קיבל את המסר. לתקשורת סינכרונית יש שני יתרונות: היתרון הראשון הוא בכך שהלוגיקה של התוכנית יכולה להיות פשוטה יותר מכיוון שקיימת נקודת סינכרון בין השולח למקבל בזמן העברת המסר. היתרון השני הוא שאין צורך בשמירה של מסרים בחוצץ (buffering). המסר תמיד יכול להישמר בצד המקבל, מכיוון שהשולח לא ימשיך לפני שהצד המקבל שוב מוכן. מערכות אסינכרוניות להעברת מסרים מעבירות מסרים מהשולח למקבל, מבלי לחכות שהמקבל יהיה מוכן. היתרון של תקשורת א-סינכרונית הוא בכך שהשולח והמקבל יכולים לעבוד במקביל מכיוון שהם לא מחכים האחד לשני. ניתן לממש תקשורת סינכרונית על גבי מערכת א-סינכרונית על ידי שימוש באלגוריתם סינכרון (synchronizer algorithm). לדוגמה, אלגוריתם מסוג Alpha synchronizer דואג שהשולח תמיד יחכה להודעת אישור קבלה (acknowledgment) מהנמען. השולח ישלח את המסר הבא רק לאחר שקיבל acknowledgement. החוצץ (buffer) שנדרש בתקשורת א-סינכרונית יכול לגרום לבעיות כאשר הוא מתמלא. כאשר נגמר המקום בחוצץ של המקבל יש להחליט האם לחסום את השולח או האם להתעלם מהודעות חדשות. אם השולח נחסם, זה יכול להוביל לקיפאון (deadlock) בלתי צפוי. ואילו אם מסרים נזרקים, זה הופך את התקשורת לבלתי אמינה. ניתן להשתמש בהעברת מסרים בתור אמצעי לבקרה על גישה למשאבים במערכת מקבילית או א-סינכרונית. אחת האלטרנטיבות העיקריות היא מניעה הדדית (mutual exclusion) או נעילה (locking). דוגמה למשאב יכול להיות זיכרון משותף, קובץ השמור על הדיסק או חלק ממנו, טבלה בבסיס נתונים או מספר שורות שלה. בשימוש בנעילה, המשאב הוא משותף ותהליכים שרוצים לקבל גישה אליו (או לחלק ממנו) חייבים קודם לקבל מנעול (lock). ברגע שהתקבל המנעול, תהליכים אחרים חסומים מלגשת למשאב, ובכך מובטח שלא תתרחש השחתה של המשאב על ידי כמה תהליכים שכותבים אליו בו זמנית. לאחר שהתהליך שקיבל מנעול סיים לטפל במשאב, הוא משחרר את המנעול. בפתרון המשתמש בהעברת מסרים, מניחים שהמשאב אינו חשוף, ושכל השינויים בו נעשים על ידי תהליך מנהל (handler) המקושר אליו, כך שהמשאב עצמו מוכמס (encapsulated). תהליכים המעוניינים לקבל גישה למשאב שולחים מסר בקשה ל-handler. אם המשאב (או חלק ממנו) זמין, ה-handler מבצע את השינוי המבוקש כפעולה אטומית. כלומר, בקשות מתנגשות לא מבוצעות עד שהבקשה הראשונה לא הושלמה. אם המשאב אינו זמין, הבקשה נשמרת בדרך כלל בתור של בקשות. התוכנית השולחת יכולה להחליט האם לחכות להשלמת הבקשה או לא. שיטות הפצה בתקשורת נתונים בקרת מקביליות WebSphere MQ