Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在OSX上以编程方式运行具有低IO优先级和高精度值的命令_Objective C_Macos_Launchd_Nice - Fatal编程技术网

Objective c 如何在OSX上以编程方式运行具有低IO优先级和高精度值的命令

Objective c 如何在OSX上以编程方式运行具有低IO优先级和高精度值的命令,objective-c,macos,launchd,nice,Objective C,Macos,Launchd,Nice,是否有一种方法可以基本上调用系统(),但要使用预定义的准确度值(20)和Objective-C的低IO优先级 (我所说的低IO优先级设置就是已设置的) 我正试图从Objective-C程序中启动/usr/bin/purge 对于Mac App Store来说,这种方法也很理想。编辑:不再使用Fork和exec,因为OSX不能真正地Fork正确。单线程魔法: setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_THROTTLE);

是否有一种方法可以基本上调用
系统()
,但要使用预定义的准确度值(20)和Objective-C的低IO优先级

(我所说的低IO优先级设置就是已设置的)

我正试图从Objective-C程序中启动
/usr/bin/purge


对于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);
这可以放在任何地方,如果需要,可以放在调度块中,也可以放在应用程序中的任何地方。看不到
叉子
。另外,如果您想保持ObjCish,可以用
NSTask
替换
system


一个好的旧的
叉子怎么样
n
exec

#include <unistd.h>
#include <sys/resource.h>
让我们来了解一下:

  • fork
    :这里没什么可看的
  • setiopolicy\u np
    :这是我们设置IO优先级的地方(如launchd)。以下是论点:

    • IOPOL\u TYPE\u DISK
      :我们希望限制磁盘I/O。无论如何,没有其他可用选项
    • IOPOL\u SCOPE\u流程
      :影响整个流程
    • IOPOL\u THROTTLE
      :这是策略本身。根据标准,它规定了以下内容:
    具有节流策略的I/O称为节流I/O。如果节流阀I/O 请求发生 在另一个正常I/O的一个小时间窗口(通常是几分之一秒)内 请求时,发出节流I/O的线程被强制休眠一定时间 间隔这会减慢发出节流I/O的线程的速度,以便正常I/O 可以利用大部分磁盘I/O带宽。此外,正常的I/O请求可能会 绕过以前在内核或驱动程序队列中发出的节流I/O请求并发送 先把它安装到设备上。在某些情况下,会出现非常大的节流I/O请求 分解成更小的请求,然后连续发出


I/O优先级是继承的,并且命令的
nice
部分设置nice值

实现这一点的简单方法是使用带有-b选项的工具:

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

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

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


通常,如果您需要启动守护程序,请使用@CodaFi:我真正想要的是以低优先级运行
/usr/bin/purge
,在这种情况下,XPC仍然是正确的选择?听起来不错,但您知道Mac应用商店是否允许这样做吗?@houbysoft:让我做一些检查。@houbysoft:应该可以。App Sandbox允许对
/usr/bin
(以及所有其他命令目录)进行只读访问,我找不到任何东西表明它将任何系统调用限制在访问文件系统的调用之外。现在,
purge
是否可以在沙箱中运行是另一个问题,但这不是问题。只是尝试了一下,得到了很多关于
fork
不安全的消息,例如。我将fork调用替换为
dispatch\u async(dispatch\u get\u global\u queue(0,0),…
call,这似乎有效。策略仍然应该正确继承,对吗?@houbysoft:不这样认为,这不是一个新进程。您也在为父进程设置策略。请尝试我的编辑(不管怎么说,如果它抱怨,那也没关系,我们在fork之后没有使用任何Obj-C)。(我讨厌OSX做不好的这些小UNIX事情。如果你管理好内存,Linux可以在fork之后做任何事情)
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");
}
system("/usr/sbin/taskpolicy -b /usr/bin/purge");