2013-07-03 13 views
6

C'è un modo per chiamare fondamentalmente system(), ma con un valore di gradazione predefinito (20) e priorità IO bassa da Objective-C?Come eseguire a livello di programmazione un comando con priorità bassa priorità IO e alto valore di gradevolezza su OS X

(L'impostazione di bassa priorità IO sto parlando è quella launchd ha)

sto cercando di lanciare /usr/bin/purge da dentro il mio programma di Objective-C.

Sarebbe anche ideale per l'approvazione del metodo per il Mac App Store.

+0

In generale, se avete bisogno di lanciare un demone, si utilizza [XPC] (http://developer.apple.com/library/mac/#documentation/ MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html) – CodaFi

+0

@CodaFi: quello che voglio veramente è solo eseguire '/ usr/bin/purge' con priorità bassa, XPC è ancora la cosa giusta da usare in quel caso? – houbysoft

risposta

4

Modifica: fork e exec non più, dal momento che OSX non può davvero fork a destra. magia filo singolo:

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); 

Questo può andare da nessuna parte, in un blocco di spedizione, se si desidera, o dovunque nella vostra applicazione. No fork in vista. Inoltre, sentiti libero di sostituire system con NSTask se vuoi rimanere ObjCish.


ne dite di un buon vecchio fork n exec:

#include <unistd.h> 
#include <sys/resource.h> 

E:

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"); 
} 

Vediamo in questo:

  • fork: niente da vedere qui
  • setiopolicy_np: questo è il punto in cui impostiamo la priorità IO (come launchd). Ecco gli argomenti:

    • IOPOL_TYPE_DISK: Vogliamo limitare l'I/O del disco. Non c'è altra opzione disponibile comunque.
    • IOPOL_SCOPE_PROCESS: interessa l'intero processo
    • IOPOL_THROTTLE: questa è la politica stessa. Accouring al Apple documentation, specifica questo:

    I/O con la politica GAS sono chiamati ACCELERATORE I/O. Se una richiesta di Throptle I/O si verifica entro una piccola finestra temporale (di solito una frazione di secondo) di un'altra richiesta NORMAL I/O , il thread che emette l'I/O THROTTLE viene forzato a dormire per un determinato intervallo . Ciò rallenta il thread che emette l'I/O THROTTLE in modo che gli I/O NORMAL possano utilizzare la maggior parte della larghezza di banda I/O del disco. Inoltre, una richiesta di I/O NORMAL può ignorare una richiesta I/O THROTTLE precedentemente emessa nelle code del kernel o dei driver e inviare prima il dispositivo al dispositivo. In alcune circostanze, le richieste di I/O THROTTLE molto grandi saranno suddivise in richieste più piccole che vengono quindi emesse in serie.

I/O priorità è ereditata, e la parte nice del comando imposta il valore di nice.

+0

Suoni bene, ma sai se questo è permesso sul Mac App Store? – houbysoft

+0

@houbysoft: fammi fare un controllo – Linuxios

+0

@houbysoft: Dovrebbe. App Sandbox permette l'accesso in sola lettura a/usr/bin (e tutto altre directory di comando), e non riesco a trovare nulla per indicare che limita le chiamate di sistema oltre a quelle accedere al file system. Ora, se 'purge' può essere eseguito nella sandbox è un problema diverso, ma non è questa la domanda. – Linuxios

0

Un modo semplice per ottenere questo risultato sarebbe utilizzando lo strumento taskpolicy(8) con l'-b opzione:

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

Con l'opzione -b taskpolicy utilizza setpriority(2) per impostare la priorità di fondo (PRIO_DARWIN_BG)

impostazione di un processo per PRIO_DARWIN_BG ha questo effetto su se stessa e tutti i suoi figli:

"Quando un thread o processo è in uno stato di bassa priorità programmazione viene impostata al valore più basso, IO disco è strozzata (con un comportamento simile ad usare setiopolicy_np (3) per impostare una politica throttleable), e la rete IO viene limitato per tutti gli zoccoli aperti dopo essere passati allo stato di background. Eventuali prese precedentemente aperti ETS non sono interessati."

Problemi correlati