Я искал в Интернете, и ответы, которые я нашел, были предварительными. То есть люди думали, что так и происходит, но не были уверены.

Если принять меры предосторожности для синхронизации и предотвращения коллизий, могут ли потоки из одного и того же процесса выполняться одновременно в многоядерных системах?

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

3 ответа3

1

Да, суть нескольких процессоров или процессорных ядер в том, что все они могут одновременно выполнять разные задачи; в противном случае, зачем кому-то создавать многоядерную систему, если все остальные ядра должны были ждать, пока первое из них завершит работу?

Это также, почему примитивы синхронизации, такие как спин-блокировки, мьютексы, барьеры и т.д. существуют и необходимы в первую очередь, что подтверждается сотнями ошибок, обнаруженных в реальном программном обеспечении (ядрах и обычных многопоточных программах), которые были вызваны одновременным доступом нескольких потоков к одним и тем же структурам данных после того, как они забыли "заблокировать" их ,

1

Да, они могут. В большинстве операционных систем, о которых я знаю, и, конечно, под Windows и Linux, нет ничего, что говорило бы о том, что одновременно может работать только один из потоков процесса. На самом деле планировщик Windows уделяет очень мало внимания «из какого процесса возник поток?»"в принятии своих решений. В системе с n ядрами n потоков могут работать буквально одновременно. Не имеет значения, все ли они из одного процесса, из четырех разных процессов или из любой комбинации.

Для Windows вы можете легко продемонстрировать это с помощью приложения "cpustres". Вы можете найти это в "Книжных инструментах Windows Internals", пакете, распространяемом Марком Руссиновичем на сайте инструментов sysinternals. Сделайте вашу систему настолько тихой, насколько это возможно, затем используйте cpustres для создания двух потоков и установите их "уровень активности" на максимум. Затем проверьте графики времени вашего процессора в диспетчере задач. Или используйте Process Explorer, чтобы следить за временем процессора двух потоков.

Книга Windows Internals содержит полную информацию о том, как работает планировщик (а не "планировщик задач", планировщик потоков). Это долго читать, но оно того стоит. Последняя версия этой книги охватывает Windows 7, но с тех пор в этой области не произошло каких-либо значительных изменений.

0

Я также искал этот ответ, в частности, для процессоров Intel. В случае с Intel обзор технологии Hyper-Threading проясняет это:

Технология Intel® Hyper-Threading (технология Intel® HT) более эффективно использует ресурсы процессора, позволяя запускать несколько потоков на каждом ядре.

Поэтому да! Потоки из одного процесса будут распределены между многими ядрами и будут работать параллельно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .