6

基本的に を呼び出す方法はありますsystem()が、事前定義されたナイスネス値 (20) と Objective-C からの低い IO 優先度がありますか?

(私が話している低いIO優先度の設定は、launchd持っているものです)

/usr/bin/purgeObjective-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: これはポリシーそのものです。Apple のドキュメントによると、次のように指定されています。

    THROTTLE ポリシーを持つ I/O は、THROTTLE I/O と呼ばれます。THROTTLE I/O 要求が別の NORMAL I/O 要求の短い時間枠 (通常は数分の 1 秒) 内に発生した場合、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 に答える