2

У меня есть небольшие сомнения относительно синхронизации в ядре linux, то есть какой метод блокировки подходит между режимом контекста прерывания и контекстом процесса для защиты критической области.Как обеспечить синхронизацию между контекстом прерывания и контекстом процесса

Заранее спасибо .....

+0

Я не знаю о Linux конкретно, но, как правило, для большинства операционных систем существует флаг «отправки», который устанавливается, если обработчик прерываний устанавливает готовый поток более высокого, чем текущий приоритет. В этом случае обработчик прерываний выходит из диспетчера (для контекстного переключателя) вместо того, чтобы просто возвращаться. Чтобы иметь дело с вложенными прерываниями, существует также флаг, используемый для отслеживания того, какое прерывание было начальным прерыванием, так что только начальное прерывание по желанию выходит через диспетчер (только вложенные будут возвращаться). – rcgldr

+1

Важно помнить, что обработчик прерывания не может спать; он не имеет контекста задачи. Поэтому, если вам нужно синхронизировать ресурс с обработчиком прерываний, вы не можете использовать мьютекс или семафор (они могут спать); это должна быть спин-блокировка или эквивалент. Это, конечно, подразумевает, что вы не должны долго удерживать блокировку (и вы не можете ничего делать в контексте задачи, который может блокироваться, удерживая ее). –

+0

Ну, вы можете, конечно, отправить единицы в семафор. –

ответ

0

Хийи решений определения типа: semaphors (или мьютекса), testandset и OFC спина-блокировок обеспечивает защиту критического кода: это либо garunteeing атомной операции (средство блокировки для например, потребуется всего одна операция, чтобы завершить и реализовать блокировку, протоколы, такие как протокол пекарни, и отключить попытку процесса (и это то, что вы хотите); - заблокирован никто другой, не может войти в этот критический код (допустим, вы использовали разделяемую память или что-то в этом роде), поэтому даже если есть переключатель контекста и два потока вместе, мы обещаем, что только один может получить доступ к этому коду, предполагается, что все потоки, которые используют эту память или w/e, имеют критический регион имеет одинаковые тип замка aquire

для получения дополнительной информации о спин-блокировки (которая отключить peeamption ЦП) относятся к этому: http://www.linuxinternals.org/blog/2014/05/07/spinlock-implementation-in-linux-kernel/ обратите внимание, что блокировка делает «занят ожидание» - значит, пока preeamption включен, и вы не aquire Закрепить процессор «Истощение» время расчета на работу в бесполезной цикле

вы можете также использовать IRQ \ выгрузить команды напрямую, но это довольно опасно например:

preempt_enable()  decrement the preempt counter 
preempt_disable()  increment the preempt counter 
preempt_enable_no_resched() decrement, but do not immediately preempt 
preempt_check_resched()  if needed, reschedule 
preempt_count()   return the preempt counter 

, так как я не знаю, что вы пытаетесь достичь этого k inda трудно идти конкретным и отвечать на ваши потребности, но я действительно копаю сонные семафоры: http://www.makelinux.net/books/lkd2/ch09lev1sec4 В отличие от остального решения, которое я предложил, они не будут делать ожидание, что экономит время вычисления.

Я действительно надеюсь, что я помог в этом ... gl!

Смежные вопросы