موضوع مقاله: بخش بحرانی | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # بخش بحرانی | مقدمه: بنابر این بخش هایی از برنامه که در آن منبع مشترک مورد دسترس قرار می‌گیرد باید به گونه‌ای حفظ شود که از دسترسی همزمان پیشگیری شود. | ## بخش 1: بخش بحرانی | به طور معمول بخش بحرانی به یک منبع مشترک نظیر یک ساختمان داده، یک ابزار محیطی، یا یک اتصال شبکه دسترسی پیدا می کند، این منبع مشترک در صورت چندین دسترسی همزمان به درستی کار نخواهد کرد. برای مثال، اگر متغیر x قرار باشد که توسط پروسه‌ی A خوانده شود و پروسه B قرار باشد که در متغیر x به طور همزمان بنویسد، آنگاه پروسه ی A ممکن است مقدار قدیمی یا مقدار جدیدی از x به خود بگیرد. در مثال بالا اگر لازم باشد که A مقدار به روز شده ی x را بخواند، آنگاه اجرای پروسه A و پروسه B به صورت همزمان ممکن است نتیجه دلخواه را ندهد. هنگامی که عمل نوشتن مقدار توسط B تمام شد، A به ناحیه بحرانی دسترسی پیدا می کند و متغیر x قابل خواندن است. اگر به دقت کنترل شود که کدام متغیر در داخل و خارج ناحیه بحرانی تغییر پیدا کند، آنگاه از دسترسی همزمان به متغیر مشترک پیشگیری می شود. معمولاً ناحیه بحرانی زمانی استفاده می شود که یک برنامه چند ریسه ای باید چندین متغیر مرتبط را بروز رسانی کند و در عین حال هیچ ریسه ی مجزایی موجب تغییرات تنش زا در آن داده نشود. در یک وضعیت مشابه، ممکن است از ناحیه بحرانی در شرایطی استفاده کنیم که یک منبع مشترک، برای مثال یک پرینتر، فقط قابل دسترسی توسط یک پروسه در هر لحظه باشد. پیاده سازی نواحی بحرانی پیاده سازی نواحی بحرانی در سیستم عامل های مختلف متفاوت است. برای اطمینان از استفاده ی انحصاری از نواحی بحرانی، برخی مکانیسم‌های همگام‌سازی در ورودی و خروجی برنامه مورد نیاز است. ناحیه بحرانی قطعه ای از برنامه است که نیاز به انحصار متقابل برای دسترسی به آن است. چنانکه در شکل ۲ نشان داده شده است، در انحصار متقابل (mutex)، یک ریسه زمانیکه نیاز به دسترسی به منبع مشترک دارد، با استفاده از تکنیک های قفل کردن، ناحیه ی بحرانی را قفل می کند و سایر ریسه ها مجبورند تا منتظر بمانند تا نوبت آنها برای ورود به این ناحیه برسد. این فرایند زمانی که دو یا بیش از دو ریسه فضای حافظه مشابهی را در اشتراک دارند و می خواهند به یک منبع مشترک دسترسی پیدا کنند، مانع از تقابل می شود. ساده ترین روش برای پیشگیری از هرگونه تغییر در کنترل پردازنده در داخل ناحیه بحرانی، پیاده سازی سمافور است. | ## بخش 2: بخش بحرانی | در سیستم های تک پردازنده ای، این هدف را می توان با غیر فعال کردن وقفه ها در هنگام ورود به ناحیه بحرانی ، اجتناب از فراخوانی هایی از سیستم که می تواند موجب تعویض زمینه(به انگلیسی: context switch) در حین حضور در داخل ناحیه شود و بازگرداندن وقفه به وضعیت قبل در هنگام خروج، عملی کرد. در این روش پیاده سازی، هر ریسه در حال اجرا که وارد هر ناحیه بحرانی در هر جایی از سیستم می شود مانع از این می‌شود که هر ریسه ی دیگر، از جمله یک وقفه، اجازه دریافت زمان پردازش در CPU پیدا کند. این ممانعت تا زمانی ادامه پیدا می کند که ریسه ی اولیه از ناحیه بحرانی خودش خارج شود. یک ریسه برای ورود به یک ناحیه بحرانی باید یک سمافور به دست آورد و زمانی که از ناحیه مذکور خارج می شود این سمافور را آزاد می کند. از ورود سایر ریسه ها به ناحیه بحرانی به صورت همزمان با ریسه ی اولیه پیشگیری می شود، اما ریسه های دیگر آزاد هستند تا کنترل واحد پردازش مرکزی را به دست گیرند و کد های دیگر را اجرا کنند، از جمله سایر بخش های بحرانی که توسط سمافور های متفاوت محافظت شده اند. کاربردهای نواحی بحرانی نواحی بحرانی در سطح کرنل به طور معمول نواحی بحرانی مانع از مهاجرت ریسه ها و پروسه ها بین پردازنده ها و نیز مانع از وقفه ی اجباری پروسه ها و ریسه ها توسط وقفه ها(به انگلیسی: interrupt) و پروسه ها و ریسه های دیگر می شود. تودرتو شدن امکان ورود و خروج به ناحیه های بحرانی متعدد را با هزینه کم فراهم می آورد. اگر زمان بند، در پروسه یا ریسه موجود در ناحیه بحرانی وقفه ایجاد کند، آنگاه زمان بند، یا اجازه می دهد که پروسه یا ریسه ی درحال اجرای کنونی، تا کامل شدن ناحیه بحرانی اجرا شود یا اینکه پروسه یا ریسه مذکور را برای یک کوانتوم کامل دیگر زمان دهی می کند. زمان بند، این پروسه یا ریسه را به پردازنده دیگر منتقل نمی کند، همچنین مادامی که پروسه یا ریسه مورد نظر در ناحیه بحرانی قرار دارد پروسه یا ریسه دیگری را برای اجرا زمان دهی نمی‌کند. به طور مشابه، اگر یک وقفه در ناحیه بحرانی رخ دهد، اطلاعات وقفه برای پردازش در آینده ثبت می‌شود و اجرا، به پروسه یا ریسه در ناحیه بحرانی برمی گردد. زمانی که پروسه یا ریسه از ناحیه بحرانی خارج شود و در برخی موارد، کوانتوم زماندهی شده کامل شود، وقفه ی در حال انتظار اجرا خواهد شد. از آنجایی که نواحی بحرانی ممکن است فقط در پردازنده‌ای که در آن وارد شده اند اجرا شوند، بنابراین همگام‌سازی فقط در داخل پردازنده ی اجرا کننده لازم است. فقط همگام سازی جریان دستورالعمل لازم است.n اکثر پردازنده ها با ایجاد وقفه در وضعیت اجرای کنونی، میزان لازم همگام سازی را به سادگی فراهم می کنند. | ## بخش 3: بخش بحرانی | این امر این امکان را فراهم می آورد تا نواحی بحرانی در اکثر موارد چیزی بیش از تعداد نواحی بحرانی مورد دخول به ازای پردازنده نباشد. بهبود عملکرد عبارت است از اجرای وقفه های در حال انتظار در زمان خروج از تمام نواحی بحرانی و همچنین اجازه دادن به زمانبند برای اجرا در حین خروج از تمام نواحی بحرانی. علاوه بر این وقفه‌های در حال انتظار را می‌توان برای اجرا به پردازنده های دیگر منتقل کرد. باید زمان نواحی بحرانی به اندازه کافی کوتاه باشد تا ورود، اجرا و خروج از آن بدون هیچ گونه رخداد وقفه از سوی سخت‌افزار و برنامه زمانبند انجام گیرد. نواحی بحرانی در ساختمان های داده در برنامه نویسی موازی، یک کد به ریسه هایی تقسیم می‌شود. متغیرهای دارای تقابل نوشتن-خواندن در بین این ریسه ها تقسیم می‌شوند و هر ریسه یک کپی از آن ها دارد. دارای متغیرهای داده ای هستند که به هم پیوند خورده اند و نمی توان آن ها را بین ریسه ها تقسیم کرد و از این رو، پیاده سازی موازی گرایی بسیار دشوار خواهد شد. برای بهبود کارایی پیاده سازی ساختمان‌های داده، باید عملیات متعددی نظیر: قرار دادن، پاک کردن، و جستجو کردن به صورت موازی اجرا شوند. زمانیکه این عملیات انجام می شوند، ممکن است سناریوهایی به وجود آید که در آن یک عنصر به صورت همزمان توسط یک ریسه جستجو شود و توسط ریسه ای دیگر پاک شود. ریسه ای که عنصر را جستجو می کند ممکن است آن را پیدا کند، در حالیکه ریسه ی دیگر ممکن است، درست بعد از این زمان، آن را پاک کند. این سناریوها می ‌توانند باعث مشکل در اجرای برنامه، از طریق فراهم کردن داده غلط شوند. یک راه حل برای پیشگیری از این وضعیت این است که تمام ساختمان داده را داخل ناحیه بحرانی نگه داریم، به گونه ای که فقط یک عملیات در هر لحظه انجام شود. | ## جمع‌بندی | راه حل دیگر این است که، گره مورد استفاده را در ناحیه ی بحرانی قفل کنیم، به گونه ای که عملیات دیگر از همان گره استفاده نکنند.