Inter Process Communication (IPC)
Adolf Macro (SPAM GEEK)ارتباط بین فرآیند ها یا IPC :
در IPC سه فاکتور اصلی وجود دارند که شامل موارد زیر است :
1 . نحوه تبادل اطلاعات
2 . شرایط رقابتی
3 . هنگامسازی فرایند ها
تمامی موارد بالا که تحت عنوان فاکتور های اصلی Inter Process Communication مطرح شدند شامل نخ ها نیز نیز میشوند ؛ اما با این تفاوت که ارتباط بین نخ ها به دلیل استفاده آنها از یک فضای آدرس سریع تر صورت میگیرد.
در شرایط معمولی فرآیند ها به صورت مستقیم توانایی دسترسی به فضای آدرس یکدیگر را ندارند و برای ارتباط باهم از طریق هسته تبادل اطلاعات میکنند ، تا هسته امنیت فرآیند ها را تضمین نماید.
آنها برای تبادل اطلاعات از روش هایی مانند pipe ها ، تبادل پیغام و اشتراک گذاری فایل استفاده میکنند و چون همه این موارد به واسطه اجرای فراخوان های سیستمی وقت گیر هستنند این روش تبادل اطلاعات برای فرایند های معمولی نسبت به نخهایی که در یک فضای آدرس هستند ، وقتگیر تر است.
اما نخهایی که دارای فضای آدرس متفاوتی هستند ( مطعلق به یک فرایند نیستند ) در چنین شرایطی از همان روش ارتباطی مشابه استفاده میکنند.
- شرایط رقابتی :
در بعضی از سیستم های عامل فرایند یا نخ ها با یکدیگر کار میکنند که میتوانند فایل های مشترک یا متغیر های مشترک ویا ... را باهم به اشتراک بگذارند و نهایتاً r/w صورت بگیرد.
مثال Printer Spooler :
بهترین و بارزترین مثال برای فهم شرایط رقابتی و نواحی بحرانی printer spooler است ؛ در واقع وقتی یک فرآیند میخواهد فایلی را print نماید کافی است اشارهگری به فایل مورد نظر را در یک دایرکتوری spooler مخصوص قرار دهد و سپس فرآیند دیگری به نام printer daemon وجود دارد که به طور متناوب به این داریکتوری دسترسی پیدا میکند و اگر فایلی در آن قرار داشته باشد آنرا print میکند و نامش را از دایرکتوری spooler حذف میکند.
تصور کنید دایرکتوری spooler ما دارای ردیف های بسیاری است ؛ هر یک از این ردیف ها را بایک شماره در نظر بگیرید که در هر یک از این شماره ها نام یک فایلی که قرار است print شود ، قرار دارد .
و همچنین دو متغیر in و out در نظر داشته باشید که out در واقع نام فایلی است که قرار است چاپ شود و in به ردیف خالی شده از دایرکتوری spooler اشاره میکند .
این دو متغیر در یک فایل متنی دو کلمه ای قرار دارند که به راحتی توسط تمامی فرآیند ها قابل دسترسی است .
حال فرض کنید که در یک لحظه خاص ردیف ۱۰ الی ۳ خالی است و ردیف ۴ تا ۶ پر است ؛ در همین شرایط در نظر داشته باشید که اگر فرآیند A , B در آن لحظه به صورت همزمان تصمیم بر قرار دادن فایلی داخل دایرکتوری spooler بگیرند ، در چنین شرایطی مشکلاتی وجود دارد که به شرح زیر است:
در واقع فرآیند A متغیر in را ( که محتویاتش را ۷ در نظر گرفتیم ) میخواند و در متغیر local خود ذخیره میکند که این متغیر را localA مینامیم ؛ در همین حین توسط کرنل تصمیم به ایجاد interrupt با توجه به فاکتور های اولویت بندی تعیریف شده ایجاد میشود ( یعنی دقیقا بعد از ذخیرهسازی عدد ۷ در متغیر localA و قبل از شروع پردازش آن توسط printer spooler ).
حال در همین حین در نظر بگیرید که کرنل تصمیم به اجرای فرآیند B میگیرد و B نیز از متغیر in که ۷ بود عدد ۷ را در localB ذخیره میکند و نهایتا پردازش فرآیند B به اتمام میرسد و فرآیند A از همانجا که دچار interrupt شدهبود ادامه پیدا میکند .
گفتیم فرآیند A بعد از ذخیره کردن متغیر in در localA دچار وقفه شدهبود ، پس دوباره این اطلاعات را نمیخواند و در نتیجه اطلاعات قبلی و بروز نشده را دارد و فرض میکند که متغیر localA هنوز هم ۷ است و این در حالی است که فرآیند B متغیر in را به عدد جدیدی تغییر داده است .
حال فرآیند A با توجه به اینکه در نظر دارد ردیف ۷ خالی است نام فایل خود را داخل آن قرار میدهد سپس متغیر out که همان localA+ 1 است را به ۸ تغییر میدهد.
به طوری کلی و مختصر در موارد ذکر شده فرآیند B فایلی در صف printer spooler قرار داد و این در حالی است که به دلیل وقفه ها و شرایط ذکر شده این فایل به طور کلی هیچوقت چاپ نمیشود.
PART 1
Telegram : @SpamGeeks