6

有没有办法基本上调用system(),但具有预定义的 niceness 值(20)和来自 Objective-C 的低 IO 优先级?

(我说的低 IO 优先级设置是launchd有的)

我正在尝试/usr/bin/purge从我的 Objective-C 程序中启动。

它也是获得 Mac App Store 批准的方法的理想选择。

4

2 回答 2

4

编辑:不再分叉和执行,因为 OSX 不能真正fork正确。单线程魔术:

setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_THROTTLE);
system("nice -n 20 /usr/bin/purge");
setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_DEFAULT);

这可以去任何地方,如果你愿意,可以在调度块中,或者在你的应用程序中的任何地方。看不到fork。此外,如果您想保留 ObjCish ,请随意system替换。NSTask


fork一个好的旧n怎么样exec

#include <unistd.h>
#include <sys/resource.h>

和:

if(fork()) {
  /* Set IO priority */
  setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_THROTTLE);
  /*IO priority is inherited*/
  execl("nice", "-n", "20", "/usr/bin/purge");
}

让我们来看看:

  • fork: 这没东西看
  • setiopolicy_np:这是我们设置IO优先级的地方(比如launchd)。以下是论据:

    • IOPOL_TYPE_DISK: 我们想限制磁盘 I/O。无论如何,没有其他选项可用。
    • IOPOL_SCOPE_PROCESS: 影响整个过程
    • IOPOL_THROTTLE: 这就是政策本身。Accouring to the Apple documentation,它指定了这一点:

    具有 THROTTLE 策略的 I/O 称为 THROTTLE I/O。如果 THROTTLE I/O 请求发生在另一个 NORMAL I/O 请求的小时间窗口(通常是几分之一秒)内,则发出 THROTTLE I/O 的线程将被强制休眠一段时间。这会减慢发出 THROTTLE I/O 的线程,以便 NORMAL I/O 可以利用大部分磁盘 I/O 带宽。此外,NORMAL I/O 请求可能会绕过内核或驱动程序队列中先前发出的 THROTTLE I/O 请求,并首先发送到设备。在某些情况下,非常大的 THROTTLE I/O 请求将被分解为较小的请求,然后依次发出。

继承I/O优先级,nice部分命令设置nice值。

于 2013-07-07T14:31:22.133 回答
1

一个简单的方法是使用带有-b选项的taskpolicy(8)工具:

system("/usr/sbin/taskpolicy -b /usr/bin/purge");

使用-b选项 taskpolicy 使用setpriority(2)设置后台优先级(PRIO_DARWIN_BG)

将进程设置为 PRIO_DARWIN_BG 会对自身及其所有子进程产生以下影响:

“当线程或进程处于后台状态时,调度优先级设置为最低值,磁盘 IO 被限制(行为类似于使用 setiopolicy_np(3) 设置可限制策略),并且任何套接字的网络 IO 被限制进入后台状态后打开。任何以前打开的套接字 ets 不受影响。

于 2014-08-22T19:59:30.060 回答