Реализация семафоров в ядре ..? - PullRequest
2 голосов
/ 13 июня 2011

Я читаю «Концепции операционной системы», чтобы понять семафоры. Отрывок из книги:

"Критическим аспектом семафоров является то, что они выполняются атомарно. Мы должен гарантировать, что никакие два процесса не могут выполнять waitO и signal () операции над одним и тем же семафором одновременно. Это критический раздел проблема; и в среде с одним процессором (то есть, где только один процессор существует), мы можем решить ее, просто запретив прерывания в течение времени операции wait () и signal () выполняются. Эта схема работает в процессорная среда, потому что, когда прерывания запрещены, инструкции из разных процессов нельзя чередовать. Только работающий в данный момент Процесс выполняется до тех пор, пока прерывания не будут включены, и планировщик не сможет восстановить управление.

В многопроцессорной среде прерывания должны быть отключены на каждом процессор; в противном случае, инструкции от разных процессов (работающих на разных процессоры) могут чередоваться произвольным образом. Отключение прерываний на каждом процессоре может быть трудной задачей и, кроме того, может серьезно производительность Поэтому системы SMP должны обеспечивать альтернативную блокировку методы - такие как spinlocks - чтобы гарантировать, что waitO и signal0 выполнено атомарно. "

Мой вопрос таков:

Как реализован этот спинлок ? Используя аппаратные инструкции, такие как TestAndSet()? Потому что в какой-то момент потребуется некоторая поддержка со стороны аппаратного обеспечения (либо пользователь принимает эту поддержку, либо ядро ​​принимает эту поддержку), потому что нам нужна инструкция, выполняющая тестирование и настройку в одной инструкции (которая не может быть прервана между ними). ​​

Хотя в книге я не могу найти ни одного такого утверждения, что в какой-то момент требуется некоторая аппаратная поддержка. Это объясняет семафор как программный метод для достижения синхронизации. Это вводит в заблуждение?

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Невозможно реализовать спин-блокировки SMP без какой-либо аппаратной поддержки, в этом случае атомарное тестирование и установка и атомарное увеличение.См. здесь для обсуждения того, как это делается на разных архитектурах.

См. Arch / x86 / include / asm / spinlock.h для его реализации в Linux / x86.

0 голосов
/ 13 июня 2011

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

...