Что происходит в двух исполнительных блоках, если два потока в одном и том же процессе управляются ОС, одновременно обращающейся к одному и тому же виртуальному адресу? - PullRequest
1 голос
/ 16 февраля 2020

Что происходит в вычислительной системе с двумя исполнительными блоками, такими как Core2 Duo, если два потока в одном и том же процессе, управляемом ОС (поток уровня ядра), во время выполнения обращаются к одному и тому же виртуальному памяти адресу?

Привет, я пытаюсь понять разницу между потоком уровня пользователя и потоком уровня ядра и доступом к виртуальному памяти адресу? или физический память адрес? ... Я не знаю, будут ли эти программы обрабатывать sh, и обе будут давать ожидаемые результаты, или же эти программы не будут обрабатывать sh, но обе будут давать неожиданные результаты или, может быть, эти программы могут взломать sh.

Чем мне следует руководствоваться?

Спасибо.

Ответы [ 5 ]

1 голос
/ 24 февраля 2020

Что происходит в вычислительной системе с двумя исполнительными блоками, такими как Core2 Duo, если два потока в одном и том же процессе, управляемом ОС (поток уровня ядра), во время выполнения обращаются к одной и той же виртуальной памяти?

Происходит одно из двух:

  1. Если автор программного обеспечения, работающего в исполнительных блоках, следовал правилам платформы для таких доступов, они получают любое поведение, которое платформа определяет для таких доступов .

  2. Если автор программного обеспечения, работающего в исполнительных блоках, не следовал правилам платформы для такого доступа, результаты часто непредсказуемы или не определены.

Типичным правилом платформы может быть то, что к объекту нельзя получить доступ в одном потоке или исполнительном модуле, в то время как другой поток или исполнительный модуль изменяет или может изменять его. Типичные современные платформы не имеют проблем с одновременным чтением.

1 голос
/ 24 февраля 2020

Из того, что я могу понять из вашего вопроса, вы смешиваете разные понятия, а именно: Несколько исполнительных блоков и условия гонки , Виртуальная память и Уровень пользователя против Потоки уровня ядра

Что происходит в вычислительной системе с двумя исполнительными блоками, такими как Core2 Duo, если два потока в одном и том же процессе, управляемом ОС (поток уровня ядра) во время выполнения, обращаются к одному и тому же виртуальная память

Ну, это обычно всегда так, n ядра / процессоры не имеют значения. Это базовая c концепция многопоточности. Так что What happens такой же, как в what will happen when multiple threads access a shared resource. Разработчик всегда должен учитывать обычное состояние гонки.

Теперь не смешивайте Virtual memory с этим. Потоки уровня пользователя / ядра будут просто обращаться к адресу памяти только в режиме виртуальной адресации. Это происходит потому, что как только виртуальная память включена в защищенном режиме, она переходит к процессору, который выполняет неявные преобразования из виртуальных адресов в физические (с использованием таблиц Page / et c, настроенных OS).

0 голосов
/ 26 февраля 2020

Вопрос What happens... касается различных уровней абстракции (пользовательская земля к оборудованию).

На самом деле What happens относится к аппаратному уровню:

Есть два одновременных (в основном, происходят в один и тот же машинный цикл) обращается к одному и тому же физическому адресу памяти.

Там возникают следующие 3 возможности: (При наличии адреса памяти X с содержанием C(X), равным x0.)

а) при двух чтениях будет достигнут определенный результат c: оба будут наблюдать x0 как значение.

b) одно чтение, одна запись (значение: x1), которую может наблюдать читатель x0 или x1, в зависимости от порядка доступа (см. Ниже).

c) две записи (значения: x1, x2), затем может быть получено окончательное содержимое C(X) в конечном итоге получится x1 или x2, в зависимости от порядка (см. ниже)

В случаях b) и c) у наблюдателя может возникнуть впечатление недетерминированного поведения c. Однако базовое поведение на самом деле все еще детерминировано c.

Фактический результат этих одновременных (at the same time) обращений определяется деталями оборудования. В основном:

  • стратегия выделения шины
  • стратегия когерентности кэша

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

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

0 голосов
/ 26 февраля 2020

Короткий ответ на вопрос «что происходит при одновременном доступе к памяти» таков: это сложно .

Вероятно, наиболее канонический отчет по теме: Модели согласованности памяти для общего ресурса - Мультипроцессоры памяти Kouro sh Gharachorloo . Первый абзац вступления может показаться немного устаревшим, но он предоставляет достаточно справочной информации, чтобы сделать отчет вполне читабельным для неэкспертов, и с тех пор никаких фундаментальных изменений не произошло.

Core 2 Duo следует модели Непротиворечивость процессора (как и любой другой процессор x86), поэтому без какой-либо явной синхронизации все процессоры будут эффективно согласовывать порядок записи в любую заданную область памяти, но при чтении из разных мест они могли наблюдать записи в разных порядках.

Core2 Duo реализует когерентность кэша через протокол MESI .

Имейте в виду, что, поскольку x86 позволяет доступ без выравнивания, то, что выглядит как один доступ к памяти в одной инструкции, на самом деле может быть двумя обращениями к памяти в разные места , если случится пересечение границы строки кэша. Если вы программируете на языке более высокого уровня (выше, чем на ассемблере), язык может навязывать свою семантику параллельным доступам к памяти (и обычно это делает).

0 голосов
/ 24 февраля 2020

Существует два случая:

  1. Кадр страницы памяти уже сопоставлен и имеет совместимые разрешения на доступ. В этом случае оба потока обращаются к памяти.
  2. Кадр страницы памяти не сопоставлен или имеет разные права доступа. В этом случае поток доступа генерирует аппаратное прерывание, и ядро ​​обрабатывает это прерывание, отображая страницу или генерируя сигнал SIGSEGV для потока, если страница не может быть отображена. Когда другой поток обращается к тому же фрейму страницы во время отображения, поток блокирует примитив синхронизации в ядре до завершения операции отображения (в Linux, который является rw_semaphore mmap_sem членом struct mm_struct). Другими словами, ядро ​​ОС защищает свои структуры данных от состояния гонки.
...