2012-02-09 36 views
13

द्वारा प्रत्येक प्रक्रिया को एक विशिष्ट कोर पर पिन किया गया है, अब मैं लिनक्स के शेड्यूलर के बारे में पढ़ रहा हूं। सीपीयू कोर एफ़िनिटी के संबंध में, मैं निम्नलिखित जानना चाहता हूं:शेड्यूलर (लिनक्स)

1) प्रत्येक प्रक्रिया (थ्रेड) को कोर पर पिन किया जाता है?

एक प्रक्रिया को निष्पादित करने वाले मूल संबंध को बदलने के लिए एक सिस्टम कॉल sched_setaffinity है। लेकिन आंतरिक रूप से, जब कोई प्रक्रिया (या धागा) उत्पन्न होता है, तो डिफ़ॉल्ट लिनक्स शेड्यूलर प्रक्रिया (थ्रेड) को किसी विशिष्ट कोर पर कैसे निर्दिष्ट करता है? मैंने sched_setaffinity सिस्टम कॉल को एक कोर से दूसरे में स्थानांतरित करने के बारे में जानकारी डंप करने के लिए संशोधित किया।

printk(KERN_INFO "%d %d %ld %lu %s\n", current->pid, current->tgid, 
             current->state, current->cpus_allowed, 
             current->comm); 

ऐसा लगता है कि /var/log/messages में उपर्युक्त जानकारी का कोई डंप नहीं है। तो डिफ़ॉल्ट शेड्यूलर प्रत्येक प्रक्रिया को एक अलग तरीके से पिन करता है, लेकिन मैं यह नहीं समझ सकता कि कैसे।

2) क्या पीआईडी ​​या अन्य जानकारी द्वारा कोर आईडी प्राप्त करना संभव है?

यही वह है जिसे मैं लिनक्स कर्नेल के अंदर लागू करना चाहता हूं। task_struct में, cpus_allowed नामक एक सदस्य है। लेकिन यह एफ़िनिटी सेट करने के लिए एक मुखौटा है, कोर आईडी नहीं। मैं उस कोर को पहचानने वाला डेटा पुनर्प्राप्त करना चाहता हूं जिस पर निर्दिष्ट प्रक्रिया चल रही है।

धन्यवाद,

उत्तर

0

सीपीयू कोर आत्मीयता ओएस विशिष्ट है। ओएस जानता है कि यह कैसे करें, आपको नहीं करना है। यदि आप निर्दिष्ट करते हैं कि कौन सा कोर चलाना है, तो आप सभी प्रकार के मुद्दों में भाग सकते हैं, जिनमें से कुछ वास्तव में प्रक्रिया को धीमा कर सकते हैं।

लिनक्स कर्नेल में, प्रक्रिया task_struct से जुड़े डेटा संरचना में cpu_allowed बिटमैस्क फ़ील्ड शामिल है। इसमें मशीन में प्रत्येक एन प्रोसेसर के लिए एन बिट्स एक है। चार भौतिक कोर वाली मशीन में चार बिट होंगे। यदि वे सीपीयू कोर हाइपरथ्रेड-सक्षम थे तो उनके पास आठ-बिट बिटमैस्क होगा। यदि किसी दिए गए प्रक्रिया के लिए दिया गया बिट सेट किया गया है, तो वह प्रक्रिया संबंधित कोर पर चल सकती है। इसलिए, यदि किसी भी कोर पर किसी प्रक्रिया को चलाने की अनुमति है और आवश्यकतानुसार प्रोसेसर में माइग्रेट करने की अनुमति है, तो बिटकमास्क पूरी तरह से 1s होगा। यह वास्तव में, लिनक्स के तहत प्रक्रियाओं के लिए डिफ़ॉल्ट स्थिति है। उदाहरण के लिए,

PID 2441: PRIO 0, POLICY N: SCHED_NORMAL, NICE 0, AFFINITY 0x3 

प्रक्रिया 2441 0x3 का एक सीपीयू आत्मीयता, यह Core0 और Core1 में इस्तेमाल किया जा सकता है जिसका मतलब है कि है।

एप्लिकेशन बिटमैस्क को बदलकर कर्नेल API sched_set_affinity() का उपयोग करके एफ़िनिटी निर्दिष्ट/सेट भी कर सकते हैं।

+0

अपने जवाब के लिए धन्यवाद। लेकिन यह वही है जो मैं चाहता हूं। मैं सोच रहा था कि मेरा विवरण भ्रामक है ... सबसे पहले, मैं 'sched_setaffinity' सिस्टम कॉल (sched_set_affinity लेकिन sched_setaffinity नहीं) का उपयोग नहीं करता क्योंकि मैं उपयोगकर्ता स्थान में कोई एप्लिकेशन नहीं चलाता। – akry

+0

सबसे दूसरा, 'cpus_allowed' (cpu_allowed नहीं) फ़ील्ड सीपीयू कोर की पहचान करने के लिए पर्याप्त जानकारी नहीं है जिस पर प्रक्रिया चल रही है। cpus_allowed डिफ़ॉल्ट रूप से 1 के रूप में सेट किया गया है ताकि प्रक्रिया सभी उपलब्ध कोरों को स्थानांतरित करने की संभावना हो। यदि कोई क्षेत्र/विधि उस स्थान को बताती है जहां प्रक्रिया चल रही है, तो मैं यही जानना चाहता हूं। – akry

+0

वैसे भी, मेरे प्रश्न का उत्तर देने के लिए धन्यवाद। – akry

4

प्रत्येक सीपीयू का अपना रनक्यू है, AFAIK हम एक प्रक्रिया के वर्तमान सीपीयू को देख सकते हैं कि यह किस रनक्यू से संबंधित है। task_struct *p को देखते हुए, हम struct rq = task_rq(p) द्वारा अपना रनक्यू प्राप्त कर सकते हैं, और स्ट्रक्चर आरक्यू का नाम cpu है, मुझे लगता है कि यह जवाब होना चाहिए।

मैंने अभ्यास में यह कोशिश नहीं की है, बस कुछ कोड ऑनलाइन पढ़ें, और मुझे पूरा यकीन नहीं है कि यह काम करेगा या नहीं। इच्छा है कि यह आपकी मदद कर सके।

+0

आपके उत्तर के लिए धन्यवाद। इस विधि को आजमाने के बाद मैं आपको बता दूंगा। – akry

+1

ध्यान दें कि यह दुर्लभ है - कार्य को आपके नीचे एक रनक्यू से दूसरे स्थानांतरित किया जा सकता है। – caf

2

/proc/pid/stat में फ़ील्ड 39 प्रक्रिया के वर्तमान कोर/सीपीयू को बताता है।

उदा .:

#cat /proc/6128/stat 
6128 (perl) S 3390 6128 3390 34821 6128 4202496 2317 268 0 0 1621 59 0 0 16 0 1 0 6860821 10387456 1946 18446744073709551615 1 1 0 0 0 0 0 128 0 18446744073709551615 0 0 17 8 0 0 0 

प्रक्रिया 6128 कोर 8 पर चल रहा है।

2

आप सीपीयू आईडी, जिस पर एक धागा अपनी task_struct का उपयोग करके चल रहा है या कर सकते हैं:

#include <linux/sched.h> 

task_struct *p; 
int cpu_id = task_cpu(p); 
संबंधित मुद्दे