Как многопоточность SMP совместно использует память и прерывания?

"Хост" является компьютером, что Вы работаете на контейнере - так, чтобы действительно относился к Вашему ноутбуку Win 10, если это - машина, которая выполняет Докера и является машиной, на которой Вы создали контейнер.

, вероятно, просто необходимо обновить к 1809 сборки Windows 10 (выпуск октября 2018). Я столкнулся с той же проблемой, и я заметил, что моя машина все еще выполняла 1803 - даже при том, что я беру автоматические обновления. Я просто перешел к обновлению окон и вручную проверил на обновления.

9
задан Ciro Santilli 新疆改造中心法轮功六四事件 11 November 2015 в 13:36
поделиться

3 ответа

Справочник IA-32 ответит на Ваши вопросы окончательно.

Мой инстинкт пищеварительного тракта - то, что оба ядра rx прерывания и ОС добираются для улаживания их. Существует, вероятно, регистр установки на каждом ядре, которое указывает, какое ядро добирается который прерывание.

Коллизия. Никакая гарантия. Чтобы быть более точными, изучите механизмы кэширования и как они разбираются в когерентности.

Для других потоков, связанных с этим:

Как делают прерывания в multicore/multicpu работе машин?

1
ответ дан 4 December 2019 в 21:13
поделиться

ОС добирается для установки, где прерывания обрабатываются. Linux делает выравнивание нагрузки прерываний, так, чтобы они могли быть обработаны обоими центральными процессорами. Каждый обработчик прерываний должен получить блокировку, чтобы избежать параллельного выполнения того же обработчика на различном ЦП, но также и защитить от другого кода ядра, работающего в контексте непрерывания и получающего доступ к тем же структурам данных. Однако я думаю, что можно связать выполнение данного прерывания на данном ЦП.

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

Взгляд на Интернет (на Google или Википедии) о том, что гонка данных и запускает путем изучения, как написать многопоточный код правильно в Java. Изучение, который сделал меня намного легче понять механизмы параллелизма ядра Linux.

Или просто пойдите для C/C++ почти "официальная" модель памяти FAQ для Documentation/memory-barriers.txt от исходного дерева ядра Linux, или для сообщения Jeremy Manson по проблеме. Так или иначе я забыл указывать, что значение, которое Вы читаете, было не обязательно на самом деле записано некоторым процессором. Для 32-разрядных значений это гарантируется тем, что запись на 32 бита является атомарной. Для значений на 64 бита это не обычно верно (я не уверен платформы приблизительно на 64 бита, но из-за причин мобильности я обычно не полагаюсь на него).

В любом случае, если Вы задаете, что вопрос, вероятно, необходимо улучшить блокировку, используемую кодом. Работая в ядре, сначала необходимо записать собственную библиотеку спин-блокировки/семафора для фиксации этого.

При высказывании "ядра" не ясно, что Вы имеете в виду, но я думаю, что маловероятно, что Вы на самом деле имеете в виду "ядро, которое я пишу". Так или иначе я не позволю никому задающему вопрос (2) для запущения многопоточных программ на моей машине :-).

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

Ответ на тот вопрос - что-то, что необходимо знать, чтобы записать также пространству пользователя многопоточные программы. Ну, Вы не должны знать точный ответ на, "которые оценивают Вас чтение", но просто потому что Вы не можете полагаться на это, это определяется реализацией, даже если Вы пишете ассемблерный код для определенного процессора. Просто, потому что Вы не можете полагаться на относительную скорость двух параллельных потоков. Когда-либо.

2
ответ дан 4 December 2019 в 21:13
поделиться

В процессорах x86 это обрабатывается APIC. Подробную информацию можно найти в Руководстве разработчика программного обеспечения для архитектур Intel® 64 и IA-32 , особенно в томе 3 , главе 9, и в спецификации x2APIC . 1265] Я просто дам краткое резюме на случай, если вы не хотите вдаваться в подробности.

Прерывания могут поступать из трех разных источников:

  • Внешние контакты (в процессорах Intel до Core i7 у вас есть LINT0, LINT1, SMI, INIT. Я не знаю, как они называются в Core i7, AMD или через процессоры.
  • Шинные транзакции. Это основной способ, которым один поток отправляет прерывание другому потоку в современной системе. Они называются IPI - I nter- P процессор I nterrupts.
  • Внутренние события, такие как тепловые прерывания, мониторы событий или внутренние ошибки.

Каждый логический процессор (поток в системе SMT, ядро ​​в многоядерной системе без SMT, процессор в не-SMT не-многоядерной системе) имеет APIC. APIC управляет тем, как логический процессор реагирует на любые такие прерывания.

Вкратце:

Выводы SMI и INIT всегда маршрутизируются на SMI или INIT, соответственно.

Если APIC отключен, LINT0 направляется на INTR, LINT1 направляется в NMI, а IPI игнорируются.

Если он включен:

  • LINT0, LINT1, тепловые события, каждый из мониторов событий и ошибок имеет запись в LVT ( L ogical V ector T able), которая указывает, замаскирован он или нет, и если нет, то какой тип прерывания будет.
  • IPI обрабатываются. IPI включают тип прерывания (например, INTR, SMI, NMI, INIT, SIPI) и пункт назначения. Каждый логический процессор имеет APIC-ID, то есть. Если пункт назначения IPI совпадает с его идентификатором, он обрабатывает прерывание. В противном случае он игнорирует его.

Если вам нужны подробности о включении APIC, программировании LVT, установке APIC-ID и отправке IPI, вам нужно будет посмотреть руководства, на которые я ссылаюсь.

INIT, SIPI) и место назначения. Каждый логический процессор имеет APIC-ID, то есть. Если пункт назначения IPI совпадает с его идентификатором, он обрабатывает прерывание. В противном случае он игнорирует его.

Если вам нужны подробности о включении APIC, программировании LVT, установке APIC-ID и отправке IPI, вам нужно будет посмотреть руководства, на которые я ссылаюсь.

INIT, SIPI) и место назначения. Каждый логический процессор имеет APIC-ID, то есть. Если пункт назначения IPI совпадает с его идентификатором, он обрабатывает прерывание. В противном случае он игнорирует его.

Если вам нужны подробности о включении APIC, программировании LVT, установке APIC-ID и отправке IPI, вам нужно будет посмотреть руководства, на которые я ссылаюсь.

7
ответ дан 4 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: