عکس پیش‌فرض نوشته

در سیستم های توزیعی، مواردی وجود دارند که انتقال برنامه ها، حتی در حین اجرای آنها، باعث ساده شدن طرح سیستم های توزیعی خواهد شد.

در چند مطلب گذشته در مورد مهاجرت قطعه کد اجرا صحبت کردیم، اما قطعه منبع نیز نیازمند توجه است.

آنچه اکثراً مهاجرت کد را به امری دشوار تبدیل میکند، این است که نمیتوان قطعه منبع را به راحتی و بدون هیچ تغییری همراه با قطعه های دیگر انتقال داد.

مهاجرت منابع محلی در سیستم های توزیع شده 

به عنوان مثال، فرآیندی را فرض کنید که مرجعی به یک پورت TCP خاص دارد و از طریق آن با فرآیندهای (راه دور) دیگر ارتباط برقرار میکند؛ این ارجاع در قطعه منبع نگهداری میشود.

اگر این فرآیند به محل دیگری انتقال یابد، باید پورت قبلی را رها کرده و یک پورت جدید در مقصد درخواست کند.

در موارد دیگر، انتقال ارجاع لزوماً مشکل ساز نخواهد بود؛ برای مثال، ارجاع به یک فایل از طریق یک URL مطلق بدون در نظر گرفتن ماشینی که فرآیند صاحب URL در آن اقامت دارد، همچنان معتبر خواهد ماند.

 

برای درک اثرات مهاجرت کد بر قطعه منبع، فاگتا و همکاران (در سال 1998) سه نوع پیوند فرآیند به منبع را شناسایی کرده اند.

قوی ترین پیوند هنگامی است که یک فرآیند از طریق شناسه خود به منبع ارجاع کند، که به آن پیوند توسط شناسه (Binding by Identifier) گفته میشود؛ در این حالت، فرآیند دقیقاً نیازمند همان منبع ارجاع داده شده خواهد بود و نه چیز دیگر!

به عنوان نمونه ای از این نوع پیوند، میتوان به مواردی اشاره کرد که فرآیند برای ارجاع به یک وب سایت خاص از URL آن استفاده کند، یا هنگامی که به وسیله آدرس اینترنتی به یک خدمتگزار FTP ارجاع میکند.

بر پایه همین دیدگاه، ارجاعات به نقاط پایانی ارتباطی محلی نمونه دیگری از پیوند توسط شناسه محسوب میشوند.

 

شکل ضعیف تر پیوند فرآیند به منبع هنگامی است که فقط مقدار یک منبع مورد نیاز باشد، که به آن پیوند توسط مقدار (Binding by Value) میگویند.

در این حالت، اگر یک منبع دیگر مقداری برابر با مقدار منبع قبلی ارائه کند، اجرای فرآیند دستخوش تغییر نخواهد شد.

یکی از نمونه های این نوع پیوند هنگامی است که یک برنامه برای اجرا شدن به کتابخانه های استاندارد (مثلاً در برنامه نویسی C یا java) تکیه میکند.

این قبیل کتابخانه ها بایستی همواره به صورت محلی قابل دسترس باشند، اما ممکن است محل دقیق آنها در سیستم فایل محلی سایت های مختلف، متفاوت باشد.

برای اجرای مناسب و موفقیت آمیز چنین فرآیندی، نه فایل ها، بلکه محتوای آنها برای ما اهمیت دارد.

 

ضعیف ترین و آخرین شکل پیوند هنگامی است که فرآیند فقط نیازمند یک منبع از نوعی مشخص باشد، که به آن پیوند توسط نوع (Binding by Type) گفته میشود.

از نمونه های این نوع پیوند میتوان به ارجاعات به دستگاه های محلی از قبیل صفحه نمایش، چاپگر و … اشاره کرد.

 

برای مهاجرت کد اکثراً لازم است که ارجاعات به منابع را تغییر دهیم، اما نمیتوانیم بر چگونگی پیوند فرآیند به منبع تاثیر بگذاریم.

چرایی و چگونگی تغییر ارجاع به یک منبع بستگی به آن دارد که آیا میتوان منبع را به همراه کد به ماشین هدف انتقال داد یا خیر ؟!

به عبارت دیگر، باید پیوند منبع به ماشین را در نظر گرفته و بین حالت های مختلف آن تمایز قائل شویم.

یک منبع نابسته (Unattached Resource) را میتوان به راحتی بین ماشین های مختلف جابجا کرد؛ فایل های داده برنامه از این نوع هستند که معمولاً باید به همراه آن مهاجرت کنند.

از طرف دیگر، امکان انتقال یا کپی کردن منبع وابسته (Fastened Resource) وجود دارد، ولی ممکن است هزینه نسبتاً زیادی داشته باشد (مانند پایگاه داده محلی و وب سایت ها)

هر چند این منابع، در تئوری، به ماشین قعلی خود وابسته نیستند؛ اما در اکثر موارد انتقال آنها به محیط های دیگر امکان پذیر نیست.

یک منبع ثابت (Fixed Resource) نیز به شدت به ماشین یا محیط خاص خود متصل بوده و اساساً قابل انتقال نیست. (از قبیل دستگاه های محلی و نقاط پایانی ارتباطات محلی)

 

ترکیب سه نوع فرآیند به منبع با سه نوع پیوند به ماشین منجر به 9 ترکیب مختلف میشود که باید در مهاجرت کد مدنظر قرار گیرند.

اقداماتی که باید هنگام مهاجرت کد به ماشین دیگر با توجه به ارجاعات به منابع محلی انجام شود، در جدول زیر مشخص شده است.

