Как на самом деле Grand Central Dispatch использует операционную систему?

У меня есть четкое представление о том, как работает GCD, но я хочу узнать больше о разрекламированном внутреннем устройстве «управления операционной системой». Кажется, почти все технические объяснения того, как Grand Central Dispatch работает с «Операционной системой», совершенно разные. Я перефразирую некоторые из своих выводов.

«Это глобальный для ОС демон, распределяющий задачи по многим ядрам».

Я не настолько глуп, чтобы в это поверить.

«В ядро ​​встроена поддержка, чтобы быть в курсе всех приложений GCD. Приложения GCD работают совместно с ядром, чтобы принимать логические решения о том, как управлять потоками в приложении».

Похоже, эта схема синхронизации будет намного медленнее, чем просто управление логикой в ​​приложении.

«GCD существует исключительно в приложении и использует текущую нагрузку на систему как показатель своего поведения».

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

Что здесь происходит на самом деле? Это просто библиотека или целая «система»?


person Jeremiah Morrill    schedule 17.10.2009    source источник


Ответы (1)


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

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

Это (значительная) оптимизация, но она не является строго необходимой, и порт FreeBSD на самом деле не поддерживает общесистемные вещи. Если вы хотите посмотреть на фактические интерфейсы, вот pthread_workqueue.h, реализация находится в pthread от Apple .c, и вы можете увидеть точку входа в заглушку, которую ядро ​​использует для запуска рабочих очередей в своих asm-заглушках в start_wqthread.s. Вы также можете ползти через xnu, чтобы увидеть, как он вызывает заглушку, если вы действительно хотите.

person Louis Gerbarg    schedule 17.10.2009
comment
Спасибо за подробное объяснение! Все мое замешательство началось, когда я прочитал о порте FreeBSD и мне стало интересно, как, черт возьми, функция OSX OS была перенесена (хотя и BSD) в качестве библиотеки! Еще раз спасибо +1 - person Jeremiah Morrill; 18.10.2009