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

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

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

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

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

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

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

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

Что здесь происходит? Это просто библиотека, или это целая "система"?

Ответы

Ответ 1

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

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

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