На одном CPU, одноядерном CPU вы все равно можете иметь threadmulti-tasking (многопоточность), с оговоркой, что только один поток обычно может выполняться сразу из-за отсутствия нескольких исполнительных блоков. Без нескольких исполнительных блоков (аппаратная многопоточность) аппаратное обеспечение полагается на стратегию «software multi-threading», определенную ядром, - программное обеспечение операционной системы низкого уровня, определяющее, что нужно выполнять и когда.
Preemption - стратегия, которая включает в себя более активный пастух (так сказать), эти многочисленные потоки выполнения по одному пути, которые обычно реализуются частично с помощью прерываний, основанных на использовании таймера. Противоположность preemption - cooperative scheduling - использует более простой подход, оставляя его до активных потоков, чтобы сигнализировать о его завершении.
В результате кооперативная схема планирования позволяет нити одного процесса нити, чтобы удержать единственный вычислительный ресурс (в данном случае) дольше:
Но что, если активный поток в таком схема должна была стараться оставаться активной навсегда? Вот что происходит здесь, по существу.
Спин-блокировка - активное ожидание блокировки запрашиваемого ресурса. Поток будет просто сидеть там, ожидая, что какой-либо другой поток заблокирует ресурс, который он хочет от него отказаться. Поскольку текст указывает, что аппаратная ситуация позволит только один активный поток за раз, если запрашиваемый ресурс заблокирован, это означает, что он заблокирован неактивным потоком.
Без предварительного исправления до тех пор, пока не будет принято решение прекратить выполнение. Следовательно, когда активная нить закручивает, она будет сидеть там вечно - то, что называется зависанием. Чтобы остановить это, пользователю, вероятно, придется физически отключить систему, очищающую кэш/динамическую память.
С превентивными потоками планирования реализованы как time slices. Когда доступ к конкретным ресурсам необходим, прежде чем дальнейшая работа может быть завершена в потоке, имеет смысл spinlock - оживленное ожидание.
С предопределением ядро будет автоматически force context switch после определенного количества времени, поэтому даже с одним процессором не будет зависания. В конце концов поток с ресурсом lock получит некоторое время и освободит его ресурс. Когда поток спин-блокировки получит свое следующее запланированное время, он сможет заблокировать ресурс и продолжить.
В целом это означает, что вы не повесите.
Однако спинлки все еще страдают более сложные проблемами с упреждающим планированием, такие как тупик ... когда два потока, каждый spinlocked держа ресурсы друг друга:
Однако такие случаи часто можно избежать посредством защиты ядра от запросов блокировки ресурсов.
В идеальном мире совместное планирование с тщательным дизайном потоков может потенциально привести к более быстрому выполнению критических процессов. Следовательно, это был общий подход в более старых ОС, таких как Mac OS и Windows 3.x. Однако с увеличением вычислительных требований становится все труднее избежать недостатков совместного планирования, поэтому практически все современные ядра операционной системы используют предварительный планировщик.
Обратите внимание на ту часть, где говорится: * «Без предоплаты, ...» * –
ohhh .. получил! благодаря!! –