فرستادن پیام

از ویکی‌پدیا، دانشنامهٔ آزاد

در علوم کامپیوتر، فرستادن پیغام تکنیکی است که برای فراخوانی یک رفتار (مثلاً اجرای یک برنامه) روی یک کامپیوتر انجام می شود. برنامه فراخواننده، یک پیغام را به یک پروسه می فرستد (که ممکن است یک عملگر یا شئ باشد) و سپس، روی آن پروسه و زیر ساخت های حمایت کننده ی آن تکیه می کند تا برخی کدهای مناسب را انتخاب و اجرا کند. انتقال پیغام با برنامه نویسی مرسوم فرق دارد. در برنامه‌نویسی مرسوم، یک پروسه، ساب روتین، یا تابع به طور مستقیم با استفاده از یک نام، فراخوانی می شود. انتقال پیغام یک اصل مهم برای برخی مدل های همروندی و برنامه نویسی شئ گرا است.
انتقال پیغام، به طور گسترده‌ای در نرم‌افزارهای کامپیوتر های کنونی استفاده می شود. انتقال پیغام در اشیائی که یک برنامه را تشکیل می دهند، به عنوان شیوه ای برای کار کردن با یکدیگر، و برای اشیاء و سیستم هایی که روی کامپیوتر های مختلف اجرا می شوند (مثلا اینترنت)، به عنوان روشی برای تعامل استفاده می شود. انتقال پیغام را می توان با استفاده از مکانیسم های مختلفی پیاده سازی کرد، از جمله کانال ها.

مرور[ویرایش]

فرستادن پیغام یک تکنیک برای فراخوانی رفتار (مثلاً اجرای یک برنامه) روی یک کامپیوتر است. در روش فرستادن پیغام، برخلاف تکنیک مرسوم فراخوانی یک برنامه با استفاده از نام، از یک مدل اشیائی برای افتراق تابع کلی از پیاده سازی های خاص استفاده می شود. برنامه ی فراخواننده یک پیغام می فرستد و روی شیء مورد نظر تکیه می کند تا کد مناسب را انتخاب و اجرا کند. توجیه استفاده از یک لایه بینابینی اساساً در دو مقوله قرار می گیرد: بسته بندی(به انگلیسی: encapsulation) و توزیع.
انکپسولیشن ایده ای است که در آن اشیاء نرم افزار باید قادر باشند خدماتی را روی سایر اشیا فراخوانی کنند، بدون اینکه بدانند یا توجه کنند که چگونه این سرویس ها پیاده سازی می شود. انکپسولیشن می‌تواند مقدار منطق کد گذاری را کم کند و قابلیت تعمیر سیستم ها را افزایش دهد. مثلاً یک توسعه دهنده به جای استفاده از عبارت if-then، برای تعیین اینکه کدام ساب روتین یا تابع را فراخوانی کند، می‌تواند فقط یک پیغام به شئ مورد نظر بفرستد و شیء مورد نظر بر اساس نوع خودش، کد مناسب را انتخاب خواهد کرد.
یکی از اولین مثال هایی که نشان داد، چگونه می توان از این روش استفاده کرد، مربوط به حوزه ی گرافیک کامپیوتری بود. پیچیدگی های مختلفی در رابطه با دستکاری اشیاء گرافیکی وجود دارد. برای مثال، صرف استفاده از فرمول مناسب برای محاسبه ی مساحت یک شیء محصور، می تواند بسته به اینکه شکل مثلث، مربع ، بیضی یا دایره باشد، تغییر کند. در برنامه نویسی کامپیوتری قدیمی، این وضعیت منجر به عبارات طولانی IF-THEN می شد، این عبارات تست می کردند که شکل مورد نظر از چه نوع شئ ای است و کد مناسب را فراخوانی می کردند. روش شئ گرایانه برای حل این مشکل این است که، یک کلاس به نام شکل همراه با زیر کلاس هایی نظیر مربع و بیضی (که خود دارای زیر کلاس های مربع و دایره هستند) تعریف کنیم و سپس به راحتی یک پیغام را به هر شکلی بفرستیم و درخواست کنیم تا مساحت خود را محاسبه کند. سپس هر شئ مربوط به شکل، متد زیر-کلاس را، همراه با فرمول مناسب برای آن نوع از شئ فراخوانی خواهد کرد.

انتقال پیغام توزیع شده، برای توسعه دهندگان لایه ای از معماری فراهم می کند که بتوانند سرویس های مشترکی را برای ساختن سیستم هایی متشکل از زیر سیستم ها، که روی کامپیوترهای مختلف، در مکان های مختلف و در زمان های مختلف اجرا می شوند، به کار گیرند. زمانی که یک شیء توزیع‌شده یک پیغام را می فرستد، لایه ی پیغام رسانی می تواند مشکلاتی از این دست را مرتفع کند:
۱. پیدا کردن پروسه ها، با استفاده از سیستم های عامل مختلف و زبان های برنامه نویسی مختلف، در مکان‌های مختلفی که پیغام از آنجا منشأ گرفته است.
۲. ذخیره کردن پیغام در یک صف، در صورتی که شئ مسئول مدیریت پیغام، در حال حاضر در حال اجرا نباشد، و سپس، فراخوانی پیغام، در زمانیکه شئ مورد نظر موجود شد. همچنین ذخیره کردن نتیجه، در صورت لزوم، تا زمانیکه شیء فرستنده برای دریافت آن آماده شود.
۳. کنترل کردن الزامات تراکنشی مختلف برای تراکنش های توزیع شده، مثلاً تست ACID بر روی داده.

انتقال پیغام همگام و ناهمگام[ویرایش]

انتقال پیغام همگام[ویرایش]

انتقال پیغام همگام بین اشیائی رخ می‌دهد که به صورت همزمان اجرا می شوند. این روش توسط زبان های برنامه نویسی شئ گرا، نظیر جاوا و Smalltalk استفاده می شود.
پیغام رسانی همگام، شبیه فراخوانی همگام تابع است. همچنانکه فراخواننده ی تابع صبر می‌کند تا تابع کامل شود، پروسه ی فرستنده صبر می‌کند تا پروسه ی گیرنده کامل شود. این وضعیت می تواند در برخی موارد ارتباط همگام را نامیسر کند. برای مثال، سیستم های توزیع شده ی بزرگ ممکن است به اندازه‌ای خوب عمل نکنند تا قابل استفاده باشند. این سیستم های توزیع شده بزرگ، ممکن است نیاز باشد تا زمانی که برخی از زیر سیستم های آنها برای تعمیرات متوقف شده اند، بتوانند کار کنند.
یک سازمان تجاری شلوغ را در نظر بگیرید که دارای صد کامپیوتر رومیزی است که فقط با استفاده از فرستادن پیغام همگام به یکدیگر ایمیل می فرستند. در این حالت اگر یک کارمند، کامپیوتر خود را خاموش کند می تواند باعث شود تا ۹۹ کامپیوتر دیگر، تا زمانیکه کارمند مورد نظر مجدداً کامپیوتر خود را روشن کند تا یک ایمیل را پردازش کند، متوقف شوند.

انتقال پیغام ناهمگام[ویرایش]

در رابطه با انتقال پیغام ناهمگام، شئ گیرنده در زمانیکه شیء درخواست کننده پیغام مورد نظر را می فرستد، می تواند خاموش یا مشغول باشد. در مقایسه ی مجدد با فراخوانی تابع، این حالت شبیه یک فراخوانی تابع است که بلافاصله برمی گردد و منتظر نمی ماند تا تابع مورد فراخوانی کامل شود. پیغام ها به یک صف فرستاده می شوند و در آنجا ذخیره می شوند تا زمانیکه پروسه ی دریافت کننده، آن ها را درخواست کند. پروسه ی دریافت کننده، پیغام های خود را پردازش می کند و نتایج را به صف می فرستد. نتایج موجود در این صف توسط پروسه ی اولیه یا برخی پروسه های بعدی مشخص شده برداشته می شوند.
پیغام رسانی ناهمگام، نیازمند قابلیت های اضافه برای ذخیره کردن و ارسال مجدد داده برای سیستم هایی است که ممکن است به طور همزمان اجرا نشوند و به طور کلی، توسط یک لایه ی بینابینی نرم‌افزاری (که معمولاً میان افزار نام دارد) اجرا می شود. یک نوع معمول آن، میان افزار مبتنی بر پیغام (به انگلیسی: Message-oriented middleware) است.
بافری که برای ارتباط ناهمگام لازم است، در صورتی که پر شود، می تواند مشکل ساز شود. باید تصمیم گیری شود که آیا فرستنده مسدود شود یا اینکه پیغام های بعدی دور انداخته شوند. مسدود کردن فرستنده ممکن است منجر به بن بست شود. اگر پیغام ها دور انداخته شوند در این صورت ارتباط دیگر قابل اعتماد نیست.

هیبریدها[ویرایش]

می توان با استفاده از یک همگام ساز، ارتباط همگام را روی ارتباط ناهمگام سوار کرد. برای مثال همگام ساز آلفا، به این شکل کار می‌کند که فرستنده باید همیشه منتظر یک پیغام تایید از سوی گیرنده باشد. فرستنده فقط زمانی می‌تواند پیغام بعدی را بفرستد که برای پیغام قبلی خود تاییدیه دریافت کرده باشد. از سوی دیگر، ارتباط ناهمگام را نیز می‌توان روی ارتباط همگام سوار کرد. برای مثال، میکروکرنل های جدید، به طور کلی، فقط یک عنصر پیغام رسانی همگام را فراهم می کنند. پیغام رسانی ناهمگام را می‌توان با استفاده از ریسه های کمک کننده روی آن سوار کرد.

اشیا توزیع شده[ویرایش]

سیستمهای فرستادن پیغام، یا از اشیاء توزیع شده و یا از اشیای محلی استفاده می کنند. در رابطه با اشیاء توزیع شده، فرستنده و گیرنده ممکن است روی کامپیوتر های مختلفی باشند و در حال اجرای سیستم های عامل متفاوتی باشند و از زبان‌های برنامه‌نویسی مختلفی استفاده کنند و ... . در این مورد، لایه ی گذرگاه، مسئول جزئیات مربوط به تبدیل داده از یک سیستم به سیستم دیگر، فرستادن و دریافت داده های بین شبکه ای و ... است. پروتکل رویه ای دور (RPC) در یونیکس، مثالی قدیمی از این دست است. توجه داشته باشید که در این نوع از فرستادن پیغام، الزامی وجود ندارد که گیرنده یا فرستنده از برنامه نویسی شئ گرا استفاده کنند.
مثال هایی از سیستم هایی که از اشیاء توزیع شده پشتیبانی می کنند عبارتند از:  Emerald, ONC RPC, CORBA, Java RMI, DCOM, SOAP, .NET Remoting, CTOS, QNX Neutrino RTOS, OpenBinder  و D-Bus. سیستم های اشیاء توزیع شده را، سیستم های بدون اشتراک نیز می نامند، زیرا فرم انتزاعی فرستادن پیام، باعث مخفی شدن تغییرات وضعیتی ای می شود که ممکن است در پیاده سازی فرستادن پیغام ها استفاده شود.
انتقال پیغام توزیع شده یا ناهمگام، در مقایسه با فراخوان یک رویه، دارای سربار بیشتری است. در فرستادن پیغام، آرگومان ها باید در پیغام جدید کپی شوند. برخی آرگومان ها می توانند حاوی داده هایی به اندازه مگابایت باشند که همه ی آنها باید کپی شده و به شیء دریافت کننده منتقل شوند.
فراخوان های رویه ای مرسوم، از لحاظ استفاده از حافظه، زمان انتقال، و محلی بودن، با فرستادن پیغام تفاوت دارند. معمولاً آرگومان ها، به وسیله ی رجیسترهای دارای کاربرد عمومی به گیرنده داده می شوند، که در این حالت، نیاز به فضای ذخیره اضافی یا زمان انتقال نمی باشد. آرگومان ها همچنین معمولاً در یک لیست پارامتری که حاوی آدرسهای آرگومان ها (چندین بیت) است، به گیرنده داده می‌شوند. فرستادن آدرس برای سیستم های توزیع شده امکان پذیر نیست، زیرا این سیستم ها از فضاهای آدرس مجزا استفاده می کنند.
مرورگرهای وب و سرورهای وب، مثال هایی از پروسه هایی هستند که به شیوه ی فرستادن پیغام با یکدیگر ارتباط برقرار می‌کنند. یک URL، مثالی از ارجاع به یک منبع، بدون آشکار کردن محتویات داخلی پروسه است. یک فراخوان ساب روتین، یا فراخوان متد، تا زمانیکه محاسبه ی فراخوانی شده خاتمه نیافته است، خارج نخواهد شد.
این در حالیست که، فرستادن پیغام ناهمگام ممکن است منجر به پاسخی شود که پس از گذشت زمان چشمگیری از فرستاده شدن پیغام درخواست، می رسد.
به طور کلی، یک مدیریت کننده ی پیغام، پیغام هایی را از بیش از یک فرستنده پردازش خواهد کرد. این بدان معنی است که، وضعیت آن می تواند به دلایلی نامرتبط با رفتار یک فرستنده یا پروسه ی مشتری(کلاینت) تغییر کند، که تفاوت بسیاری با رفتار معمول  شئ ای دارد که متد ها بر روی این فراخوانی می شوند. این انتظار را داریم که مورد دوم، بین فراخوانی های متد، در وضعیت مشابهی باقی بماند. به عبارت دیگر، مدیریت کننده پیغام، رفتاری مشابه با یک شئ تغییر پذیر(volatile) دارد.

منابع[ویرایش]

https://en.wikipedia.org/wiki/Message_passing