آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

وضعیت مسابقه

RaceCondition

یک race condition وضعیتی است که در آن دو یا چند مورد به طور همزمان در حال وقوع می‌باشند، و نتیجه نهایی به زمان‌بندی دقیق رویدادها بستگی دارد.

برای مثال، دو برنامه را در نظر بگیرید که در یک زمان اجرا می‌شوند:

  #!/bin/sh
  # برنامه اول‎
  read number < file
  number=$(($number + 1))
  echo $number > file

  #!/bin/sh
  # برنامه دوم‎
  read number < file
  number=$(($number - 1))
  echo $number > file

برنامه اول، یک عدد را از فایل می‌خواند، در حافظه یکی به آن اضافه می‌کند، و آنوقت جواب را در فایل می‌نویسد. برنامه دوم عدد را می‌خواند، یک را از آن کم می‌کند، و سپس پاسخ را در فایل می‌نویسد. فرض کنید ما عدد 42 را در فایل بگذاریم و هر دو برنامه را در یک زمان اجرا کنیم. چه اتفاقی رخ می‌دهد؟

به طور ساده‌انگارانه، انتظار خواهیم داشت مقدار نهایی در فایل 42 بشود. اگر سیستم عامل ابتدا برنامه اول را زمان‌بندی کند، آنوقت آن برنامه 43 را در فایل می‌نویسد، سپس برنامه دوم 43 را می‌خواند، یک را از آن کم می‌کند و 42 را در فایل می‌نویسد. همچنین، اگر سیستم‌عامل ابتدا برنامه دوم را در زمان‌بندی قرار دهد، انتظار خواهیم داشت فایل محتوی 41 و سپس موقعی که برنامه اول تمام می‌شود، 42 بشود. درست است؟

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

یک توالی احتمالی دیگر وقوع رویدادها چنین است:

  1. برنامه اول عدد 42 را از فایل می‌خواند.
  2. برنامه دوم عدد 42 را از فایل می‌خواند.
  3. برنامه اول 1 را به عددش اضافه می‌کند، و اکنون در حافظه 43 را دارد.
  4. برنامه دوم 1 را از عددش کم می‌کند، و حالا 41 را در حافظه دارد.
  5. برنامه اول 43 را در فایل می‌نویسد.
  6. برنامه دوم 41 را در فایل می‌نویسد. نتیجه نهایی: 41

اگر دو سطر انتهایی به طور برعکس رخ بدهند، آنوقت جواب نهایی 43 خواهد شد. بنابراین، به نسبت تمایل زمان بندی سیستم‌عامل، می‌توانیم نتایج انتهایی 41, 42 یا ‏43 را داشته باشیم.

 وضعیت مسابقه در اَشکال بسیاری ظاهر می‌شود. در چندین نوع برنامه‌نویسی آنها موضوع در خورِ رسیدگی هستند. هر وقت باید کنترل کننده‌های ناهماهنگ نوشته شوند، یا در یک سیستم‌عامل چند کاربره، با سیستم‌عامل فعل و انفعال صورت بگیرد، برای اجتناب از  وضعیت مسابقه، باید مراقبت فوق‌العاده انجام بشود.

  • RaceCondition (آخرین ویرایش ‎2009-02-04 20:56:56‎ توسط GreyCat)