در برنامه نویسی همروندی، دسترسی های هم روندی به منابع مشترک ممکن است منجر به رفتار غیر قابل پیش بینی یا خطا شود. بنابر این بخش هایی از برنامه که در آن منبع مشترک مورد دسترس قرار می گیرد باید به گونه ای حفظ شود که از دسترسی همزمان پیشگیری شود. این ناحیه محافظت شده همان بخش بحرانی یا منطقه بحرانی نام دارد. این ناحیه را نمی توان توسط بیش از یک پروسه در هر زمان اجرا کرد. به طور معمول بخش بحرانی به یک منبع مشترک نظیر یک ساختمان داده، یک ابزار محیطی، یا یک اتصال شبکه دسترسی پیدا می کند، این منبع مشترک در صورت چندین دسترسی همزمان به درستی کار نخواهد کرد. [ ۱]
کدهای و پروسه های مختلف ممکن است شامل متغیرهای یکسان یا سایر منابعی باشند که قرار است خوانده یا نوشته شوند اما نتایج آن ها بستگی به ترتیب رخ دادن عمل ها دارد. برای مثال، اگر متغیر x قرار باشد که توسط پروسه ی A خوانده شود و پروسه B قرار باشد که در متغیر x به طور همزمان بنویسد، آنگاه پروسه ی A ممکن است مقدار قدیمی یا مقدار جدیدی از x به خود بگیرد.
Process A:
// Process A . . b = x + 5; // instruction executes at time = Tx . Process B:
// Process B . . x = 3 + z; // instruction executes at time = Tx . شکل ۱: گراف جریان که نشان دهنده ی لزوم وجود ناحیه ی بحرانی است در مواردی این چنینی، وجود یک ناحیه بحرانی لازم است. در مثال بالا اگر لازم باشد که A مقدار به روز شده ی x را بخواند، آنگاه اجرای پروسه A و پروسه B به صورت همزمان ممکن است نتیجه دلخواه را ندهد. برای پیشگیری از این وضعیت، متغیر x توسط یک ناحیه بحرانی محافظت می شود. ابتدا B به ناحیه ی مورد نظر دسترسی پیدا می کند. هنگامی که عمل نوشتن مقدار توسط B تمام شد، A به ناحیه بحرانی دسترسی پیدا می کند و متغیر x قابل خواندن است. اگر به دقت کنترل شود که کدام متغیر در داخل و خارج ناحیه بحرانی تغییر پیدا کند، آنگاه از دسترسی همزمان به متغیر مشترک پیشگیری می شود. معمولاً ناحیه بحرانی زمانی استفاده می شود که یک برنامه چند ریسه ای باید چندین متغیر مرتبط را بروز رسانی کند و در عین حال هیچ ریسه ی مجزایی موجب تغییرات تنش زا در آن داده نشود. در یک وضعیت مشابه، ممکن است از ناحیه بحرانی در شرایطی استفاده کنیم که یک منبع مشترک، برای مثال یک پرینتر، فقط قابل دسترسی توسط یک پروسه در هر لحظه باشد.
این نوشته برگرفته از سایت ویکی پدیا می باشد، اگر نادرست یا توهین آمیز است، لطفا گزارش دهید: گزارش تخلفکدهای و پروسه های مختلف ممکن است شامل متغیرهای یکسان یا سایر منابعی باشند که قرار است خوانده یا نوشته شوند اما نتایج آن ها بستگی به ترتیب رخ دادن عمل ها دارد. برای مثال، اگر متغیر x قرار باشد که توسط پروسه ی A خوانده شود و پروسه B قرار باشد که در متغیر x به طور همزمان بنویسد، آنگاه پروسه ی A ممکن است مقدار قدیمی یا مقدار جدیدی از x به خود بگیرد.
Process A:
// Process A . . b = x + 5; // instruction executes at time = Tx . Process B:
// Process B . . x = 3 + z; // instruction executes at time = Tx . شکل ۱: گراف جریان که نشان دهنده ی لزوم وجود ناحیه ی بحرانی است در مواردی این چنینی، وجود یک ناحیه بحرانی لازم است. در مثال بالا اگر لازم باشد که A مقدار به روز شده ی x را بخواند، آنگاه اجرای پروسه A و پروسه B به صورت همزمان ممکن است نتیجه دلخواه را ندهد. برای پیشگیری از این وضعیت، متغیر x توسط یک ناحیه بحرانی محافظت می شود. ابتدا B به ناحیه ی مورد نظر دسترسی پیدا می کند. هنگامی که عمل نوشتن مقدار توسط B تمام شد، A به ناحیه بحرانی دسترسی پیدا می کند و متغیر x قابل خواندن است. اگر به دقت کنترل شود که کدام متغیر در داخل و خارج ناحیه بحرانی تغییر پیدا کند، آنگاه از دسترسی همزمان به متغیر مشترک پیشگیری می شود. معمولاً ناحیه بحرانی زمانی استفاده می شود که یک برنامه چند ریسه ای باید چندین متغیر مرتبط را بروز رسانی کند و در عین حال هیچ ریسه ی مجزایی موجب تغییرات تنش زا در آن داده نشود. در یک وضعیت مشابه، ممکن است از ناحیه بحرانی در شرایطی استفاده کنیم که یک منبع مشترک، برای مثال یک پرینتر، فقط قابل دسترسی توسط یک پروسه در هر لحظه باشد.
wiki: بخش بحرانی