Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Это просто сочетание user-level спинлока и kernel-level примитивов
futex-ы реализованы в ядрену все таки не совсем так. Синхронизация легко делается в user-space из атомарных примитив, спинлок скорее вспомогательный механизм. А вот остановить поток и передать управление другому — без помощи ядра не обойтись. Вот и хотелось бы знать подробнее о механизмах.
могу предположить, что если кто-то ждёт нашего запертого спинлока, то ядро переводит страницу со спинлоком в r/o и по пейджфолту выясняет, когда мы его отпираемЭто слишком сурово. Фьютекс усыпляет поток, пока значение блокировки равно проверяемому значению. У мьютекса три состояния: 0 — свободен, 1 — захвачен одним потоком, 2 — захвачен и есть ожидающие потоки.
<code class="cpp">mutex_lock(mutex *lock) { //увеличиваем блокировку на 1 и проверяем предыдущее значение //если был 0, то теперь там 1 и поток успешно захватил мьютекс if(xchg_add(&lock,1) == 0) return; //ядро приостановит поток пока lock равен 2 while(xchg(&lock, 2) != 0) syscall_futex(&lock, 2); } В идеальном случае lock равен 0 и захват обойдётся в одну операцию xchg_add (xadd для x86) mutex_unlock(mutex *lock) { if(xchg(&lock, 0) != 1) { //есть ожидающие потоки //разбудим один syscall_futex_wake(&lock,1); } } Аналогично, если нет ожидающих потоков lock равен 1 и освобождение происходит за одну операцию xchg, в противном случае вызывается FUTEX_WAKE </code>
Мне известны следующие примитивы синхронизации:
User/kernel mode: mutex+cond, sema, enter/leave critical section.
Kernel only: spinlock, управление прерываниями.
Это сочетание спинлока и мьютекса, аналогично фьютексам выше
Ну и, кроме того, там же написано — «мне известно». Наверняка на свете есть что-то, что мне неизвестно. :)
User/kernel mode: mutex+cond, sema, enter/leave critical section.
Kernel only: spinlock, управление прерываниями.
Обзор примитивов синхронизации — mutex и cond