/ / Полезно ли е блокирането на въртене в архитектурата на един процесор uni? - операционна система, заключване

Заключването на въртенето е полезно в една централна архитектура на един процесор? - операционна система, заключване

Аз съм объркан от функцията на спиране заключване.

Завъртането за завъртане се използва за спиране на процеса от повторно планиране. Въпреки това, в машина със само едно ядро, полезно ли е да използвате завъртане с въртене за да се предотврати превключването на контекста?

Отговори:

9 за отговор № 1

Кратък отговор: не.

Според http://uw714doc.sco.com/en/man/html.3synch/Intro.3synch.html

Завъртащите се брави не трябва да се използват в един процесорсистема. В най-добрия случай завъртането на завъртане на една процесорна система ще загуби ресурси, забавяйки собственика на бравата; в най-лошия случай ще блокира процесора.

От: http://blogs.microsoft.co.il/blogs/sasha/archive/2008/08/10/practical-concurrency-patterns-spinlock.aspx

В еднопроцесорните системи спинлок не санеобходими, тъй като спинлок синхронизирането е необходимо само при високи IRQL. При високите IRQL (по-горе диспечерска IRQL) контекстна смяна не може да възникне, така че вместо завъртане на придобиващата нишка може просто да поиска прекъсване на съответния IRQL и да се върне; прекъсването ще бъде маскирано, докато освобождаващата нишка намали IRQL под исканата IRQL.

За системи с единични процесори ядрото ще игнорира стойността на броя на завъртанията и ще я третира като нула - по същество превръща спинлок в нео-оп.

Да, заключването може да бъде полезно и да се подобриефективност на някои операции. Но като цяло трябва да започнете с мютекс и ако профилирането покаже, че това е тясно място, може да искате да помислите за завъртане.


8 за отговор № 2

Вашето наблюдение е добро: в унипроцесорна система, няма смисъл да се върти, за да се чака ресурс, защото вие също може да превключвате нишки по-рано, отколкото по-късно. Мутексите и семафорите правят точно това.

В многопроцесорна система, конец на другапроцесорът може да освободи ключалката, без да превключвате контекста. Spinlocks могат да бъдат полезни, тогава, ако не очаквате да чакате дълго, защото може да е по-бързо просто да се мотаете, докато другата нишка отключи нещата. Ако отидете да спите на мютекс, всъщност сте сигурни значително мъртво време, преди да бъдете разсрочени.

В кода на ядрото обаче ситуацията се променя: Обработващите прекъсвания трябва да имат достъп до споделените ресурси с останалата част от ядрото, но не могат да спят. Mutexes ще постави ядрото да спи, така че не можете да ги използвате, но спинлок не е полезен или защото нищо няма да прекъсне обработващия прекъсване на еднопроцесора (е, може би друго прекъсване, но това е страшно).

В ядро, след това, завъртания в рамките на компилатор за прекъсване се компилира до неоперативен. Те са напълно излъчени, точно както може би си мислите. В същото време, за предотвратяване на състезания, завъртания в останалото ядро деактивирайте прекъсванията точно преди реално да се въртятза нещо (защото задачите на ядрото могат да бъдат насрочени). Тези кодове се нуждаят от завъртания (за разлика от mutexe) само ако споделят код с обработващ прекъсване.

Като цяло имате право: spinlocks наистина нямат много смисъл от еднопроцесора ако имате мутекси, защото мутексите губят по-малко време.


0 за отговор № 3

Да и не; в зависимост от това коя операционна система присъства, дали има такава изобщо и какво се опитвате да постигнете.

Ако имате лукса на пълен многозадачностналична и многонишкаща операционна система, тогава трябва да изберете вашите примитиви от колекцията, която ви предоставя, или рискувате неефективност в най-добрия случай и неработеща синхронизация в най-лошия случай. Всяка ОС има своите идиоми и предпочитани механизми, а ако не спазвате тези конвенции, също може да има разходи.

Колкото по-нататък стигнете от пълно ядро ​​(или по-дълбоко в драйверите на ядрото и устройството, което получавате), ще откриете, че най-добрите идиоми включват примитиви за синхронизация на по-ниско ниво.

Дори един основен процесор има обработващи прекъсваниякоито могат да изпълняват (по принцип) между която и да е двойка инструкции или дори по време на определени инструкции за няколко цикъла в някои архитектури. Това на практика е един вид съвместимост, макар и по-слаба от второ ядро, така че се изискват примитиви за синхронизация при комуникация между предните нишки (ници) и всички обработващи прекъсвания на заден план. В едно ядро, синхронизацията между нишки на преден план, разбира се, трябва да включва контекстно превключване.

Изчакване при условие, прекъснатои двата манипулатора или при условие, зададено в хардуерен регистър, са и двата случая, при които една нишка на преден план в едноядрено ядро ​​може да няма по-добър избор от въртене на флага или регистрация.

Редактиране: Опитах се да изясня този отговор, за да го направяясно, че аз говоря за синхронизация като цяло повече от каквато и да е конкретна операционна система за изпълнение на спинлок. Въпросът не е специфичен за това, коя ОС (ако има такава) и не е маркирана и за която и да е конкретна ОС.


0 за отговор № 4

Не.

За много по-подробен отговор вижте „Как се заключва ключалката?"заедно с коментарите.