我可以更改XPC服务的服务质量级别吗?



我希望在我的应用程序中安装一个XPC服务,它需要即时处理用户输入(从单独的进程接收(。

QOS的文档说明:

在XPC服务中,主线程以默认的QoS运行

我需要能够将XPC服务线程设置为具有user-interactive的QoS,以确保用户输入事件以确保发生这种情况。

是否可以更改XPC服务线程的QoS?

我知道我可以创建一个守护进程,并使用以下方法设置任务策略:

struct task_qos_policy qosinfo;
memset(&qosinfo, 0, sizeof(qosinfo));
qosinfo.task_latency_qos_tier = LATENCY_QOS_TIER_0;
qosinfo.task_throughput_qos_tier = THROUGHPUT_QOS_TIER_0;
task_policy_set(mach_task_self(),
TASK_BASE_QOS_POLICY,
&qosinfo,
TASK_QOS_POLICY_COUNT);

这样做,比如在XPC服务的主要方法中,是实现这一目标的一种可能且适当的方式吗?

我当然可以创建一个守护进程,但我目前正在研究如何使我的体系结构与沙盒一起工作,这样我就可以通过Mac应用商店进行分发。

我们遇到了一个问题,XPC服务的性能比在应用程序中运行相同的代码差得多。在我们的头撞墙几天后,我们终于在"上下文切换";";"系统跟踪";仪器我们的一些线程会有";"阻塞";条目看起来像这样:

00:09.911.098   Preempted at priority 4 for 32.44 ms because thread was taken off CPU temporarily to cool the processor and surrounding hardware.

33毫秒的失速在我们的场景中相当糟糕。幸运的是,我找到了一个非常简单的解决方法。似乎只要存在尚未调用的XPC回复块,XPC服务的QoS级别就会提高。

因此,解决方法如下:

  1. 启动时,从应用程序向XPC服务发送一条消息。该消息应该包括一个XPC回复块
  2. 当XPC服务获得消息时,保留应答块,但不要调用它

在我的设置中,这使XPC服务保持在更高的优先级,这样我们就不会被抢占。这是在macOS 11.6上。

最新更新