2012-05-16 15 views
9

में सक्रिय उपयोगकर्ताओं की संख्या की गणना कैसे करें हम कर्नेल संस्करण 2.4-20 का उपयोग कर रहे हैं और हमें कर्नेल मोड में सक्रिय उपयोगकर्ताओं की संख्या गिनने की आवश्यकता है। उद्देश्य शेड्यूलर को बदलना है, इसलिए हम शेड्यूल में हैं, शेड्यूल() फ़ंक्शन को संशोधित करना।कर्नेल

हम क्या करते हैं उपयोगकर्ताओं को list_for_each मैक्रो में गिनना है।

list_for_each(tmp, &runqueue_head) { 
    p = list_entry(tmp, struct task_struct, run_list); 
    if (can_schedule(p, this_cpu)) { 
     if (unique(p->uid)) add_new_user(p->uid); 
     int weight = goodness(p, this_cpu, prev->active_mm); 
     if (weight > c) 
      c = weight, next = p; 
    } 
} 

जो मूल रूप से एक सूची में अद्वितीय उपयोगकर्ताओं को जोड़ रहा है। हालांकि, हमें यादृच्छिक परिणाम मिलते हैं। क्या इस समस्या को हल करने का कोई ठोस तरीका है?

धन्यवाद।

+4

'यादृच्छिक परिणाम' से आपका क्या मतलब है? – ArjunShankar

+0

सबसे पहले हमने उपयोगकर्ताओं को भलाई() फ़ंक्शन में गिना, वहां हमारे पास बिल्कुल मनमानी संख्याएं थीं (भले ही हमारे पास 4 उपयोगकर्ता एक ही समय में चल रहे थे, हम परिणामस्वरूप 1 उपयोगकर्ता प्राप्त कर सकते थे)। शेड्यूल() में, हमारे पास लगातार मूल्य होते हैं लेकिन हमें यकीन नहीं है, क्योंकि शेड्यूल() अक्सर चल रहा है, हमें नमूने लेने की आवश्यकता है (एक बार 5000 मोड़ में)। मुझे लगता है कि कर्नेल में कोई फ़ील्ड नहीं है जिसमें वर्तमान सक्रिय उपयोगकर्ता हैं? यदि नहीं है, तो उन्हें गिनने का सबसे अच्छा तरीका क्या है? आपके प्रतिक्रिया के लिए धन्येवाद। –

+0

स्पष्टीकरण के लिए धन्यवाद। मुझे इसका जवाब नहीं पता। मेरा इरादा यह इंगित करना था कि सवाल पूरी तरह स्पष्ट नहीं था। मैं इस सवाल में इसे संपादित करने का सुझाव दूंगा। सौभाग्य! – ArjunShankar

उत्तर

1

आप उपयोगकर्ताओं को for_each_task मैक्रो के अंदर गिनने का प्रयास करना चाह सकते हैं। इसका परिणाम उन उपयोगकर्ताओं को गिनने में होता है जिनके पास एक कार्य है जो I/O या किसी अन्य कारण के कारण अवरुद्ध है। इससे बेहतर परिणाम मिलना चाहिए क्योंकि आप रन कतार का उपयोग करते हुए इंटरैक्टिव प्रक्रियाओं को चलाने वाले उपयोगकर्ताओं की गणना करने में सक्षम होने की गारंटी नहीं दे सकते हैं।

+0

जो समझ में आता है। लेकिन हमने उपयोगकर्ताओं को पहले भलाई समारोह में गिना, यह यादृच्छिक परिणामों का कारण हो सकता है। हालांकि मेरे पास इसके लिए कोई स्पष्टीकरण नहीं है। किसी कारण से, शेड्यूल फ़ंक्शन में for_each_task काम करता है। धन्यवाद! –

0

क्या यह काम करेगा? कौन | अजीब '{प्रिंट $ 1}' | sort -ud

+0

फिर आप गिनती ले सकते हैं। – Keshi

+0

मैं कर्नेल में हूं, मैं सिस्टम कॉल और टर्मिनल प्रोग्राम का उपयोग नहीं कर सकता। –