मुझे यूनिक्स (डेबियन, कर्नेल 2.6.32) में सर्वर प्रोग्रामिंग के बारे में एक बहुत ही विशिष्ट सवाल मिला। मेरा लक्ष्य यह सीखना है कि एक सर्वर कैसे लिखना है जो बड़ी मात्रा में ग्राहकों को संभाल सकता है। मेरा लक्ष्य 30 000 से अधिक समवर्ती ग्राहकों (यहां तक कि जब मेरा कॉलेज उल्लेख करता है कि 500 000 संभव है, जो कि QUIIITEEE एक बड़ी राशि :-) लगता है), लेकिन मुझे वास्तव में पता नहीं है (यहां तक कि क्या संभव है) और इसलिए मैं पूछता हूं यहाँ। तो मेरा पहला सवाल है। कितने एक साथ ग्राहक संभव हैं? ग्राहक जब चाहें कनेक्ट कर सकते हैं और अन्य ग्राहकों के संपर्क में आ सकते हैं और समूह बना सकते हैं (1 समूह में अधिकतम 12 क्लाइंट हैं)। वे एक दूसरे के साथ चैट कर सकते हैं, इसलिए टीसीपी/आईपी पैकेज आकार भेजे गए संदेश के आधार पर भिन्न होता है। ग्राहक भी सर्वर पर गणितीय सूत्र भेज सकते हैं। सर्वर उन्हें हल करेगा और जवाब को समूह में वापस प्रसारित करेगा। यह एक काफी भारी ऑपरेशन है।सी (phtreads, चयन या कांटा?) में लिनक्स सर्वर लिखने के लिए सबसे अच्छा तरीका
मेरा वर्तमान दृष्टिकोण सर्वर को शुरू करना है। एक डेमॉन प्रक्रिया बनाने के लिए कांटा का उपयोग करने से भी। डेमॉन प्रक्रिया सॉकेट fd_listen को बांधती है और सुनना शुरू कर देती है। यह थोड़ी देर (1) पाश है। मैं आने वाली कॉल प्राप्त करने के लिए स्वीकार() का उपयोग करता हूं।
क्लाइंट कनेक्ट होने के बाद मैं उस क्लाइंट के लिए एक पर्थ्रेड बनाता हूं जो संचार चलाएगा। ग्राहक समूह में जोड़े जाते हैं और कुछ मेमोरी एक साथ साझा करते हैं (समूह को चलाने के लिए आवश्यक) लेकिन फिर भी प्रत्येक क्लाइंट एक अलग थ्रेड पर चल रहा है। मेमोरी दाएं तक पहुंच प्राप्त करना काफी चमकदार था लेकिन अब ठीक काम करता है।
प्रोग्राम की शुरुआत में मैंने/proc/sys/कर्नेल/धागे-अधिकतम फ़ाइल को पढ़ा और इसके अनुसार मैं अपने धागे बना देता हूं। उस फ़ाइल के अनुसार संभावित धागे की मात्रा लगभग 5000 है। ग्राहकों की मात्रा से बहुत दूर मैं सेवा करने में सक्षम होना चाहता हूं। मुझे लगता है कि एक और दृष्टिकोण चुनने() और सेट बनाने के लिए है। लेकिन एक सेट के भीतर सॉकेट खोजने के लिए एक्सेस समय ओ (एन) है। यह काफी लंबा हो सकता है यदि मेरे पास कुछ हज़ार से अधिक ग्राहक जुड़े हुए हैं। अगर मैं गलत हूं कृपया मुझे सही।
ठीक है, मुझे लगता है मैं मार्कस कुछ सुझाव देखना चाहते :-)
Groetjes
पी.एस. लगता है मैं इसे सी ++ और सी के लिए टैग करता हूं क्योंकि यह दोनों भाषाओं पर लागू होता है।
मैं थ्रेड पूल के साथ जाऊंगा, इसलिए आपको प्रत्येक कनेक्शन के लिए एक नया धागा बनाने की आवश्यकता नहीं होगी। यह दोनों तेज़ है और अधिकतम 5000 कनेक्शन से बचाता है। –
मैं ग्राहकों को गतिविधि के लिए देखने के लिए एपोल का उपयोग करने का सुझाव देता हूं, और फिर शायद कार्यकर्ता धागे I/O करने के लिए और डेटा के साथ काम करने के लिए। आपको यह उपयोगी मिल सकता है: http://www.kegel.com/c10k.html –
हाँ मेरे पास एक थ्रेड पूल है। इसमें एक बूल is_used और pthread_t thread_id के साथ एक संरचना शामिल है। उस से मैं धागे लाता हूं। –