قفل چرخشی

در مهندسی نرم‌افزار، قفل چرخشی (spinlock) قفلی است که باعث می‌شود ریسمانی برای به دست آوردن آن در یک حلقه منتظر بماند ("چرخش می‌کند") و باید بارها و بارها چک کند که آیا قفل آزاد شده یا خیر. از آنجا که ریسمان همچنان مشغول است اما کار مفیدی را انجام نمی‌دهد، استفاده از چنین قفلی نوعی انتظار مشغول است. قفل‌های چرخشی پس از به دست آورده شدن، معمولاً تا زمانی که به‌طور واضح آزاد نشوند، نگه داشته می‌شوند، اگرچه در برخی پیاده‌سازی‌ها، در صورت مسدود شدن ریسمان (ریسمانی که قفل را نگه دارد) یا "به خواب رفتن" آن، ممکن است قفل به‌طور خودکار آزاد شود.

از آنجا که قفل‌های چرخشی از سربار ناشی از زمان‌بندی مجدد فرایند‌ها توسط سیستم عامل یا تعویض زمینه جلوگیری می‌کنند، فقط در صورتی کارامد هستند که ریسمان‌ها احتمالاً فقط برای مدت کوتاهی مسدود شوند. به همین دلیل، هسته‌های سیستم عامل اغلب از قفل‌های چرخشی استفاده می‌کنند. با این حال، قفل‌های چرخشی اگر برای مدت طولانی نگه داشته شوند، بیهوده هستند، زیرا ممکن است از اجرای سایر ریسمان‌ها جلوگیری کرده و نیاز به زمان‌بندی مجدد داشته باشند. هرچه ریسمان بیشتر قفل را نگه دارد، خطر ایجاد وقفه در ریسمان توسط زمانبند سیستم عامل در حین نگه داشتن قفل، بیشتر خواهد بود. اگر این اتفاق بیفتد، ریسمان‌های دیگر «در حال چرخش» باقی می‌مانند (یعنی به‌طور مکرر سعی در بدست آوردن قفل دارند)، در حالی که ریسمان نگهدارنده قفل پیشرفتی در جهت آزاد کردن قفل ندارد. نتیجهٔ این وضعیت، یک تأخیر نامحدود است تا زمانی که ریسمان نگهدارنده قفل بتواند کار خود را تمام کرده و قفل را آزاد کند. این امر به ویژه در سیستم‌های تک پردازنده ای صادق است که در آن هر ریسمان در حال انتظار با اولویت مشابه احتمالاً سهم زمانی خود را (زمان اختصاص داده شده که در این بازه یک ریسمان می‌تواند اجرا شود) در حال چرخش تلف می‌کند تا سرانجام ریسمانی که قفل را نگه داشته، به پایان برسد.

پیاده‌سازی صحیح قفل چرخشی چالش‌برانگیز است زیرا برنامه نویسان باید امکان دسترسی همزمان به قفل را در نظر بگیرند، که این امر می‌تواند باعث ایجاد شرایط مسابقه ای شود. به‌طور کلی، پیاده‌سازی قفل چرخشی فقط بوسیلهٔ دستورالعمل‌های خاص زبان اسمبلی، مانند عملیات یکجای تست و ست امکان‌پذیر است و در زبان‌های برنامه‌نویسی که از عملیات یکجای واقعی پشتیبانی نمی‌کنند، به راحتی قابل اجرا نیست. در معماری‌هایی که چنین عملیاتی ندارند، یا در صورت نیاز به پیاده‌سازی زبان سطح بالا، ممکن است از یک الگوریتم قفل کنندهٔ غیر یکجا استفاده شود، به عنوان مثال الگوریتم پیترسون. با این حال، چنین پیاده‌سازی ممکن است به حافظه بیشتری نسبت به قفل چرخشی نیاز داشته باشد، برای امکان پیشرفت پس از باز کردن قفل کندتر باشد و زبان سطح بالا، در صورت مجاز بودن اجرای خارج از دستور، ممکن است قابل اجرا نباشد.

منابع 

الگوریتم‌های کنترل همروندی
ساختارهای برنامه‌نویسی