Операционная система устанавливает, где обрабатываются прерывания. Linux выполняет распределение нагрузки по прерываниям, чтобы они могли обрабатываться обоими процессорами. Каждый обработчик прерываний должен получить блокировку, чтобы избежать одновременного выполнения одного и того же обработчика на другом процессоре, а также для защиты от другого кода ядра, работающего в контексте без прерываний и обращающегося к тем же структурам данных. Тем не менее, я думаю, что можно связать выполнение данного прерывания на данном процессоре.
О вопросе (2): гарантии в основном те же, что и для машины SMP, то есть исключение не выдается, и результат зависит от того, кто получит выполнить / передать значение в память / передать значение в общий ресурс кеш первый. В любом случае, вы не можете полагаться на значение read - на самом деле, данные гарантии гораздо менее надежны, чем вы ожидаете.
Посмотрите в Интернете (в Google или Википедии), что такое гонка данных, и начните с изучения того, как правильно писать многопоточный код на Java. Изучение этого облегчило мне понимание механизмов параллелизма ядра Linux.
Или просто перейдите к C / C ++ почти "официальной" FAQ по модели памяти , для Documentation / memory-barriers.txt из дерева исходников ядра Linux или для поста Джереми Мэнсона на выпуск .
В любом случае, я забыл указать, что прочитанное вами значение не обязательно было записано каким-либо процессором. Для 32-битных значений это гарантируется тем фактом, что 32-битная запись является атомарной. Для 64-битных значений это обычно не так (я не уверен насчет 64-битных платформ, но по причинам переносимости я обычно не полагаюсь на это).
В любом случае, если вы задаетесь этим вопросом, вам, вероятно, следует улучшить блокировку, используемую вашим кодом. Работая с ядром, вам сначала нужно написать собственную библиотеку spinlock / семафоров, чтобы это исправить.
Когда вы говорите «ваше ядро», неясно, что вы имеете в виду, но я думаю, что вряд ли вы на самом деле имеете в виду «ядро, которое я пишу». В любом случае, я не позволю никому задавать вопрос (2) запускать многопоточные программы на моей машине: -).
Я понимаю, что программы должны
в идеале быть написано, чтобы избежать этих
виды осложнений, но ОС
конечно не могу этого ожидать, и будет
нужно уметь обрабатывать такие события
без удушья.
Ответ на этот вопрос - это то, что вам нужно знать, чтобы писать также многопоточные программы в пользовательском пространстве. Ну, вам не нужно знать точный ответ «какое значение вы читаете», но просто потому, что вы не можете на это полагаться, он определяется реализацией, даже если вы пишете код сборки для конкретного процессора. Просто потому, что вы не можете рассчитывать на относительную скорость двух параллельных потоков. Когда-либо.