Я хотел бы поэкспериментировать с потоками на многоядерном процессоре, например, чтобы создать программу, которая использует два разных потока, которые выполняются двумя разными ядрами процессора.
Однако мне неясно, на каком уровне потоки распределяются между различными ядрами. Я могу представить себе следующие сценарии (в зависимости от операционной системы и реализации языка программирования):
- Распределение потоков управляется операционной системой. Потоки создаются с помощью системных вызовов ОС, и, если процесс выполняется на многоядерном процессоре, ОС автоматически пытается распределить / запланировать разные потоки на разных ядрах.
- Распределение потоков управляется реализацией языка программирования. Распределение потоков между различными ядрами требует специальных системных вызовов, но стандартные библиотеки потоков языка программирования автоматически обрабатывают это, когда я использую стандартную реализацию потоков для этого языка.
- Распределение потоков должно быть запрограммировано явно. В моей программе я должен написать явный код, чтобы определить, сколько ядер доступно, и распределить разные потоки по разным ядрам, используя, например, библиотечные функции.
Чтобы конкретизировать вопрос, представьте, что я написал свое многопоточное приложение на Java или C ++ для Windows или Linux. Будет ли мое приложение волшебным образом видеть и использовать несколько ядер при работе на многоядерном процессоре (потому что все управляется операционной системой или стандартной библиотекой потоков), или мне придется изменить свой код, чтобы знать о нескольких ядрах? ?
источник
У меня когда-то была огромная среда SGI IRIX. Просто ради этого я написал небольшую многопоточную Java-программу (которая просто ничего не делала, но потребляла циклы ЦП) и создал в ней 12 потоков. Работа охватила 12 процессоров в архитектуре NUMA. Может быть, я посмотрю программу и запустим ее на Dell R910s и проверим ..
источник