Использование терминов "очереди", "многоядерные" и "потоки" в Grand Central Dispatch

Я пытаюсь разобраться в концепциях Grand Central Dispatch. Я хочу понять эти цитаты из книги Вандада о параллельном программировании.

Реальное использование для GCD - это отправка задач на несколько ядер, не делая вас программистом, беспокоиться о том, какое ядро ​​выполняет какую задачу.

и

В основе GCD лежат очереди отправки. Очереди отправки - это пулы потоков.

и, наконец,

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

Я выделил ключевые термины.

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

Ответ 1

Таким образом, несколько ядер совпадают с очередями?

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

Очередь состоит из многих потоков?

Очередь состоит из задач. Задачи назначаются потокам системой управления очередями, когда наступает время для выполнения этой задачи. Темы являются ресурсами ОС и распределяются по ядрам, которые эффективно запускают их и не имеют понятия о том, что такое задача (за исключением процессоров Hyper-Threading).

Если вы не учитываете аппаратное многопоточное (например, Hyper-threading), в любой момент времени ядро ​​запускает конкретный поток; когда наступает время запуска другого потока, в этом ядре возникает контекстный переключатель. Если вы учитываете аппаратную многопоточность, вы можете иметь несколько потоков, работающих на виртуальных ядрах, размещенных в одном физическом ядре.

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

Каждый поток выполняет задачу?

В любой момент времени поток выполняет задачу. Вы можете создавать нити, выполняющие их задачу, и умирать; или у вас могут быть длинные потоки (т.е. основной поток), которые выполняют несколько задач.

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

GCD нацелен на то, чтобы позволить вам рассуждать исключительно в абстрактных терминах: то есть с точки зрения задач и очередей и забывать о потоках и ядрах, которые рассматриваются как своего рода "средства реализации" или низкоуровневые детали, которые вы можете оставьте систему эффективной для использования.

Ответ 2

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

Ответ 3

Я не уверен, что эти цитаты действительно оправдывают GCD. Например, чтобы взять каждую цитату по очереди:

  • GCD более чем полезен (и полезен), даже если у вас есть только одно ядро, поскольку многопоточность некоторых задач занимает место в информатике независимо от количества доступных физических ядер. Лучше подумать об этом как о альтернативном управлении потоками явным образом - GCD будет управлять потоками, поэтому вам не нужно, вы (как программист) просто должны думать в терминах очередей и должны ли выполняться определенные связанные задачи или может выполняться одновременно.

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

Третья цитата хороша - это подходящая идиома для охвата. Просто отправьте свою работу (будь то блокировки или функциональные/контекстные кортежи) в соответствующую очередь, создавая очереди по мере необходимости, чтобы связать ресурсы, требующие синхронизации, и у вас есть суть GCD.