Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Кіріспе
Компьютерде, тілді үздіксіз циклде ұстап тұратын құлып.
In computing, a lock which causes a thread to loop continuously
Бағдарламалық жасақтауда, спин-құлып – оны иеленуге тырысатын тілдің құлыпты күтуіне (айналуына, "спин") себеп болатын құлып, құлыптың қолжетімділігін қайта-қайта тексеріп отырады. Тіл белсенді күйде қала береді, бірақ пайдалы жұмыс атқармайды, сондықтан мұндай құлыпты пайдалану – күтудің бір түрі. Спин-құлып иеленгеннен кейін, әдетте, оны ашық босатуға дейін ұстап тұрады, бірақ кейбір жағдайларда, егер күтіп тұрған тіл (құлыпты ұстап тұрған тіл) тоқтатылса немесе "ұйықтаса", автоматты түрде босатылуы мүмкін. Олар операциялық жүйенің процестерін қайта жоспарлау немесе контексттік ауыстырудан туындайтын шығындарды болдырмайды, сондықтан тілдердің қысқа мерзімге ғана тоқтатылуы мүмкін болса, спин-құлыптар тиімді. Осы себепті операциялық жүйе ядролары көбінесе спин-құлыптарды қолданады. Дегенмен, спин-құлыптар ұзақ уақытқа иеленілсе, пайдасыз болады, өйткені олар басқа тілдердің жұмыс істеуіне кедергі келтіріп, қайта жоспарлау қажет болуы мүмкін. Тіл құлыпты қаншалықты ұзақ ұстаса, операциялық жүйе жоспарлаушысының оны ұстаған тілді үзу қаупі соншалықты жоғары. Егер мұндай жағдай туындаса, басқа тілдер "айналып" (құлыпты иеленуге қайта-қайта тырысу) қалады, ал құлыпты ұстап тұрған тіл оны босатуға қарай ілгерілемейді. Нәтижесінде, құлыпты ұстап тұрған тіл оны аяқтап, босата алғанша, оны белгісіз мерзімге кейінге шегеру мүмкін. Бұл, әсіресе, бір процессорлы жүйеде маңызды, онда бірдей басымдыққа ие әрбір күтіп тұрған тіл өзінің уақыт квантын (тіл жұмыс істей алатын уақыт) құлып иеленгенше айналып өткізеді. Спин-құлыптарды дұрыс жүзеге асыру қиын, өйткені бағдарламашылар құлыпқа бір мезгілде қол жеткізу мүмкіндігін ескеруі керек, бұл жарыс жағдайларын тудыруы мүмкін. Әдетте, мұндай жүзеге асыру арнайы ассемблерлік тіл нұсқауларымен ғана мүмкін болады, мысалы, атомдық (яғни үзілмейтін) тест және орнату операциялары, және шын мәнінде атомдық операцияларды қолдамайтын бағдарламалау тілдерінде оңай жүзеге асырылмайды. Мұндай операциялар жоқ архитектураларда немесе жоғары деңгейдегі тілде жүзеге асыру қажет болса, атомдық емес құлыптау алгоритмі қолданылуы мүмкін, мысалы, Питерсон алгоритмі. Алайда, мұндай жүзеге асыру спин-құлыпқа қарағанда көбірек жадты қажет етуі мүмкін, құлыптан босатылғаннан кейін ілгерілеу үшін баяу болуы мүмкін және егер тәртіпсіз орындалуға рұқсат етілсе, жоғары деңгейдегі тілде жүзеге асырылмайтын болуы мүмкін.
In software engineering, a spinlock is a lock that causes a thread trying to acquire it to simply wait in a loop ("spin") while repeatedly checking whether the lock is available. Since the thread remains active but is not performing a useful task, the use of such a lock is a kind of busy waiting. Once acquired, spinlocks will usually be held until they are explicitly released, although in some implementations they may be automatically released if the thread being waited on (the one that holds the lock) blocks or "goes to sleep". Because they avoid overhead from operating system process rescheduling or context switching, spinlocks are efficient if threads are likely to be blocked for only short periods. For this reason, operating system kernels often use spinlocks. However, spinlocks become wasteful if held for longer durations, as they may prevent other threads from running and require rescheduling. The longer a thread holds a lock, the greater the risk that the thread will be interrupted by the OS scheduler while holding the lock. If this happens, other threads will be left "spinning" (repeatedly trying to acquire the lock), while the thread holding the lock is not making progress towards releasing it. The result is an indefinite postponement until the thread holding the lock can finish and release it. This is especially true on a single processor system, where each waiting thread of the same priority is likely to waste its quantum (allocated time where a thread can run) spinning until the thread that holds the lock is finally finished. Implementing spinlocks correctly is challenging because programmers must take into account the possibility of simultaneous access to the lock, which could cause race conditions. Generally, such an implementation is possible only with special assembly language instructions, such as atomic (i. e. un interruptible) test and set operations and cannot be easily implemented in programming languages not supporting truly atomic operations. On architectures without such operations, or if high level language implementation is required, a non atomic locking algorithm may be used, e. g. Peterson's algorithm. However, such an implementation may require more memory than a spinlock, be slower to allow progress after unlocking, and may not be implementable in a high level language if out of order execution is allowed.
Баламалар
Спин-бұғаттың басты кемшілігі – бұғатты күтіп жатып, басқа жұмыстарда пайдалы болатын уақытты босқа жұмсау. Бұған жол бермеудің екі тәсілі бар:
The primary disadvantage of a spinlock is that, while waiting to acquire a lock, it wastes time that might be productively spent elsewhere. There are two ways to avoid this:
Бұғатты алмай қою. Көп жағдайда құлыптауды қажет етпейтін дерек құрылымдарын жасауға болады, мысалы, әр жіпке немесе әр процессорға арналған деректерді пайдалану арқылы және үзілістерді өшіру арқылы. Күту кезінде басқа жіпке ауысу. Бұл әдетте ағымдағы жіпті бұғатты күтіп тұрған жіптер тізіміне қосу және содан кейін пайдалы жұмыс істеуге дайын басқа жіпке ауысуды қамтиды. Бұл схеманың бір артықшылығы – ол ресурстардың жетіспеушілігіне жол бермейді, себебі барлық жіптер өздері алған бұғаттардан ақырында бас тартады және қай жіптің бірінші болып жұмыс істеуі керектігі туралы шешім қабылданады. Нақты уақыт операциялық жүйелерінде қолданылатын, ешқашан ауыстырылмайтын спин-бұғаттар кейде "шикі спин-бұғаттар" деп аталады. Көптеген операциялық жүйелер (Solaris, Mac OS X және FreeBSD сияқты) "адаптивті өзара құлыптау" деп аталатын гибридті тәсілді қолданады. Идеясы – қазіргі уақытта жұмыс істеп тұрған жіппен құлыпталған ресурсқа қол жеткізуге тырысқанда спин-бұғатты пайдалану, ал жіп қазіргі уақытта жұмыс істемесе, күту режиміне өту. (Екінші жағдай бір процессорлы жүйелерде әрқашан орын алады.) OpenBSD спин-бұғаттарды "бірінші келген – бірінші қызмет көрсетілді" принципін сақтайтын билеттік құлыптармен алмастыруға тырысты, бірақ бұл ядрода процессордың күшін көп пайдалануға және Firefox сияқты үлкен бағдарламалардың жұмысын айтарлықтай баяулатты.
Do not acquire the lock. In many situations it is possible to design data structures that do not require locking, e. g. by using per thread or per CPU data and disabling interrupts. Switch to a different thread while waiting. This typically involves attaching the current thread to a queue of threads waiting for the lock, followed by switching to another thread that is ready to do some useful work. This scheme also has the advantage that it guarantees that resource starvation does not occur as long as all threads eventually relinquish locks they acquire and scheduling decisions can be made about which thread should progress first. Spinlocks that never entail switching, usable by real time operating systems, are sometimes called raw spinlocks. Most operating systems (including Solaris, Mac OS X and FreeBSD) use a hybrid approach called "adaptive mutex". The idea is to use a spinlock when trying to access a resource locked by a currently running thread, but to sleep if the thread is not currently running. (The latter is always the case on single processor systems.) OpenBSD attempted to replace spinlocks with ticket locks which enforced first in first out behaviour, however this resulted in more CPU usage in the kernel and larger applications, such as Firefox, becoming much slower.