2009-09-16 10 views
7

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

यदि बाल आवेदन बहु-थ्रेडेड है, तो शायद यह ट्रैक करना संभव है कि कितने संसाधन प्रत्येक थ्रेड का उपभोग करते हैं? आवेदन किसी भी वितरण-मेमोरी थ्रेड्स तकनीक का उपयोग करके लिखा जा सकता है: जावा थ्रेड्स, बूस्ट थ्रेड, पॉज़िक्स थ्रेड्स, ओपनएमपी, कोई अन्य।

+1

क्या आपने प्रेरणा के लिए OProfile देखा है? http://oprofile.sourceforge.net –

+0

नहीं, यह मेरी मास्टर डिग्री का काम है। शायद मेरे व्याख्याता ने देखा :-) लेकिन OProfile दिलचस्प लग रहा है। धन्यवाद। – Pawka

उत्तर

5

आधुनिक लिनक्स सिस्टम (2.6) में, प्रत्येक थ्रेड में एक अलग पहचानकर्ता होता है जिसमें लगभग पिड के समान उपचार होता है। यह प्रक्रिया तालिका में दिखाया गया है (कम से कम, htop प्रोग्राम में) और इसकी अलग /proc प्रविष्टि भी है, यानी /proc/<tid>/stat

चेक man 5 proc और stat पर विशेष ध्यान दें, statm, status आदि आप जानकारी तुम वहाँ में रुचि रखते हैं खोजना चाहिए।

यह धागा पहचानकर्ता प्राप्त करने का एकमात्र बाधा है। यह प्रक्रिया आईडी के साथ अलग है! अर्थात। सभी धागे में getpid() कॉल समान मान लौटाते हैं। वास्तविक धागा पहचानकर्ता पाने के लिए आपको (एक सी कार्यक्रम के भीतर) का उपयोग करना चाहिए:

pid_t tid = syscall(SYS_gettid); 

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

4

स्मृति धागे को आवंटित नहीं किया जाता है, और अक्सर धागे में साझा किया जाता है। यह आम तौर पर असंभव बनाता है और धागे की स्मृति खपत के बारे में बात करने के लिए कम से कम अर्थहीन बनाता है।

एक उदाहरण 11 धागे के साथ एक कार्यक्रम हो सकता है; 1 वस्तुओं का उपयोग करके वस्तुओं और 10 बनाते हैं। अधिकांश काम उन 10 धागे पर किए जाते हैं, लेकिन ऑब्जेक्ट बनाने वाले एक थ्रेड पर सभी मेमोरी आवंटित की जाती थीं। अब इसके लिए एक खाता कैसे है?

+0

मैं यह नहीं कह सकता कि आप सही नहीं हैं।लेकिन हम मान सकते हैं कि सिंगल थ्रेड मेमोरी उपयोग स्मृति की मात्रा है जिसके साथ वर्तमान थ्रेड वर्तमान समय पर काम करता है। अधिकतर धागे डेटा के साथ काम करते समय सेमफोर्स या म्यूटेक्स के साथ मेमोरी लॉक करते हैं। – Pawka

+0

क्षमा करें, लेकिन यह अभी भी समझ में नहीं आता है। केवल पढ़ने के लिए स्मृति को कोई लॉक की आवश्यकता नहीं है। जब एक म्यूटेक्स का उपयोग किया जाता है, तो यह निर्धारित करने का कोई उचित तरीका नहीं है कि कोड पर जाने के बिना यह किस स्मृति की रक्षा करता है। – MSalters

+0

मैं केवल स्मृति पढ़ने के बारे में बात नहीं कर रहा हूं। हम अभी भी धागे की स्मृति खपत गिन सकते हैं। उदाहरण के लिए कुछ ग्राफ के साथ काम करना, कुछ गिनती आदि के लिए नोड्स बनाना आदि। प्रत्येक डेटा को एक थ्रेड द्वारा पहुंचा जा सकता है, जो स्वयं बनाया जाता है और काम पूरा होने के बाद साफ किया जाता है। – Pawka

1

आप पर्ल का उपयोग करने के लिए इस पर एक नज़र डालें तैयार हैं: Sys-Statistics-Linux

मैं इसे एक साथ इस्तेमाल किया जीडी रेखांकन संकुल से कुछ के साथ विभिन्न प्रक्रियाओं के लिए सिस्टम संसाधन उपयोग ग्राफ़ बनाने में।

एक चीज देखने के लिए - आपको वास्तव में/proc को समझने और समझने की आवश्यकता होगी - पिछली बार जब मैंने देखा कि उन्हें मैन पेजों में सही तरीके से दस्तावेज नहीं किया गया है, तो आपको शायद कर्नेल स्रोत को पढ़ने की आवश्यकता होगी :

http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h

ही, याद रखें लिनक्स में एक धागा है और इस प्रक्रिया के बीच फर्क सिर्फ इतना है धागे का हिस्सा है कि स्मृति है कि - यह है कि वे कैसे गिरी उन्हें लागू करता है में समान हैं के अलावा अन्य।

+0

एसआईएस-सांख्यिकी-लिनक्स लिंक टूटा हुआ है .. –

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