سلام دوستان عزیز!
امروز میخوایم دربارهی یه موضوع خیلی مهم توی دنیای کامپیوتر صحبت کنیم: "پترسون". شاید این اسم یکم عجیب به نظر برسه، ولی پترسون یه الگوریتمه که به ما کمک میکنه تا مشکلات مربوط به همروندی رو حل کنیم. همروندی یعنی چی؟ یعنی وقتی چند تا برنامه یا چند تا قسمت از یه برنامه همزمان دارن یه کار رو انجام میدن. تصور کنید چند نفر همزمان میخوان از یه مداد استفاده کنن؛ خب، یه نفر باید اولویت داشته باشه، درسته؟ پترسون هم دقیقا همین کار رو میکنه.
فرض کنید ما یه فایل متنی داریم که دو تا برنامه میخوان همزمان اون رو ویرایش کنن. اگه این دو تا برنامه همزمان تغییرات رو اعمال کنن، ممکنه اطلاعات مهمی از بین بره. پترسون به ما کمک میکنه تا مطمئن بشیم که فقط یه برنامه در یه زمان مشخص میتونه فایل رو ویرایش کنه. اینجوری از خراب شدن اطلاعات جلوگیری میکنیم.
الگوریتم پترسون از دو تا متغیر اصلی استفاده میکنه: یه متغیر برای نشون دادن اینکه یه برنامه میخواد وارد بخش بحرانی بشه (بخشی که فقط یه برنامه باید توش باشه) و یه متغیر دیگه برای اینکه نشون بده نوبت کدوم برنامهست. یه جورایی مثل یه چراغ راهنمایی عمل میکنه که مشخص میکنه کی میتونه رد بشه.
به این جدول دقت کنید تا بهتر متوجه بشید:
متغیر | توضیح | مقدار |
---|---|---|
flag[i] |
نشون میده که برنامه i ام میخواد وارد بخش بحرانی بشه. | true یا false |
turn |
نشون میده که نوبت کدوم برنامهست. | 0 یا 1 |
برنامهی شماره صفر (برنامه i=0) وقتی میخواد وارد بخش بحرانی بشه، اول flag[0]
رو true
میکنه و بعد turn
رو برابر 1
قرار میده (یعنی نوبت برنامه شماره یک است). بعد منتظر میمونه تا flag[1]
برابر false
بشه یا turn
برابر 0
بشه. وقتی این اتفاق افتاد، میتونه وارد بخش بحرانی بشه. وقتی کارش تموم شد، flag[0]
رو false
میکنه.
برنامهی شماره یک هم دقیقا همین کار رو انجام میده، فقط جای صفر و یک عوض میشه. اینطوری مطمئن میشیم که فقط یه برنامه در یه زمان مشخص میتونه وارد بخش بحرانی بشه و اطلاعات ما امن میمونه.
فرض کنید دو تا فرآیند (Process) داریم به نامهای A و B که میخوان یه متغیر مشترک به اسم counter
رو افزایش بدن. اگه این دو تا فرآیند همزمان این کار رو انجام بدن، ممکنه مقدار نهایی counter
درست نباشه. پترسون میتونه اینجا به ما کمک کنه.
بدون پترسون (مشکل):
counter
رو میخونه (مثلا 5).counter
رو میخونه (همون 5).counter
رو یکی افزایش میده و مقدارش رو برابر 6 میکنه.counter
رو یکی افزایش میده و مقدارش رو برابر 6 میکنه (دوباره!).در این حالت، انتظار داشتیم مقدار counter
برابر 7 بشه، اما شده 6!
با استفاده از پترسون (حل مشکل):
فرآیند A و B قبل از اینکه counter
رو افزایش بدن، باید از الگوریتم پترسون برای کسب اجازه استفاده کنن. اینجوری فقط یه فرآیند در هر لحظه میتونه counter
رو افزایش بده و مقدار نهایی درست خواهد بود. در واقع پترسون یه نوع "قفل" ایجاد میکنه که فقط یک فرآیند میتونه اون رو داشته باشه.
الگوریتم پترسون یه مثال خیلی خوب از چگونگی حل مشکلات همروندیه. درسته که توی برنامههای خیلی پیچیده امروزی از روشهای پیشرفتهتری استفاده میشه، ولی درک پترسون یه قدم مهم برای فهمیدن مفاهیم پیشرفتهتره. این الگوریتم به ما یاد میده که چطور منابع مشترک رو به درستی مدیریت کنیم تا برنامه هامون درست کار کنن.
پترسون یه الگوریتم ساده ولی مهم برای حل مشکلات همروندیه. با استفاده از این الگوریتم، میتونیم مطمئن بشیم که فقط یه برنامه در یه زمان مشخص میتونه به یه منبع مشترک دسترسی داشته باشه و اینطوری از خراب شدن اطلاعات جلوگیری کنیم. اگه برنامهنویسی رو دوست دارید، حتما باید با این الگوریتم آشنا باشید. این یه ابزار مفیده توی جعبه ابزار یه برنامه نویس حرفه ای. اما به یاد داشته باشید که استفاده از این الگریتم محدودیت هایی هم داره، و در سیستم های پیچیده امروزی کاربرد کمتری دارد. و در آخر با یآد گیری این الگریتم شما یک قدم از بقیه جلوتر هستید.
پترسون، همروندی، بخش بحرانی، الگوریتم، منابع مشترک، قفل، برنامه نویسی، process, algorithm
امتیاز شما به این مطلب
امتیاز: 5 از 5 (مجموع 1 رای)
اولین نفری باشید که در مورد این مقاله نظر می دهید!
techfeed.ir© 2024 All rights reserved