基本的に を呼び出す方法はありますsystem()
が、事前定義されたナイスネス値 (20) と Objective-C からの低い IO 優先度がありますか?
(私が話している低いIO優先度の設定は、launchd
持っているものです)
/usr/bin/purge
Objective-C プログラム内から起動しようとしています。
また、この方法が Mac App Store で承認されることも理想的です。
基本的に を呼び出す方法はありますsystem()
が、事前定義されたナイスネス値 (20) と Objective-C からの低い IO 優先度がありますか?
(私が話している低いIO優先度の設定は、launchd
持っているものです)
/usr/bin/purge
Objective-C プログラム内から起動しようとしています。
また、この方法が Mac App Store で承認されることも理想的です。
編集: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 値が設定されます。