مهاجرت کد با ارجاع منابع محلی

 

بهتر است ابتدا نگاهی به حالات مختلف پیوند فرآیند به منبع توسط شناسه داشته باشیم.

در صورت نابسته بودن منبع، معمولاً بهترین گزینه جابجایی آن به وسیله کد در حال مهاجرت است. با این وجود، هنگامی که منبع با فرآیندهای دیگر مشترک باشد، یک راه حل ایجاد یک ارجاع جهانی (Global Reference) است، یعنی ارجاعی که بتواند از مرزهای ماشین عبور کند.

یک نمونه از چنین مراجعی URL ها هستند.

در صورتی که منبع وابسته شده یا ثابت شده باشد، بهترین را حل باز هم ایجاد ارجاع جهانی خواهد بود.

 

باید بدانیم که ایجاد ارجاع جهانی ممکن است مستلزم اقداماتی بیش از استفاده از URL ها بوده، که استفاده از چنین ارجاعی میتواند بسیار هزینه بر باشد؛ به عنوان مثال، برنامه ای را فرض کنید که تصاویری با کیفیت بالا را برای یک ایستگاه کاری چند رسانه ای تولید میکند.

تولید تصاویر با کیفیت بالا بی درنگ نیازمند کار محاسباتی زیادی بوده و به همین دلیل ممکن است برنامه به یک خدمتگزار محاسباتی کارا انتقال داده شود.

برقراری ارجاع جهانی برای ایستگاه کاری چند رسانه ای، به معنای ایجاد یک مسیر ارتباطی بین خدمتگزار محاسباتی و ایستگاه کاری است.

علاوه بر این، خدمتگزار و ایستگاه کاری هر دو نیازمند انجام پردازش های زیادی برای دست یابی به پهنای باند مورد نیاز جهت انتقال تصاویر هستند.

در نتیجه، ممکن است انتقال برنامه به خدمتگزار محاسباتی، به دلیل هزینه بالای Global Reference، ایده چندان خوبی به نظر نرسد.

 

برای درک بهتر این موضوع و به عنوان مثالی دیگر از مواردی که برقراری Global Reference ساده نیست، میتوان به مهاجرت فرآیندی اشاره کرد که از نقطه پایانی ارتباط محلی استفاده میکند.

در این حالت، ما با منبع ثابتی مواجه هستیم که فرآیند توسط شناسه به آن پیوند دارد. اساساً دو راه حل در این رابطه وجود دارد.

راه حل اول آن است که فرآیند پس از مهاجرت، ضمن ایجاد اتصال به ماشین منبع، فرآیند جداگانه ای را در ماشین منبع نصب کرده و به کمک آن تمام پیام های ورودی، به سمت این فرآیند مهاجر هدایت شوند.

نقطه ضعف عمده این رهیافت آن است که در صورتی که ماشین منبع دچار اشکال شود، ممکن است ارتباط با فرآیند مهاجر قطع شود.

راه حل دیگر آن است که تمام فرآیندهایی که قبلاً با این فرآیند مهاجر ارتباط برقرار کرده بودند، Global Reference خود را تغییر داده و پیام های جدید را به نقطه پایانی ارتباطی جدید در ماشین هدف ارسال کنند.

 

در مبحث Binding by Value با شکل متفاوتی مواجه هستیم.

ابتدا یک منبع ثابت را در نظر بگیرید؛ ترکیب این منبع ثابت و پیوند توسط مقدار، هنگامی رخ میدهد که فرآیندی فرض را بر این بگذارد که میتواند از حافظه مشترک بین فرآیندها استفاده کند.

ایجاد ارجاع جهانی در این حالت به معنای لزوم پیاده سازی شکل توزیعی از حافظه اشتراکی است. در اغلب موارد، این راه حل قابل اجرا و موثر نیست.

 

منابع وابسته که بر اساس مقدارشان ارجاع داده میشوند، نوعاً کتابخانه های زمانِ اجرا (Runtime) هستند.

معمولاً کپی های این قبیل منابع روی ماشین هدف قابل دستیابی بوده و یا باید تا پیش از مهاجرت کد به طریقی کپی شوند.

در صورت زیاد بودن حجم داده های کپی شونده، مثلاً در یک برنامه فرهنگ لغت یا جستجوی واژه در سیستم های نوشتاری، ایجاد Global Reference گزینه بهتری خواهد بود.

 

ساده ترین حالت ، مربوط به منابع نابسته است. به استثنای مواردی که یک منبع بین چند فرآیند مشترک ست، بهترین راه حل کپی کردن (یا انتقال) منبع به مقصد جدید می باشد.

اما اگر این یک منبع مشترک باشد، ایجاد ارجاع جهانی تنها گزینه موجود محسوب خواهد شد.

 

آخرین حالت مربوط به روش Binding by Type است. صرف نظر از نوع پیوند منبع به ماشین، راه حل واضح پیوند مجدد فرآیند مهاجر به یک منبع محلی از همان نوع است.

تنها در صورت فقدان چنین منبعی است که باید منبع اصلی را در ماشین مقصد کپی کرده یا انتقال دهیم و یا یک Global Reference برای آن ایجاد کنیم.

این آموزش بیش از ۳ سال قبل ارسال شده و اکنون در لیست به‌روزرسانی‌های سایت قرار دارد. اگر پیشنهاد یا انتقادی برای بهبود آموزش دارید، خوشحال می‌شیم به ما اطلاع بدهید.