hou*_*oft 6 macos objective-c launchd nice
有没有办法基本上调用system(),但具有预定义的niceness值(20)和Objective-C的低IO优先级?
(我正在谈论的低IO优先级设置是launchd有的)
我正试图/usr/bin/purge从我的Objective-C程序中启动.
它也适用于批准Mac App Store的方法.
编辑:不再 fork 和 exec,因为 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: 这就是政策本身。根据Apple文档,它指定了这一点:具有 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值。
| 归档时间: | 
 | 
| 查看次数: | 1104 次 | 
| 最近记录: |