Кіріспе

Компьютерде, тілді үздіксіз циклде ұстап тұратын құлып.

Бағдарламалық жасақтауда, спин-құлып – оны иеленуге тырысатын тілдің құлыпты күтуіне (айналуына, "спин") себеп болатын құлып, құлыптың қолжетімділігін қайта-қайта тексеріп отырады. Тіл белсенді күйде қала береді, бірақ пайдалы жұмыс атқармайды, сондықтан мұндай құлыпты пайдалану – күтудің бір түрі. Спин-құлып иеленгеннен кейін, әдетте, оны ашық босатуға дейін ұстап тұрады, бірақ кейбір жағдайларда, егер күтіп тұрған тіл (құлыпты ұстап тұрған тіл) тоқтатылса немесе "ұйықтаса", автоматты түрде босатылуы мүмкін. Олар операциялық жүйенің процестерін қайта жоспарлау немесе контексттік ауыстырудан туындайтын шығындарды болдырмайды, сондықтан тілдердің қысқа мерзімге ғана тоқтатылуы мүмкін болса, спин-құлыптар тиімді. Осы себепті операциялық жүйе ядролары көбінесе спин-құлыптарды қолданады. Дегенмен, спин-құлыптар ұзақ уақытқа иеленілсе, пайдасыз болады, өйткені олар басқа тілдердің жұмыс істеуіне кедергі келтіріп, қайта жоспарлау қажет болуы мүмкін. Тіл құлыпты қаншалықты ұзақ ұстаса, операциялық жүйе жоспарлаушысының оны ұстаған тілді үзу қаупі соншалықты жоғары. Егер мұндай жағдай туындаса, басқа тілдер "айналып" (құлыпты иеленуге қайта-қайта тырысу) қалады, ал құлыпты ұстап тұрған тіл оны босатуға қарай ілгерілемейді. Нәтижесінде, құлыпты ұстап тұрған тіл оны аяқтап, босата алғанша, оны белгісіз мерзімге кейінге шегеру мүмкін. Бұл, әсіресе, бір процессорлы жүйеде маңызды, онда бірдей басымдыққа ие әрбір күтіп тұрған тіл өзінің уақыт квантын (тіл жұмыс істей алатын уақыт) құлып иеленгенше айналып өткізеді. Спин-құлыптарды дұрыс жүзеге асыру қиын, өйткені бағдарламашылар құлыпқа бір мезгілде қол жеткізу мүмкіндігін ескеруі керек, бұл жарыс жағдайларын тудыруы мүмкін. Әдетте, мұндай жүзеге асыру арнайы ассемблерлік тіл нұсқауларымен ғана мүмкін болады, мысалы, атомдық (яғни үзілмейтін) тест және орнату операциялары, және шын мәнінде атомдық операцияларды қолдамайтын бағдарламалау тілдерінде оңай жүзеге асырылмайды. Мұндай операциялар жоқ архитектураларда немесе жоғары деңгейдегі тілде жүзеге асыру қажет болса, атомдық емес құлыптау алгоритмі қолданылуы мүмкін, мысалы, Питерсон алгоритмі. Алайда, мұндай жүзеге асыру спин-құлыпқа қарағанда көбірек жадты қажет етуі мүмкін, құлыптан босатылғаннан кейін ілгерілеу үшін баяу болуы мүмкін және егер тәртіпсіз орындалуға рұқсат етілсе, жоғары деңгейдегі тілде жүзеге асырылмайтын болуы мүмкін.

Баламалар

Спин-бұғаттың басты кемшілігі – бұғатты күтіп жатып, басқа жұмыстарда пайдалы болатын уақытты босқа жұмсау. Бұған жол бермеудің екі тәсілі бар:

Бұғатты алмай қою. Көп жағдайда құлыптауды қажет етпейтін дерек құрылымдарын жасауға болады, мысалы, әр жіпке немесе әр процессорға арналған деректерді пайдалану арқылы және үзілістерді өшіру арқылы. Күту кезінде басқа жіпке ауысу. Бұл әдетте ағымдағы жіпті бұғатты күтіп тұрған жіптер тізіміне қосу және содан кейін пайдалы жұмыс істеуге дайын басқа жіпке ауысуды қамтиды. Бұл схеманың бір артықшылығы – ол ресурстардың жетіспеушілігіне жол бермейді, себебі барлық жіптер өздері алған бұғаттардан ақырында бас тартады және қай жіптің бірінші болып жұмыс істеуі керектігі туралы шешім қабылданады. Нақты уақыт операциялық жүйелерінде қолданылатын, ешқашан ауыстырылмайтын спин-бұғаттар кейде "шикі спин-бұғаттар" деп аталады. Көптеген операциялық жүйелер (Solaris, Mac OS X және FreeBSD сияқты) "адаптивті өзара құлыптау" деп аталатын гибридті тәсілді қолданады. Идеясы – қазіргі уақытта жұмыс істеп тұрған жіппен құлыпталған ресурсқа қол жеткізуге тырысқанда спин-бұғатты пайдалану, ал жіп қазіргі уақытта жұмыс істемесе, күту режиміне өту. (Екінші жағдай бір процессорлы жүйелерде әрқашан орын алады.) OpenBSD спин-бұғаттарды "бірінші келген – бірінші қызмет көрсетілді" принципін сақтайтын билеттік құлыптармен алмастыруға тырысты, бірақ бұл ядрода процессордың күшін көп пайдалануға және Firefox сияқты үлкен бағдарламалардың жұмысын айтарлықтай баяулатты.