2013-05-06 5 views
28

मैं अपने लिनक्स कर्नेल के समय स्लाइस (या क्वांटम) के मूल्य की तलाश में हूं।लिनक्स शेड्यूलर टाइम स्लाइस कैसे जानें?

क्या /proc फ़ाइल है जो ऐसी जानकारी का पर्दाफाश करती है?

(या) क्या यह मेरे वितरण के लिनक्स हेडर में अच्छी तरह परिभाषित है?

(या) क्या लिनक्स एपीआई (शायद sysinfo) का एक सी फ़ंक्शन है जो इस मान का खुलासा करता है?

अग्रिम धन्यवाद।

उत्तर

25

रीयलटाइम प्रक्रियाओं के लिए डिफ़ॉल्ट लिनक्स टाइम्सलाइस लिनक्स कर्नेल में RR_TIMESLICEinclude/linux/sched/rt.h में परिभाषित किया गया है।

/* 
* default timeslice is 100 msecs (used only for SCHED_RR tasks). 
* Timeslices get refilled after they expire. 
*/ 
#define RR_TIMESLICE   (100 * HZ/1000) 

ध्यान दें कि वास्तविक मात्रा इस मान से एक विशेष प्रक्रिया may be different के लिए आवंटित:

आप धुन "टुकड़ा" sched_latency_ns और sched_min_granularity_ns का समायोजन करके, लेकिन ध्यान दें सकते हैं कि "टुकड़ा "एक निश्चित क्वांटम नहीं है। यह भी ध्यान रखें कि सीएफएस प्रीपेशन निर्णय तात्कालिक राज्य पर आधारित हैं। एक कार्य को एक पूर्ण (परिवर्तनीय) CPU समय के "टुकड़ा" प्राप्त हो सकता है, लेकिन प्रीम्प्शन केवल तभी ट्रिगर किया जाएगा जब योग्य कार्य उपलब्ध है, इसलिए "स्लाइस" "अधिकतम निर्बाध CPU समय" नहीं है यह उम्मीद कर सकता है .. लेकिन यह कुछ हद तक समान है।

हालांकि, आप किसी दिए गए रीयलटाइम प्रक्रिया के लिए SCHED_RR अंतराल प्राप्त करने के लिए sched_rr_get_interval() का उपयोग कर सकते हैं।

+0

हालांकि ऐसा लगता है कि 'rt.h' लिनक्स कर्नेल 3.9 के साथ दिखाई दिया। – backlash

+7

** लिनक्स कर्नेल v3.9 ** से पहले, 'RR_TIMESLICE' की परिभाषा [शामिल/linux/sched.h] में स्थित थी (http://lxr.free-electrons.com/source/include/linux/sched ज? v = 3.8 # L1227)। ** लिनक्स कर्नेल v3.4 ** से पहले, परिभाषा को 'DEF_TIMESLICE' नाम दिया गया था और [कर्नेल/शेड/शेडएचएच] में स्थित था (http://lxr.free-electrons.com/source/kernel/sched/ sched.h? v = 3.3 # L43)। –

+3

ध्यान दें कि यह उत्तर केवल वास्तविक समय प्राथमिकता आरआर –

20

सीएफएस (जो प्रक्रियाओं के लिए डिफ़ॉल्ट शेड्यूलर है) में कोई निश्चित टाइमलाइस नहीं है, इसकी गणना लक्षित विलंबता (sysctl_sched_latency) और चल रही प्रक्रियाओं के आधार पर रनटाइम पर की जाती है। टाइम्सलाइस न्यूनतम ग्रैन्युलरिटी से कम नहीं हो सकता (sysctl_sched_min_granularity)।

टाइम्सलाइस हमेशा sysctl_sched_min_granularity और sysctl_sched_latency के बीच होगा, जो क्रमश: 0.75 मीटर और 6 एमएस के लिए डिफ़ॉल्ट हैं और kernel/sched/fair.c में परिभाषित हैं।

लेकिन वास्तविक समय-समय उपयोगकर्ता-स्थान पर निर्यात नहीं किया जाता है।

+0

क्या यह बैच प्रक्रियाओं के लिए भी सच है? – user239558

+0

यह सीएफएस शेड्यूलर के तहत चलने वाली हर प्रक्रिया के लिए सच है (वास्तविक समय की प्रक्रिया नहीं) –

7

SCHED_OTHER प्रक्रियाओं (जैसे कि, (डिफ़ॉल्ट के तहत काम उन) गैर वास्तविक समय राउंड-रोबिन टाइमशेयरिंग नीति) और SCHED_RR प्रक्रियाओं के बीच स्वीकार किए जाते हैं जवाब में कुछ भ्रम की स्थिति नहीं है।

sched_latency_ns और sched_min_granularity_ns फ़ाइलें (जो डिबगिंग उद्देश्यों के लिए है, और दृश्य केवल तभी कर्नेल CONFIG_SCHED_DEBUG साथ कॉन्फ़िगर किया गया है) SCHED_OTHER प्रक्रियाओं का समय निर्धारण प्रभावित करते हैं। जैसा कि एलेक्सी श्माल्को के जवाब में उल्लेख किया गया है, सीएफएस के तहत समय टुकड़ा तय नहीं किया गया है (और उपयोगकर्ता स्थान पर निर्यात नहीं किया गया है), और कर्नेल पैरामीटर और प्रक्रियाओं के अच्छे मूल्य जैसे कारकों पर निर्भर करेगा।

sched_rr_get_interval() एक निश्चित मान देता है जो कि SCHED_RR प्रक्रिया को प्राप्त करने की गारंटी है, जब तक कि इसे पूर्ववत या अवरुद्ध न किया जाए। पारंपरिक लिनक्स पर, SCHED_RR क्वांटम 0.1 सेकंड है।लिनक्स 3.9 के बाद से, सीमा adjustable/proc/sys/kernel/sched_rr_timeslice_ms फ़ाइल के माध्यम से है, जहां क्वांटम को मिलीसेकंद मान के रूप में व्यक्त किया जाता है जिसका डिफ़ॉल्ट 100 है।

2

मैंने लिनक्स में SCHED_RR के समय टुकड़े के समान संदेह के बारे में इस टिकट को गुगल किया। लेकिन मुझे यहां से और कर्नेल स्रोत कोड दोनों से स्पष्ट उत्तर नहीं मिल सकता है। आगे की जांच के बाद, मुझे कुंजी बिंदु मिली है "RR_TIMESLICE" jiffies में डिफ़ॉल्ट समय स्लाइस है, मिलीसेकंड नहीं! इसलिए, SCHED_RR का डिफ़ॉल्ट समय टुकड़ा हमेशा 100ms होता है, भले ही आपने जो एचजेड कॉन्फ़िगर किया हो।

jiffies में "/ proc/sys/कर्नेल/sched_rr_timeslice_ms" का मूल्य है, जो मिलीसेकंड में इनपुट मूल्य, लेकिन यह स्टोर और आउटपुट के रूप में एक ही! इसलिए, जब आपका CONFIG_HZ = 100, आप पाएंगे कि:

# echo 100 > /proc/sys/kernel/sched_rr_timeslice_ms 
# cat /proc/sys/kernel/sched_rr_timeslice_ms 
10 

यह थोड़ा उलझन में है। उम्मीद है कि यह आपको समझने में मदद कर सकता है!

संबंधित मुद्दे