2013-07-03 1 views
6

Есть ли способ в основном вызвать system(), но с предопределенным значением симметрии (20) и низким приоритетом ввода-вывода от Objective-C?Как программно запускать команду с низким приоритетом ввода-вывода и высоким значением значимости в OS X

(установка низкого приоритета IO я говорю о является один launchd имеет)

Я пытаюсь запустить /usr/bin/purge из моей программы Objective-C.

Он также идеально подходит для одобрения метода для Mac App Store.

+0

Вообще, если вам нужно запустить демона, можно использовать [XPC] (http://developer.apple.com/library/mac/#documentation/ MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html) – CodaFi

+0

@CodaFi: я действительно хочу просто запустить '/ usr/bin/purge' с низким приоритетом, XPC по-прежнему правильная вещь для использования в этом случае? – houbysoft

ответ

4

Редактировать: Fork and 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 в поле зрения. Кроме того, не стесняйтесь заменить system на NSTask, если вы хотите остановиться в ObjCish.


Как насчет хороший старый fork п 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: Это место, где мы устанавливаем приоритет ввода-вывода (например, запуск). Вот аргументы:

    • IOPOL_TYPE_DISK: Мы хотим ограничить дисковый ввод-вывод. В любом случае нет другой возможности.
    • IOPOL_SCOPE_PROCESS: Влияет на весь этот процесс
    • IOPOL_THROTTLE: Это сама политика. Accouring к Apple documentation, это указывает на это:

    I/O с дросселем политикой называются ДРОССЕЛЯ ввода/вывода. Если запрос запроса THROTTLE I/O происходит в течение небольшого временного окна (обычно доли секунды) другого запроса NORMAL I/O , поток, который выдает адрес ввода/вывода THROTTLE, вынужден спать для определенного интервала , Это замедляет поток, который выдает THROTTLE I/O, так что NORMAL I/O может использовать большую часть пропускной способности ввода-вывода. Кроме того, запрос NORMAL I/O может обходить ранее выпущенный запрос ввода/вывода THROTTLE в ядре или очереди драйверов и сначала отправляться на устройство. В некоторых случаях очень большие запросы ввода/вывода THROTTLE будут , разбитые на более мелкие запросы, которые затем выдаются серийно.

I/O приоритет наследуется, а nice части команды устанавливает хорошее значение.

+0

Звуки хорошо, но знаете ли вы, разрешено ли это в магазине Mac App Store? – houbysoft

+0

@houbysoft: Позвольте мне сделать некоторую проверку. – Linuxios

+0

@houbysoft: Это должно быть. Приложение Sandbox позволяет доступ только для чтения к '/ usr/bin' (и все другие командные каталоги), и я не могу найти ничего, чтобы указать, что он ограничивает любые системные вызовы за пределами тех, которые доступ к файловой системе. Теперь, может ли «чистка» работать в песочнице, это другая проблема, но это не вопрос. – Linuxios

0

Простой способ для достижения этой цели будет использовать инструмент taskpolicy(8) с -b варианта:

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

С опцией taskpolicy -b использует setpriority(2) установить фоновый приоритет (PRIO_DARWIN_BG)

Установка процесса в PRIO_DARWIN_BG имеет этот эффект на себе и все его дети:

«Когда поток или процесс в фоновом состоянии приоритет планирования устанавливается равным минимальному значению, диск ввода-вывода дросселирование (с поведением, аналогичным использованием setiopolicy_np (3), чтобы установить throttleable политику), а также сети IO дросселируется для любых сокетов, открытых после перехода в фоновое состояние. Все ранее открытые розетки етсь не затрагиваются.»

Смежные вопросы