प्रति प्रक्रिया 10,000 सूत्र को संभालने के लिए मेरे लिनक्स सर्वर का अनुकूलन करें
जैसा कि दूसरों ने समझाया, यह आमतौर पर गलत है। एक धागा एक महंगा संसाधन है , विशेष रूप से क्योंकि इसकी अपनी कॉल स्टैक (आमतौर पर, मेगाबाइट) है और क्योंकि यह कर्नेल द्वारा शेड्यूल किया गया कार्य है। खोले गए फ़ाइल डिस्क्रिप्टर की तुलना में थ्रेड्स अधिक महंगे हैं ।
ऑपरेटिंग सिस्टम पढ़ें : तीन आसान टुकड़े (स्वतंत्र रूप से डाउनलोड करने योग्य पाठ्यपुस्तक)।
अंगूठे के एक नियम के रूप में, आप कई धागे नहीं रखना चाहते हैं, और निश्चित रूप से बहुत सारे चलने योग्य धागे नहीं हैं। चल धागे की संख्या आमतौर पर कोर (या उस के एक छोटे से कई) की अधिकतम संख्या में होनी चाहिए , इसलिए लगभग एक दर्जन से अधिक। एक प्रक्रिया में थ्रेड्स की संख्या थोड़ी बड़ी हो सकती है। इसलिए जब तक आपके पास बहुत विस्तारक सर्वर (कई प्रोसेसर सॉकेट और कोर के साथ) नहीं है, आप अपनी प्रक्रिया में एक दर्जन से अधिक रन करने योग्य धागे और एक सौ धागे (उनमें से अधिकांश बेकार हो रहे हैं) को अपने डेस्कटॉप पर नहीं चाहते हैं ।
लिनक्स पर, थ्रेड और प्रक्रियाएं बहुत समान हैं (क्योंकि दोनों को क्लोन (2) द्वारा बनाया जा सकता है ) और दोनों कर्नेल द्वारा निर्धारित कार्य हैं। वास्तव में कर्नेल शेड्यूलर शेड्यूलिंग कार्य है जो कुछ बहु-थ्रेडेड प्रक्रिया के अंदर थ्रेड हो सकते हैं, या सिंगल-थ्रेडेड प्रक्रिया का एक ही मुख्य थ्रेड (उस स्थिति में, आप "प्रोसेस" उस सिंगल थ्रेड को नाम देंगे) या कर्नेल थ्रेड्स। आप शायद अपने डेस्कटॉप सिस्टम पर कुल एक हजार से अधिक शेड्यूल किए गए कार्य नहीं करना चाहते हैं।
लिनक्स पर, एक प्रक्रिया बस एक ही वर्चुअल एड्रेस स्पेस साझा करने वाले थ्रेड्स का एक समूह है (और कुछ अन्य चीजों को साझा करना, जैसे कि फाइल डिस्क्रिप्टर टेबल, आदि ...)। कुछ प्रक्रियाओं में केवल एक धागा होता है।
एक वर्चुअल ऐड्रेस स्पेस है परिभाषित के रूप में विकिपीडिया से
"वर्चुअल पतों की श्रेणियों का समूह जो एक ऑपरेटिंग सिस्टम एक प्रक्रिया को उपलब्ध कराता है"
(लेकिन इस उत्तर को यह समझाते हुए भी देखें कि शब्दावली सार्वभौमिक नहीं है, और कुछ Microsoft प्रलेखन एक अलग और असंगत परिभाषा का उपयोग करते हैं )।
लिनक्स पर, कुछ प्रक्रियाओं के वर्चुअल एड्रेस स्पेस को समझने के लिए proc (5) उपयोगी है। दोनों की कोशिश करो
cat /proc/self/maps
और cat /proc/$$/maps
एक टर्मिनल में। यह भी देखें इस , और pmap (1) और ps (1) और शीर्ष (1) ।
सभी उपयोगकर्ता-अंतरिक्ष कार्यक्रम किसी न किसी प्रक्रिया में चल रहे हैं और आभासी मेमोरी का उपयोग कर रहे हैं, इसलिए प्रत्येक प्रक्रिया का अपना वर्चुअल पता स्थान है। शारीरिक रैम एक संसाधन लिनक्स कर्नेल द्वारा प्रबंधित है, और अनुप्रयोगों रैम के लिए सीधी पहुँच नहीं है (के अलावा mmap (2) आईएनजी /dev/mem
, देख मेम (4) )।
तो एक प्रक्रिया सीधे रैम का उपयोग नहीं करती है। यह वर्चुअल मेमोरी का उपयोग करता है और इसका अपना वर्चुअल एड्रेस स्पेस होता है। कर्नेल का उपयोग करता है पेजिंग शारीरिक रैम प्रबंधन करने के लिए पृष्ठों और वर्चुअल ऐड्रेस स्पेस और प्रक्रिया प्रदान कपोल-कल्पना । किसी भी समय (यहां तक कि जब आपकी प्रक्रिया बेकार है, या जब यह चल रहा है) कर्नेल कुछ पृष्ठों को बाहर कर सकता है (जैसे डिस्क पर उन्हें स्वैप करें)। कर्नेल MMU को कॉन्फ़िगर कर रहा है (और कुछ मिस हैंडलर में पेज मिस हार्डवेयर अपवादों को हैंडल कर रहा है , या तो डिस्क से पेज को लाकर या प्रक्रिया में एक विभाजन दोष का प्रचार करके , संकेत (7) देखें )
आपके पास सिस्टम थ्रेड्स के ऊपर हरे रंग के धागे हो सकते हैं (लेकिन हरे रंग की थ्रेड लाइब्रेरी को लागू करना और डीबग करना मुश्किल है)। में देखो goroutines में इस्तेमाल जाओ एक फैंसी उदाहरण के लिए। Setcontext (3) भी देखें ।
कभी-कभी, आपका सिस्टम थ्रेशिंग का प्रयोग कर सकता है । यह तब होता है जब कुल वर्चुअल मेमोरी (सभी प्रक्रियाओं द्वारा आवश्यक) एक बड़े कारक-उपलब्ध भौतिक रैम से अधिक हो जाती है। तब आपका कंप्यूटर अनुत्तरदायी हो जाता है। रेजिडेंट सेट साइज़ , डिमांड पेजिंग , वर्किंग सेट , मेमोरी ओवरकमिटमेंट , एएसएलआर के बारे में पढ़ें ।
Linux- -किसी भी देखें कांटा (2) , क्लोन (2) , mmap (2) , madvise (2) , posix_fadvise (2) , mlock (2) , execve (2) , साख (7) , pthreads (7) , futex (7) , क्षमताएं (7) ।