2013-07-03 8 views
6

पर कम आईओ प्राथमिकता और उच्च निपुणता मान के साथ प्रोग्रामेटिक रूप से कमांड चलाने के लिए कैसे करें मूल रूप से system() पर कॉल करने का कोई तरीका है, लेकिन एक पूर्वनिर्धारित विशिष्टता मान (20) और उद्देश्य-सी से कम आईओ प्राथमिकता के साथ?ओएस एक्स

मैं अपने ऑब्जेक्टिव-सी कार्यक्रम के भीतर से /usr/bin/purge शुरू करने की कोशिश कर रहा हूँ (कम आईओ प्राथमिकता सेटिंग के बारे में मैं बात कर रहा हूँ एक launchd है)।

यह मैक ऐप स्टोर के लिए अनुमोदित होने के तरीके के लिए भी आदर्श होगा।

+0

आम तौर पर, यदि आप एक डेमॉन शुरू करने की जरूरत है, आप का उपयोग [XPC] (http://developer.apple.com/library/mac/#documentation/ मैकोज़क्स/संकल्पनात्मक/बीपीएस सिस्टम स्टार्टअप/अध्याय/CreatingXPCServices.html) – CodaFi

+0

@ कोडाफ़ी: जो मैं वास्तव में चाहता हूं वह कम प्राथमिकता के साथ '/ usr/bin/purge' को चलाने के लिए है, XPC अभी भी उस मामले में उपयोग करने के लिए सही बात है? – houbysoft

उत्तर

4

संपादित करें: फोर्क और निष्पादन नहीं, क्योंकि ओएसएक्स वास्तव में 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 रहना चाहते हैं तो systemNSTask के साथ प्रतिस्थापित करने के लिए स्वतंत्र महसूस करें।


कैसे के बारे में एक अच्छा वर्ष 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: यह वह स्थान है जहां हमने आईओ प्राथमिकता (लॉन्च की तरह) सेट की है। यहां तर्क हैं:

    • IOPOL_TYPE_DISK: हम डिस्क I/O को सीमित करना चाहते हैं। वैसे भी कोई अन्य विकल्प उपलब्ध नहीं है।
    • IOPOL_SCOPE_PROCESS: इस पूरे प्रक्रिया को प्रभावित करता है
    • IOPOL_THROTTLE: यह नीति ही है। Apple documentation को Accouring, यह इस निर्दिष्ट करता है:

    मैं/गला घोंटना नीति के साथ ओएस कहा जाता है गला घोंटना मैं/ओएस। यदि एक थ्रॉटल I/O अनुरोध किसी अन्य सामान्य I/O अनुरोध के एक छोटी समय विंडो (आमतौर पर एक सेकेंड का एक अंश) के भीतर होता है, तो थ्रॉटल I/O को इंगित करने वाले थ्रेड को एक निश्चित अंतराल के लिए सोने के लिए मजबूर होना पड़ता है । यह थ्रेड को धीमा कर देता है जो थ्रॉटल I/O को इंगित करता है ताकि नॉर्मल I/Os अधिकांश डिस्क I/O बैंडविड्थ का उपयोग कर सके। इसके अलावा, एक सामान्य I/O अनुरोध कर्नेल या ड्राइवर कतार में पहले जारी किए गए थ्रॉटल I/O अनुरोध को बाईपास कर सकता है और पहले डिवाइस पर भेजा जा सकता है। कुछ परिस्थितियों में, बहुत बड़े थ्रॉटल I/O अनुरोध छोटे अनुरोधों में विभाजित किए जाएंगे जिन्हें बाद में क्रमशः जारी किया जाता है।

आई/ओ प्राथमिकता विरासत में मिला है, और आदेश के nice हिस्सा अच्छा मूल्य तय करता है।

+0

ध्वनि अच्छा है, लेकिन क्या आपको पता है कि मैक ऐप स्टोर पर इसकी अनुमति है या नहीं? – houbysoft

+0

@houbysoft: मुझे कुछ जांच करने दो। – Linuxios

+0

@houbysoft: यह चाहिए। ऐप सैंडबॉक्स केवल पढ़ने के लिए '/ usr/bin' (और सभी को अनुमति देता है) अन्य कमांड निर्देशिका), और मुझे यह इंगित करने के लिए कुछ भी नहीं मिला है कि यह किसी भी सिस्टम कॉल को उनसे परे सीमित करता है फ़ाइल सिस्टम का उपयोग करें। अब, क्या 'purge' sandbox में चलाया जा सकता है एक अलग मुद्दा है, लेकिन यह सवाल नहीं है। – Linuxios

0

इस बी विकल्प के साथ taskpolicy(8) उपकरण का उपयोग किया जाएगा पूरा करने के लिए एक आसान तरीका:

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

बी विकल्प taskpolicy साथ setpriority(2) का उपयोग करता है पृष्ठभूमि प्राथमिकता (PRIO_DARWIN_BG) स्थापित करने के लिए

:

PRIO_DARWIN_BG के लिए एक प्रक्रिया की स्थापना पर ही इस आशय और उसके सभी बच्चे हैं

"जब एक धागा या प्रक्रिया एक पृष्ठभूमि स्थिति में है शेड्यूलिंग प्राथमिकता न्यूनतम मान पर सेट है, डिस्क आईओ से रोक दिए, और नेटवर्क ((3) एक throttleable नीति सेट करने के लिए setiopolicy_np उपयोग करने के समान व्यवहार के साथ) है आईओ पृष्ठभूमि पृष्ठभूमि में जाने के बाद खोले गए किसी भी सॉकेट के लिए थ्रॉटल किया गया है। किसी भी पहले खोली सॉकेट ETS प्रभावित कर रहे हैं नहीं है। "