Grand Central Dispatch如何真正使用操作系统?

Jer*_*ill 14 objective-c grand-central-dispatch ios

我对GCD如何工作有一个很好的想法,但我想更多地了解被吹捧的"操作系统管理"内部.几乎所有关于Grand Central Dispatch如何与"操作系统"协同工作的技术解释都完全不同.我会解释一些我的发现.

"它是一个守护程序,它是操作系统的全局,可以在许多核心上分配任务."

我并不傻到相信这一点.

"内核中内置了支持以了解所有GCD应用程序.GCD应用程序与内核协同工作,就如何管理应用程序中的线程做出逻辑决策."

听起来这种同步方案比仅仅管理应用程序中的逻辑要慢得多.

"GCD仅存在于应用程序中,并使用当前系统负载作为其行为的度量标准."

这对我来说听起来更真实,但我只在一个地方看到了这样的陈述.

这里到底发生了什么?它只是一个图书馆,还是整个"系统"?

Lou*_*arg 22

它是一个库,但有一些内核优化允许系统级控制.特别是,有一个额外的接口pthread_workqueue允许GCD告诉内核它想要一个线程来运行某个特定的函数,但实际上并没有启动一个线程(它基本上是一个延续).此时,内核可以根据系统负载选择是否启动延续.

所以是的,有一个全局系统范围的基础设施来管理内核中的GCD线程,第二个答案是正确的.你所犯的错误是认为那里存在同步,这会花费一些成本.调度程序无论如何都会运行,GCD所做的是使用一个新的接口,让调度程序不仅根据它们的相对优先级决定是否运行线程,而且是否创建或销毁线程为好.

这是一个(重要的)优化,但它并不是绝对必要的,FreeBSD端口实际上并不支持系统范围的东西.如果你想查看实际的接口,这里是pthread_workqueue.h,实现在Apple的pthread.c中,你可以看到内核用于在start_wqthread.s中的asm存根中启动工作队列的存根入口点.如果你真的想要的话,你也可以通过xnu来查看它如何上传到存根.