Один из способов сделать это - зарегистрировать пакет потоков в коде пользователя для какого-либо прерывания по таймеру от ядра.Всякий раз, когда он получает такое прерывание, он может сказать ядру прекратить выполнение всех потоков ядра, которые сами запускают несколько разных потоков.Для каждого из этих потоков код прерывания таймера может проверять стек на наличие этих потоков, записывать важную информацию (регистры, указатель стека, счетчик программ и т. Д.) Во вспомогательном месте, а затем загружать сохраненную информацию для другого из смоделированногопотоки, работающие на этом фактическом потоке.Затем он может возобновить поток ядра, на котором выполняется смоделированный поток.Таким образом, вы можете симулировать переключение контекста между несколькими потоками, работающими в одном потоке ядра.
Чтобы реализовать что-то вроде блокировки, вы можете отслеживать всю информацию о блокировке локально в своем пользовательском пространстве.Всякий раз, когда моделируемый поток пытается получить блокировку, вы можете проверить, может ли поток успешно получить блокировку.Если это так, вы просто дайте ему замок.В противном случае вы моделируете переключение контекста путем замены того, что симулируемый поток выполняет в этом реальном потоке, а затем помечаете имитированный поток как заблокированный до тех пор, пока блокировка не станет снова свободной.другие подробности здесь (что если один из смоделированных потоков попытается выполнить блокирующую операцию ввода-вывода? Вы не можете просто заблокировать поток ядра, так как это остановит все смоделированные потоки!), но это суть идеи.