2014-01-18 2 views
13

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

Реальное использование для НОД является диспетчерских задач на несколько ядер, не делая вас программист, беспокоиться о которых ядро ​​выполняет какую задачу.

и

В центре НОД стоят очереди отправки. Dispatch queues - это пулы потоков.

и, наконец,

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

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

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

ответ

26

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

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

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

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

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

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

Каждую нить выполняет задачу?

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

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

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

+0

Благодарим за прекрасное объяснение! –

1

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

1

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

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

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

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

Смежные вопросы