
هر چند مهاجرت کد به معنای جابجایی کد در بین ماشین هاست، این اصطلاح در واقع حوزه بزرگتری را شامل میشود.
به طور معمول، ارتباطات در سیستم های توزیع شده به موضوع تبادل داده بین فرآیندها می پردازد.
مهاجرت کد در گسترده ترین حالت، به موضوع جابجایی برنامه ها بین ماشین ها، با هدف اجرای این برنامه ها در مقصد انجام می پذیرد.
در برخی موارد، از جمله در مهاجرت فرآیند، وضعیت اجرای یک برنامه سیگنال های معوقه و بخش های دیگر محیط اجرایی آن هم باید انتقال داده شوند.
در مطالب گذشته در این مورد صحبت کردیم که چرا باید از مهاجرت کد در سیستم های توزیع شده استفاده کنیم، پیشنهاد میکنم قبل از مطالعه این مطلب حتما نگاهی به آن بیاندازید!
برای درک بهتر مدل های مهاجرت کد از چهارچوبی که در فاگتا و همکاران (1998) توصیف شده، استفاده میکنیم.
بر اساس این چهارچوب، هر فرآیند از سه قطعه تشکیل میشود.
قطعه کد (Code Segment) که بخش حاوی مجموعه دستورات تشکیل دهنده برنامه در حال اجراست.
قطعه منبع (Resource Segment) شامل ارجاعات به منابع خارجی مورد نیاز در فرآیند (از قبیل فایل ها، چاپگرها، دستگاه ها و …) است.
قطعه اجرا (Execution Segment) نیز برای ذخیره سازی وضعیت اجرای فعلی فرآیند (از جمله داده های خصوصی، پشته و البته شمارنده برنامه) به کار میرود.
مهاجرت کد در حالت حداقلی خود فقط نوعی جابجایی ضعیف (Weak Mobility) ارائه میکند.
در این مدل، فقط میتوان قطعه کد و در صورت لزوم برخی داده های آماده سازی اولیه را انتقال داد.
یکی از ویژگی های بارز جابجایی ضعیف آن است که برنامه انتقال یافته همواره از یکی از چندین موقعیت آغازکننده از پیش تعریف شده آغاز میشود.
به عنوان نمونه میتوان به اپلت های کوچک جاوا اشاره کرد که همواره از ابتدا اجرا میشوند.
مزیت این رویکرد در سادگی آن است. جابجایی ضعیف فقط نیازمند آن است که ماشین هدف قادر به اجرای کد باشد، که در نهایت به جابجایی کد منجر میشود. (این بحث در مهاجرت در سیستم های ناهمگن بیشتر قابل درک و بحث است!)
بر خلاف جابجایی ضعیف، در سیستم هایی که از جابجایی قوی (Strong Mobility) پشتیبانی میکنند، قطعه اجرا هم قابل انتقال است.
ویژگی بارز جابجایی قوی آن است که میتوان فرآیند در حال اجرا را وسط کار متوقف ساخته، به ماشین دیگری انتقال داد و سپس اجرای آن را از همانجا که متوقف شده بود مجدداً از سر گرفت.
مشخص است که هر چند جابجایی قوی عمومی تر از جابجایی ضعیف است، اما پیاده سازی آن بسیار مشکل تر است.
صرف نظر از اینکه جابجایی ضعیف باشد یا قوی، باید بین مهاجرتی که فرستنده آغازکننده آن است و مهاجرتی که گیرنده آن را آغاز میکند، تمایز قائل شد.
در مهاجرت آغاز شده توسط فرستنده (Sender-Initiated)، مهاجرت از ماشینی آغاز میشود که کد در آن اقامت داشته یا در حال اجراست.
نوعاً مهاجرت آغاز شده توسط فرستنده در هنگام بارگذاری برنامه ها به کامپیوتر خدمتگزار انجام میشود.
مثال دیگر، ارسال برنامه جستجو از طریق اینترنت به یک خدمتگزار پایگاه داده وب برای انجام پرس و جو در آن است.
در مهاجرت آغاز شده توسط گیرنده (Receiver-Initiated)، اقدام برای مهاجرت کد به وسیله ماشین هدف انجام میشود.
اپلت های جاوا نمونه ای از این رویکرد است.
مهاجرت آغاز شده توسط گیرنده ساده تر از مهاجرت آغاز شده توسط فرستنده است. در بسیاری از موارد، مهاجرت کد بین مشتری و خدمتگزار انجام میشود و مشتری آغازگر مهاجرت است.
بارگزاری ایمن کد به خدمتگزار، که در مهاجرت آغاز شده توسط فرستنده انجام میشود، غالباً مستلزم آن است که مشتری قبلاً در آن خدمتگزار ثبت نام کرده و احراز هویت (Authenticate) شده باشد.
به بیان دیگر، از آنجایی که مشتری به احتمال زیاد خواهان دسترسی به منابع خدمتگزار (از جمله دیسک) خواهد بود، لازم است خدمتگزار تمامی مشتری های خود را بشناسد. محافظت از چنین منابعی ضروری است.
بالعکس، بارگیری کد در حالت مهاجرت آغاز شده توسط گیرنده میتواند به طور ناشناس انجام شود.
علاوه بر آن، خدمتگزار معمولاً علاقه ای به منابع مشتری نداشته و مهاجرت کد به سمت مشتری فقط با هدف بهبود کارایی سمت مشتری انجام میشود.
از این رو، فقط تعداد معدودی از منابع از قبیل اتصالات شبکه و حافظه نیازمند محافظت هستند.
در حالت جابجایی ضعیف، بین اجرای کد مهاجرت کرده توسط فرآیند هدف و یا ایجاد فرآیند دیگر برای اجرای کد تفاوت وجود دارد.
به عنوان مثال، اپلت های جاوا صرفاً به وسیله جستجوگر وب (فرآیند هدف) بارگیری شده و در فضای آدرس مرورگر وب اجرا میشوند.
مزیت این رهیافت آن است که دیگر نیازی به ایجاد فرآیند دیگری نبوده و بدین ترتیب از ارتباط بیهوده با ماشین هدف جلوگیری میشود.
اما مهم ترین نقطه ضعف این است که فرآیند هدف بایستی در برابر اجراهای سهوی یا مغرضانه کد محافظت کند.
یک راه حل ساده آن است که اجازه دهیم تا سیستم عامل، فرآیند جداگانه ای برای اجرای کد مهاجر ایجاد کرده و مراقبت از آن را بر عهده گیرد.
توجه داشته باشید که این راه حل مشکلات دسترسی به منابع را حل نمیکند؛ بنابراین موضوع دسترسی به منابع همچنان نیازمند بررسی بیشتر است.
به جای جابجایی یک فرآیند در حال اجرا (جابجایی فرآیند)، جابجایی قوی را میتوان با همانندسازی راه دور (Remote Cloning) نیز پشتیبانی کرد.
برخلاف مهاجرت فرآیند، در این روش یک کپی دقیق از فرآیند اصلی که در همان زمان روی ماشین دیگری در حال اجراست، ایجاد میشود. فرآیند همانندسازی شده به طور موازی با فرآیند اصلی اجرا خواهد شد.
در سیستم های یونیکس، همانندسازی راه دور از طریق ایجاد فرآیند فرزند و ادامه یافتن آن روی یک ماشین دور انجام میشود.
مزیت مدل همانندسازی این است که بسیار شبیه آن جیزی است که هم اکنون در بسیاری از برنامه های کاربردی مورد استفاده قرار میگیرد.
تنها تفاوت این است که فرآیند همانندسازی شده روی یک ماشین دیگر اجرا میشود.
از این نقطه نظر، مهاجرت به روش همانندسازی روش ساده ای برای بهبود شفافیت توزیع محسوب میشود.
در حالت کلی میتوانیم دسته بندی زیر را برای روش های مختلف مهاجرت کد در سیستم های توزیعی داشته باشیم.
1- جابجایی ضعیف
- جابجایی آغاز شده توسط فرستنده (اجرا در فرآیند هدف / اجرا در فرآیند جداگانه)
- جابجایی آغاز شده توسط گیرنده (اجرا در فرایند هدف / اجرا در فرآیند جداگانه)
2- جابجایی قوی
- جابجایی آغاز شده توسط فرستنده (مهاجرت فرآیند / همانند سازی فرآیند)
- جابجایی آغاز شده توسط گیرنده (مهاجرت فرآیند / همانندسازی فرآیند)
خلاصه روش های مهاجرت کد در سیستم های توزیع شده:
این آموزش بیش از ۳ سال قبل ارسال شده و اکنون در لیست بهروزرسانیهای سایت قرار دارد. اگر پیشنهاد یا انتقادی برای بهبود آموزش دارید، خوشحال میشیم به ما اطلاع بدهید.
ممنون از مطالب خوبتون البته کاش با ذکر یک مثال بصور ت کامل مطلب رو بیشتر کامل میکردید
سلام؛ ممنون بابت نظرتون. حتماً در بهروزرسانی بعدی که طی ماه آینده انجام میشه حتماً یک مثال رو در حین آموزش استفاده میکنیم.
سپاس از شما
خوشحالم براتون مفید بوده. موفق باشید نوید عزیز