Я читаю «Концепции операционной системы», чтобы понять семафоры.
Отрывок из книги:
"Критическим аспектом семафоров является то, что они выполняются атомарно. Мы
должен гарантировать, что никакие два процесса не могут выполнять waitO и signal ()
операции над одним и тем же семафором одновременно. Это критический раздел
проблема; и в среде с одним процессором (то есть, где только один процессор
существует), мы можем решить ее, просто запретив прерывания в течение времени
операции wait () и signal () выполняются. Эта схема работает в
процессорная среда, потому что, когда прерывания запрещены, инструкции
из разных процессов нельзя чередовать. Только работающий в данный момент
Процесс выполняется до тех пор, пока прерывания не будут включены, и планировщик не сможет восстановить
управление.
В многопроцессорной среде прерывания должны быть отключены на каждом
процессор; в противном случае, инструкции от разных процессов (работающих на разных
процессоры) могут чередоваться произвольным образом. Отключение прерываний
на каждом процессоре может быть трудной задачей и, кроме того, может серьезно
производительность Поэтому системы SMP должны обеспечивать альтернативную блокировку
методы - такие как spinlocks - чтобы гарантировать, что waitO и signal0
выполнено атомарно. "
Мой вопрос таков:
Как реализован этот спинлок ? Используя аппаратные инструкции, такие как TestAndSet()
? Потому что в какой-то момент потребуется некоторая поддержка со стороны аппаратного обеспечения (либо пользователь принимает эту поддержку, либо ядро принимает эту поддержку), потому что нам нужна инструкция, выполняющая тестирование и настройку в одной инструкции (которая не может быть прервана между ними).
Хотя в книге я не могу найти ни одного такого утверждения, что в какой-то момент требуется некоторая аппаратная поддержка. Это объясняет семафор как программный метод для достижения синхронизации. Это вводит в заблуждение?