در سیستمهای چندنخی، بنبست زمانی رخ میدهد که فرآیندها قادر به ادامه اجرا نباشند زیرا منتظر منابعی هستند که توسط یکدیگر در یک زنجیرهی حلقوی نگه داشته شدهاند. بنبستها میتوانند عملکرد سیستم را به شدت تحت تأثیر قرار داده و باعث هنگ کردن برنامهها شوند. الگوریتمی به نام الگوریتم بانکداران «Banker’s algorithm» وجود دارد که در حذف بنبستها هنگام تخصیص ایمن منابع به فرآیندها در یک سیستم کامپیوتری استفاده میشود. این الگوریتم که توسط دایکسترا طراحی شده، تمامی منابع را به هر فرآیند اختصاص میدهد و از بروز تعارضات تخصیص منابع جلوگیری میکند.
در این مقاله، از سری مقالات آموزشی پی استور به بررسی نحوه عملکرد الگوریتم بانکداران در سیستم عامل، مراحل و نحوه کار آن پرداخته خواهد شد.
مقدمه
در سیستمهای کامپیوتری، یکی از مسائل حیاتی که در مدیریت منابع باید به آن توجه شود، جلوگیری از ایجاد بنبستها «Deadlock» و اطمینان از تخصیص ایمن منابع به فرآیندها است. الگوریتم بانکدار یا الگوریتم بانکر یکی از مهمترین روشها برای مدیریت تخصیص منابع و جلوگیری از بنبستها در سیستمهای عامل است. این الگوریتم با استفاده از بررسی وضعیت سیستم و پیشبینی وضعیتهای آینده، به سیستم کمک میکند تا منابع را به صورت ایمن به فرآیندها اختصاص دهد و از بروز مشکلاتی مانند بنبست جلوگیری کند. الگوریتم بانکر، مشابه با نحوه تصمیمگیری یک بانک در اعطای وام، منابع را به فرآیندها تخصیص میدهد و اطمینان حاصل میکند که سیستم در شرایط ایمن باقی میماند.
بنبست چیست؟
بنبست وضعیتی است که در آن چندین فرآیند بهطور نامحدود منتظر منابعی هستند که توسط یکدیگر نگه داشته شدهاند. بنبستها معمولاً زمانی رخ میدهند که چهار شرط بهطور همزمان برقرار باشند:
- انحصار متقابل «Mutual Exclusion»: هر منبع در یک زمان فقط میتواند در اختیار یک فرآیند باشد.
- نگهداری و انتظار «Hold and Wait»: فرآیندها حداقل یک منبع را نگه داشتهاند و همزمان در انتظار منابع بیشتری هستند.
- عدم پیشدستی «No Preemption»: منابع نمیتوانند به زور از یک فرآیند گرفته شوند.
- انتظار حلقوی «Circular Wait»: یک زنجیره حلقوی از فرآیندها وجود دارد که در آن هر فرآیند منتظر منبعی است که توسط فرآیند بعدی در زنجیره نگه داشته شده است.
مثال از یک بنبست
دو فرآیند P1 و P2 و دو منبع R1 و R2 را در نظر بگیرید:
- P1 منبع R1 را به دست میآورد و سپس درخواست R2 میکند.
- P2 منبع R2 را به دست میآورد و سپس درخواست R1 میکند.
- در این حالت، هر دو فرآیند منتظر منبعی هستند که در اختیار دیگری است، و این منجر به وقوع یک بنبست میشود.
الگوریتم بانکدار
الگوریتم بانکدار یک الگوریتم جلوگیری از بنبست است که اطمینان حاصل میکند سیستم هرگز وارد وضعیت بنبست نشود. این الگوریتم درخواستهای تخصیص منابع را بهصورت شبیهسازیشده بررسی میکند و تعیین میکند که آیا پذیرش درخواست باعث باقی ماندن سیستم در وضعیت ایمن میشود یا خیر (یعنی وضعیتی که در آن تمام فرآیندها میتوانند اجرای خود را بهپایان برسانند).
الگوریتم بر پایه سه ماتریس کار میکند:
- Maximum «حداکثر»: بیشترین تعداد منابعی که هر فرآیند ممکن است نیاز داشته باشد.
- Allocated «تخصیصدادهشده»: تعداد منابعی که در حال حاضر به هر فرآیند تخصیص یافتهاند.
- Available «قابل دسترس»: تعداد منابع آزادی که در حال حاضر در سیستم موجود هستند.
سپس الگوریتم بررسی میکند که آیا تخصیص درخواستشده، سیستم را در وضعیتی قرار میدهد که در آن تمام فرآیندها در نهایت بتوانند بدون ورود به بنبست کار خود را به پایان برسانند یا نه.
بررسی کلی الگوریتم بانکر
- وضعیت S تمامی آزمایشها یا فعالیتهای ممکن را قبل از تعیین اینکه آیا باید منابع به هر فرآیندی تخصیص داده شود یا نه، بررسی میکند.
- این الگوریتم به سیستمعامل این امکان را میدهد که منابع را میان تمامی فرآیندها به اشتراک بگذارد بدون اینکه بنبست یا وضعیت بحرانی ایجاد شود.
- این الگوریتم به نام عملیات بانکی نامگذاری شده است زیرا مشابه فرآیندی است که یک بانک برای تعیین اینکه آیا میتواند وامها را به طور ایمن تأیید کند یا خیر، انجام میدهد.
مثال دنیای واقعی
تصور کنید یک بانک با مبلغ T از پول و n حسابدار وجود دارد. در برخی مواقع، هر زمان که یکی از حسابداران درخواست وام کند:
- بانک مبلغ درخواستی را از کل موجودی برای هر برداشت بعدی برداشت میکند.
- بانک بررسی میکند که آیا مبلغ موجود برای برداشت کافی است تا تمامی درخواستها/برداشتهای آینده را تأمین کند.
- اگر پول کافی موجود باشد (یعنی موجودی نقدی بیشتر از T باشد)، وام را اعطا میکند.
- این اطمینان میدهد که بانک در هنگام دریافت درخواستهای بعدی با مشکلات عملیاتی مواجه نخواهد شد.
مراحل الگوریتم بانکدار
- بررسی تطابق درخواست با نیاز حداکثری: منابع درخواستشده نباید بیش از مقدار حداکثری اعلامشده توسط فرآیند باشد.
- بررسی موجود بودن منابع: اگر منابع درخواستشده بیش از مقدار منابع موجود در سیستم باشد، فرآیند باید منتظر بماند.
- تخصیص موقت منابع (شبیهسازی): تخصیص منابع را بهصورت موقت شبیهسازی کرده و ماتریسهای Available «قابل دسترس»، Allocated «تخصیصدادهشده» و Need «نیاز باقیمانده» را بهروزرسانی میکنیم.
- بررسی وضعیت ایمن: بررسی میکنیم که آیا این تخصیص موقت سیستم را در وضعیت ایمنی قرار میدهد که در آن تمام فرآیندها بتوانند اجرای خود را بهپایان برسانند یا نه. اگر پاسخ منفی باشد، تخصیص را به حالت قبل بازمیگردانیم.
- تصمیمگیری نهایی: اگر سیستم پس از تخصیص همچنان در وضعیت ایمن باقی بماند، منابع به فرآیند تخصیص داده میشوند؛ در غیر این صورت، درخواست رد میشود.
الگوریتم بانکداران در سیستم عامل
به همین ترتیب، در یک سیستمعامل:
- هنگامی که یک فرآیند جدید ایجاد میشود، باید تمام اطلاعات حیاتی مانند فرآیندهایی که به زودی اجرا خواهند شد، درخواستهای منابع و تاخیرهای احتمالی را ارائه دهد.
- این اطلاعات به سیستمعامل کمک میکند تا تصمیم بگیرد کدام توالی از اجراهای فرآیند باید ادامه یابد تا از بنبست جلوگیری شود.
- از آنجا که ترتیب اجرایی که باید برای جلوگیری از بنبستها انجام شود، تعریف شده است، الگوریتم بنکر معمولاً به عنوان الگوریتم اجتناب از بنبست یا شناسایی بنبست در سیستمعاملها در نظر گرفته میشود.
مزایای الگوریتم بانکداران در سیستم عامل
ویژگیهای اساسی الگوریتم banker به شرح زیر است:
- این الگوریتم شامل منابع مختلفی است که نیازهای هر فرآیند را برآورده میکند.
- هر فرآیند باید اطلاعاتی را به سیستمعامل برای درخواستهای منابع آینده، تعداد منابع و مدت زمان نگهداری آنها ارائه دهد.
- الگوریتم banker به سیستمعامل کمک میکند تا درخواستهای فرآیندها برای هر نوع منبع در سیستم کامپیوتری را مدیریت و کنترل کند.
- الگوریتم دارای ویژگی منبع حداکثر است که نشان میدهد هر فرآیند میتواند حداکثر تعداد منابع را در یک سیستم نگه دارد.
- به این معنی است که در الگوریتم بانکدار، منابع تنها در صورتی اعطا میشوند که هیچگونه امکان بنبست وجود نداشته باشد. بنابراین، اطمینان میدهد که سیستم با عملکرد بهینه عمل میکند.
- الگوریتم بنکر از نگهداری بیمورد منابع توسط هر فرآیند جلوگیری میکند زیرا الگوریتم بررسی میکند که آیا اعطای منابع امکانپذیر است یا خیر.
- از آنجا که الگوریتم بنکر تمامی مشکلات احتمالی را قبل از تخصیص منابع تجزیه و تحلیل میکند، پیادهسازی آن باعث میشود سیستمعامل پایدارتر و قابل اعتمادتر شود.
معایب الگوریتم بانکداران در سیستم عامل
معایب الگوریتم بانکر عبارتند از:
- این الگوریتم نیاز به یک تعداد ثابت از فرآیندها دارد و هیچ فرآیند اضافی نمیتواند در حین اجرای فرآیند در سیستم شروع شود.
- الگوریتم بانکر دیگر به فرآیندها اجازه نمیدهد که نیازهای حداکثری خود را در حین پردازش وظایف خود تغییر دهند.
- هر فرآیند باید نیازهای حداکثری منابع خود را از پیش برای سیستم اعلام کند.
- تعداد درخواستهای منابع ممکن است در زمان معینی اعطا شود، اما زمان محدود برای تخصیص منابع یک سال است.
- مدیریت الگوریتم banker میتواند پیچیده باشد، بهویژه در سیستمهایی با تعداد زیاد فرآیندها و منابع. این موضوع به نوبه خود منجر به افزایش بار اضافی میشود.
- در محیطهای پویا که معمولاً فرآیندها و نیازهای منابع به طور مکرر تغییر میکنند، الگوریتم بنکر خیلی انعطافپذیر نیست و قادر به مدیریت تخصیص منابع پویا به خوبی نیست.
- از آنجا که در هر مرحله الگوریتم بانکر وضعیتهای ایمن را قبل از تخصیص منابع بررسی میکند، تمایل دارد که مصرف حافظه و پردازش زیادی داشته باشد و بنابراین برای سیستمهای بزرگ کارآمد نیست.
هنگامی که با الگوریتم بانکر کار میشود، این الگوریتم نیاز دارد تا سه مورد را بداند:
- هر فرآیند چقدر میتواند برای هر منبع در سیستم درخواست کند. این مقدار با [MAX] نشان داده میشود.
- هر فرآیند در حال حاضر چقدر از هر منبع را در سیستم نگه میدارد. این مقدار با [ALLOCATED] نشان داده میشود.
- تعداد منابع موجود در سیستم که در حال حاضر در دسترس است. این مقدار با [AVAILABLE] نشان داده میشود.
ساختارهای دادهای مهم در الگوریتم بانکدار
فرض کنید n تعداد فرآیندها و m تعداد انواع منابعی است که در یک سیستم کامپیوتری استفاده میشود.
- Available: این یک آرایه به طول m است که هر نوع منبع موجود در سیستم را تعریف میکند. وقتی Available[j] = K باشد، به این معنی است که K نمونه از نوع منبع R[j] در سیستم موجود است.
- Max: این یک ماتریس [n x m] است که نشان میدهد هر فرآیند P[i] میتواند حداکثر تعداد منابع R[j] (هر نوع) را در سیستم ذخیره کند.
- Allocation: این یک ماتریس از اندازه m x n است که نشان میدهد هر نوع منبع به طور فعلی به هر فرآیند در سیستم تخصیص داده شده است. وقتی Allocation[i, j] = K باشد، به این معنی است که فرآیند P[i] به طور فعلی K نمونه از منابع نوع R[j] در سیستم تخصیص یافته است.
- Need: این یک ماتریس M x N است که نمایانگر تعداد منابع باقیمانده برای هر فرآیند است. وقتی Need[i][j] = K باشد، به این معنی است که فرآیند P[i] ممکن است K نمونه دیگر از منابع نوع R[j] نیاز داشته باشد تا کار محول شده خود را تکمیل کند.
Need[i][j] = Max[i][j] – Allocation[i][j]. - Finish: این یک بردار از اندازه m است که شامل یک مقدار بولی (صحیح/غلط) است که نشان میدهد آیا فرآیند به منابع درخواستی خود تخصیص داده شده است و پس از اتمام کارش، تمامی منابع آزاد شدهاند.
الگوریتم بنکر اساساً ترکیبی از دو مولفه است:
- الگوریتم ایمنی: تعیین میکند که آیا سیستم در وضعیت ایمن است، به این معنی که تمامی فرآیندها در نهایت بدون ایجاد بنبست اجرا خواهند شد.
- الگوریتم درخواست منابع: تصمیم میگیرد که آیا اعطای درخواست برای تخصیص منابع بیشتر به یک فرآیند بدون نقض ایمنی، امن است یا خیر.
الگوریتم ایمنی
وضعیت ایمن به حالتی گفته میشود که از آن سیستم میتواند یک توالی از فرآیندها را بدون ایجاد بنبست اجرا کند. سیستمی گفته میشود ایمن است اگر تمامی فرآیندهای آن بتوانند در یک توالی خاص به طور ایمن اجرا شوند.
این الگوریتم ایمنی است که برای بررسی اینکه آیا سیستم در وضعیت ایمن است یا خیر یا اینکه آیا سیستم توالی ایمن را در الگوریتم banker دنبال میکند، استفاده میشود:
در این الگوریتم ایمنی دو بردار، Work و Finish، با طولهای m و n وجود دارند.
مقداردهی اولیه:
- Work: ابتدا Work را برابر با Available قرار میدهیم، جایی که Available آرایهای است که تعداد نمونههای موجود برای هر نوع منبع را ذخیره میکند.
- Finish: آرایه Finish را برای هر فرآیند به صورتی مقداردهی میکنیم که Finish[i] = false باشد؛ برای i = 0, 1, 2, 3, 4… n – ۱، که نشان میدهد هیچ فرآیندی در ابتدا تمام نشده است.
وضعیت موجودی برای هر نوع منبع [i] را بررسی کنید، مانند:
Need[i] <= Work Finish[i] == false
اگر فرآیند i شرایط موجود در گام ۲ را برآورده کند، تخصیص را با بهروزرسانی بردار Work شبیهسازی کنید:
برای هر نوع منبع j، بهروزرسانی Work[j] را انجام دهید:
WorkWork = Work +Allocation(i) // to get new resource allocation
این منابع تخصیص داده شده به فرآیند i را به بردار Work باز میگرداند، شبیهسازی آزادسازی منابع پس از اتمام فرآیند.
Finish[i] = true
به گام ۲ بازگردید تا وضعیت موجودی منابع برای فرآیند بعدی بررسی شود.
اگر Finish[i] == true باشد، به این معنی است که سیستم برای تمامی فرآیندها ایمن است.
الگوریتم درخواست منابع
الگوریتم درخواست منابع، توضیحی از نحوه رفتار سیستم زمانی که یک فرآیند درخواست منبع میکند، است. این الگوریتم بررسی میکند که آیا منابع درخواست شده میتوانند بدون ایجاد بنبست تخصیص داده شوند یا نه. سپس درخواست به صورت یک ماتریس درخواست نمایش داده میشود.
یک الگوریتم درخواست منابع بررسی میکند که سیستم چگونه در برابر درخواست هر نوع منبع از سوی فرآیند رفتار خواهد کرد، به صورت یک ماتریس درخواست.
فرض کنید یک آرایه درخواست منابع R[i] برای هر فرآیند P[i] ایجاد میکنیم. اگر درخواست منابع[i][j] برابر با ‘K’ باشد، به این معنی است که فرآیند P[i] به تعداد K نمونه از منابع نوع R[j] در سیستم نیاز دارد.
مراحل الگوریتم درخواست منابع
بررسی کنید که آیا درخواست در محدوده ادعای حداکثری فرآیند است:
در هر درخواست منابع از سوی فرآیند P[i]، الگوریتم بررسی میکند که آیا تعداد منابع درخواستی کمتر از یا برابر با نیاز آن فرآیند است:
If Request[i]≤Need[i](for all resources)
اگر این شرایط برقرار باشد، الگوریتم به مرحله بعدی میرود. در غیر این صورت، فرآیند P[i] ادعای حداکثری خود را تجاوز کرده است؛ درخواست رد میشود.
اگر فرآیند ادعای حداکثری خود را تجاوز کند، این نقض قوانین سیستم است و اجازه ادامه دادن به فرآیند داده نمیشود.
بررسی کنید که آیا منابع درخواست شده موجود هستند:
سیستم اکنون بررسی میکند که آیا منابع درخواست شده به میزان کافی موجود هستند یا نه. این کار با مقایسه درخواست[i] با منابع موجود انجام میشود:
If Request[i]≤Available(for all resources)
اگر این شرایط برآورده شود، به مرحله بعدی بروید. در غیر این صورت، فرآیند P[i] باید منتظر بماند تا منابع مورد نیاز در دسترس قرار گیرند.
این اطمینان حاصل میکند که سیستم منابعی که در حال حاضر در دسترس ندارد را تخصیص نمیدهد، که در غیر این صورت ممکن است منجر به بنبست یا وضعیتهای غیر ایمن شود.
شبیهسازی تخصیص منابع
اگر منابع در دسترس باشند، سیستم منابع درخواستی موقت را به فرآیند P[i] تخصیص میدهد و ماتریسهای Available، Allocation و Need را بهروزرسانی میکند.
AvailableAvailable=Available−Request[i] Allocation[i]=Allocation[i]+Request[i] Need[i]=Need[i]−Request[i]
بررسی ایمنی سیستم
پس از تخصیص منابع درخواست شده، سیستم الگوریتم ایمنی را اجرا میکند تا بررسی کند که آیا سیستم پس از تخصیص همچنان در وضعیت ایمن باقی میماند یا خیر.
اگر سیستم در وضعیت ایمن باشد، منابع بهطور دائمی به فرآیند P[i] تخصیص داده میشود.
اگر سیستم وارد وضعیت غیر ایمن شود، فرآیند P[i] باید منتظر بماند و سیستم باید به وضعیت قبلی خود بازگردد و مقادیر اصلی ماتریسهای Available، Allocation و Need را بازیابی کند.
مثال برای الگوریتم بانکداران
فرض کنید سیستمی شامل پنج فرآیند P1، P2، P3، P4، P5 و سه نوع منبع A، B و C باشد. انواع منابع به شرح زیر است:
A دارای ۱۰ نمونه، B دارای ۵ نمونه و نوع منبع C دارای ۷ نمونه است.
جواب ۱: زمینه ماتریس Need به شرح زیر است:
ماتریس Need با کم کردن ماتریس Allocation از ماتریس Max محاسبه میشود. فرمول ماتریس Need به این صورت است: Need[i]=Max[i]−Allocation[i]
برای مثال داده شده:
Need برای P1: (7, 5, 3) – (۰, ۱, ۰) = (۷, ۴, ۳)
Need برای P2: (3, 2, 2) – (۲, ۰, ۰) = (۱, ۲, ۲)
Need برای P3: (9, 0, 2) – (۳, ۰, ۲) = (۶, ۰, ۰)
بنابراین، زمینه ماتریس Need را ایجاد کردیم.
جواب ۲: اجرای الگوریتم بانکر
منابع موجود A و B و C به ترتیب ۳، ۳ و ۲ هستند. اکنون بررسی میکنیم که آیا هر نوع درخواست منابع برای هر فرآیند موجود است.
گام ۱: برای فرآیند P1:
Need <= Available
(۲, ۳, ۳) => (3, 4, 7) شرایط نادرست است.
بنابراین، فرآیند دیگری را بررسی میکنیم، P2.
گام ۲: برای فرآیند P2:
Need <= Available
(۲, ۳, ۳) => (2 , 2, 1) شرایط درست است.
New available = available + Allocation
۲, ۳, ۵ <= (0, 0, 2) + (2 ,3 ,3)
به همین ترتیب، فرآیند دیگری را بررسی میکنیم، P3.
گام ۳: برای فرآیند P3:
Need <= Available
(۲, ۳, ۵) => (0, 0, 6) شرایط نادرست است.
به همین ترتیب، فرآیند دیگری را بررسی میکنیم، P4.
گام ۴: برای فرآیند P4:
Need <= Available
(۲, ۳, ۵) => (1, 1, 0) شرایط درست است.
New Available resource = Available + Allocation
۳ ,۴ ,۷ <= (1, 1, 2) + (2, 3, 5)
به همین ترتیب، فرآیند دیگری را بررسی میکنیم، P5.
گام ۵: برای فرآیند P5:
Need <= Available
(۳, ۴, ۷) => (1, 3, 4) شرایط درست است.
New available resource = Available + Allocation
(۷, ۴, ۳) + (۰, ۰, ۲) => (7, 4, 5)
اکنون دوباره هر نوع درخواست منابع را برای فرآیندهای P1 و P3 بررسی میکنیم.
گام ۶: برای فرآیند P1:
Need <= Available
(۵, ۴, ۷) => (3, 4, 7) شرایط درست است.
New Available Resource = Available + Allocation
(۵, ۵, ۷) <= (0, 1, 0) + (5, 4, 7)
بنابراین، فرآیند دیگری را بررسی میکنیم، P2.
گام ۷: برای فرآیند P3:
Need <= Available
(۵, ۵, ۷) => (0, 0, 6) شرایط درست است.
New Available Resource = Available + Allocation
(۷, ۵, ۱۰) <= (2, 0, 3) + (5, 5, 7)
بنابراین، ما الگوریتم بانکر را برای یافتن وضعیت ایمن و دنباله ایمن مانند P2، P4، P5، P1 و P3 اجرا میکنیم.
جواب ۳: آیا سیستم میتواند درخواست منابع (۱,۰,۰) را برای فرآیند P1 بپذیرد؟
برای بررسی این که آیا سیستم میتواند درخواست منابع (۱,۰,۰) را برای فرآیند P1 بپذیرد، از الگوریتم بانکدار به روش زیر استفاده میکنیم:
- بررسی اینکه آیا درخواست در محدوده ادعای حداکثری P1 است: اگر منابع درخواست شده: (۱,۰,۰) کمتر از یا برابر با Need P1 باشند، سپس ادامه میدهیم؛ در غیر این صورت، درخواست رد میشود.
- بررسی اینکه آیا سیستم منابع کافی برای رسیدگی به درخواست (۱,۰,۰) دارد: اگر منابع موجود باشند، ادامه میدهیم؛ در غیر این صورت، P1 باید منتظر بماند.
- شبیهسازی تخصیص منابع: منابع را به طور موقت به P1 تخصیص میدهیم و بررسی میکنیم که آیا سیستم ایمن است یا خیر با استفاده از الگوریتم ایمنی. اگر سیستم ایمن باشد، درخواست پذیرفته میشود. در غیر این صورت، تخصیص لغو میشود و P1 باید منتظر بماند.
نتیجهگیری
الگوریتم بانکداران در سیستم عامل یکی از روشهای مؤثر و کارآمد برای مدیریت تخصیص منابع در محیطهای چندفرآیندی است که نقش بسیار مهمی در جلوگیری از بروز بنبستها و حفظ ایمنی عملکرد سیستم ایفا میکند. الگوریتم بانکر با تحلیل دقیق وضعیت فعلی منابع و پیشبینی نیازهای آیندهی فرآیندها، این امکان را فراهم میسازد تا منابع به شکلی تخصیص یابند که سیستم از حالتهای خطرناک مانند بنبست دور بماند و همواره در وضعیت ایمن قرار گیرد.
اگرچه اجرای الگوریتم بانکدار در سیستمهایی با تعداد زیاد منابع و فرآیندها ممکن است چالشبرانگیز و پیچیده باشد، اما همچنان این الگوریتم به عنوان یکی از اصلیترین ابزارهای جلوگیری از تخصیص نادرست منابع شناخته میشود. از همین رو، الگوریتم بانکداران در سیستم عامل به عنوان یک راهکار حیاتی برای طراحی و توسعه سیستمهای عامل پایدار، مطمئن و بدون تعارض در تخصیص منابع، اهمیت بسیاری دارد.