Как pthreads выполняет многопоточность и планирование - PullRequest
0 голосов
/ 27 октября 2010

Мне было интересно, как pthreads-win32 (реализация pthreads в Windows) реализует перекрестную многопоточность?Это написано исключительно с Windows API?Я проверил некоторые из источников, и кажется, что большинство действительно написано с помощью Windows API, но мне было интересно, использует ли он планировщик Windows для переключения между потоками (и ядрами), или он реализует свой собственный?В частности, большинство процессоров в настоящее время реализуют свой собственный планировщик (например, я читал об архитектуре itanium arch, аппаратная логика поддерживает два потока на ядро ​​и даже автоматически переключается между ними с помощью логики hw, поэтому очевидно, что поддержка ОС для нескольких ядер не обязательнонеобходимо), поэтому, если у меня устаревшая ОС, такая как Windows 32-bit или что-то, что не поддерживает многоядерные процессоры, будет ли программа, написанная с помощью pthreads-win32, работать на более чем одном ядре процессора или будет только одно ядро?used?

Как насчет реализации pthreads (незаполненные потоки posix)?Поддерживают ли они многоядерные процессоры, даже если ОС, на которой они работают, не поддерживает?

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

При дополнительном запросе, можете ли вы, пожалуйста, порекомендовать библиотеку, поддерживающую выполнение многоядерных потоков, даже еслиОС, на которой работает программа, НЕ ДЕЛАЕТ.Если существует какой-либо из.

Кроме того, существует ли способ обеспечить выполнение двух потоков, написанных с помощью pthread, на разных ядрах, или ОС (или процессор, или библиотека pthreads) выполняет назначение автоматически?Гарантирует ли pthread выполнение на разных ядрах, если они доступны?

Cheers, Val

РЕДАКТИРОВАТЬ: я знаю, что большинство из этих вопросов зависят от реализации, поэтому я имел в виду эту реализацию pthreads для Windowshttp://sourceware.org/pthreads-win32/. Я специально не упоминал об этом раньше, потому что, насколько я знаю, это самая популярная и широко используемая реализация pthreads для Windows.

Ответы [ 2 ]

1 голос
/ 28 октября 2010

Итак, из того, что я получаю, самое важное, на что следует обратить внимание, это то, что многопоточность очень мало связана с параллелизмом (например, UMA с многоядерными процессорами). Таким образом, хотя многопоточность может быть способом реализации параллелизма, это не способ обеспечить АКТУАЛЬНОЕ параллельное выполнение, что я искал в первую очередь, поскольку я изучаю параллельные и распределенные системы и алгоритмы.

Так, чтобы ответить на один вопрос за один раз. Да, pthreads и, вероятно, большинство (если не все) других API-интерфейсов потоков основаны на API-интерфейсе операционной системы. Какой ofc дает им те же ограничения, что и ОС. Это означает, что да, если ОС (конкретно в данном случае, некоторые окна, работающие, например, pthreads-win32) не поддерживают несколько ядер, всегда используется только одно ядро. Как указано на предоставленной вики-странице, ссылка на: «Гиперпоточность требует, чтобы операционная система не только поддерживала несколько процессоров, но и была специально оптимизирована для HTT, а Intel рекомендует отключать HTT при использовании операционных систем, которые имеют не был так оптимизирован ". http://en.wikipedia.org/wiki/Hyper-threading Это означает, что в большинстве случаев просто планировщик аппаратных средств (базовый) недостаточно для использования преимуществ нескольких ядер, он должен поддерживаться / использоваться SW (поддержка ОС).

Хотя это может и не быть окончательным доказательством, я считаю, что достаточно доказательств указывает в том же направлении, чтобы подтвердить, что это так.

Я не просеивал источники pthreads (для posix-совместимых ОС), полагаю, что то же самое относится и к этому API, так как более вероятно, что он будет использовать базовый API OS. Вам придется подтвердить это самостоятельно. :)

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

Чтобы обеспечить параллелизм (выполнение на разных ядрах) вручную, linux предоставляет способ закрепления потока за конкретным виртуальным процессором (при определенных условиях). Чтобы привязать весь процесс к определенному (виртуальному) процессору / ядру, можно использовать sched_setaffinity () (из sched.h). Как указывалось в nos, pthreads предоставляет pthread_setaffinity_np () для закрепления определенного потока на конкретном ядре. Windows поддерживает аналогичную функциональность с SetThreadAffinityMask (), поэтому очевидно, что назначение потоков вручную для параллельного запуска на разных ядрах возможно (если ОС поддерживает многоядерные системы).

Из моего опыта кодирования с помощью pthreads, если вы пишете для кода, который использует несколько потоков (более 2), они ДОЛЖНЫ выполняться на нескольких физических ядрах, если они доступны (что, вероятно, является функцией ОС, используемой pthreads).

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

Приветствия, Val

0 голосов
/ 27 октября 2010

Как правило, каждая современная ОС поддерживает потоки самостоятельно и распределяет их по разным (виртуальным) ядрам системы. ОС предоставляет некоторые общие методы синхронизации (например, мьютексы, семафоры или барьеры), которые используются pthread для реализации API pthreads.

С двумя потоками на ядро ​​(я думаю, вы имеете в виду Hyper Threading) на некоторых процессорах Intel (например, Itanium) ОС видит два «виртуальных» ядра. Процессор действительно планирует два потока на одно физическое ядро. (См. Википедия )

Однако есть примеры, когда Runtime-Plattforms реализуют свои собственные Thread-Conceptepts и выполняют планирование: я думаю о (по крайней мере, старых) реализациях Java, имеющих свои собственные процедуры планирования.

...