द्वारा प्रत्येक प्रक्रिया को एक विशिष्ट कोर पर पिन किया गया है, अब मैं लिनक्स के शेड्यूलर के बारे में पढ़ रहा हूं। सीपीयू कोर एफ़िनिटी के संबंध में, मैं निम्नलिखित जानना चाहता हूं:शेड्यूलर (लिनक्स)
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
नामक एक सदस्य है। लेकिन यह एफ़िनिटी सेट करने के लिए एक मुखौटा है, कोर आईडी नहीं। मैं उस कोर को पहचानने वाला डेटा पुनर्प्राप्त करना चाहता हूं जिस पर निर्दिष्ट प्रक्रिया चल रही है।
धन्यवाद,
अपने जवाब के लिए धन्यवाद। लेकिन यह वही है जो मैं चाहता हूं। मैं सोच रहा था कि मेरा विवरण भ्रामक है ... सबसे पहले, मैं 'sched_setaffinity' सिस्टम कॉल (sched_set_affinity लेकिन sched_setaffinity नहीं) का उपयोग नहीं करता क्योंकि मैं उपयोगकर्ता स्थान में कोई एप्लिकेशन नहीं चलाता। – akry
सबसे दूसरा, 'cpus_allowed' (cpu_allowed नहीं) फ़ील्ड सीपीयू कोर की पहचान करने के लिए पर्याप्त जानकारी नहीं है जिस पर प्रक्रिया चल रही है। cpus_allowed डिफ़ॉल्ट रूप से 1 के रूप में सेट किया गया है ताकि प्रक्रिया सभी उपलब्ध कोरों को स्थानांतरित करने की संभावना हो। यदि कोई क्षेत्र/विधि उस स्थान को बताती है जहां प्रक्रिया चल रही है, तो मैं यही जानना चाहता हूं। – akry
वैसे भी, मेरे प्रश्न का उत्तर देने के लिए धन्यवाद। – akry