2010-04-28 15 views
10

क्या एक सर्वर अनिवार्य रूप से एक पृष्ठभूमि प्रक्रिया है जो एक बंदरगाह पर एक अनंत लूप सुन रहा है?क्या एक सर्वर एक अनंत प्रक्रिया है जो पृष्ठभूमि प्रक्रिया के रूप में चल रहा है?

while(1){ 
    command = read(127.0.0.1:xxxx); 
    if(command){ 
     execute(command); 
    } 
} 

जब मैं सर्वर का कहना है, मैं स्पष्ट रूप से एक भौतिक सर्वर (कंप्यूटर) की बात नहीं कर रहा हूँ: उदाहरण के लिए। मैं एक MySQL सर्वर, या अपाचे, आदि

पूर्ण प्रकटीकरण की चर्चा करते हुए हूँ - मैं किसी भी स्रोत कोड के माध्यम से प्रहार करने के लिए समय नहीं पड़ा है। वास्तविक कोड उदाहरण बहुत अच्छा होगा!

+1

दूर नहीं वह सच fromt है ..लेकिन पढ़ना आम तौर पर सिस्टम को एक अवरुद्ध पढ़ा जाता है, जो केवल लौटने पर कुछ देता है। कोई डेटा प्राप्त नहीं हुआ == कोई निष्पादन नहीं। – eaanon01

+0

@ eaanon01 - अगर (कमांड) मूल रूप से "डेटा प्राप्त होने पर" कहने का मेरा तरीका है। – Tony

+1

.. क्यों टैग सी? –

उत्तर

6

कि कम या ज्यादा क्या सर्वर सॉफ्टवेयर आमतौर करता है।

आमतौर पर यह अधिक जटिल हो जाता है क्योंकि अनंत लूप "केवल" कनेक्शन स्वीकार करता है और प्रत्येक कनेक्शन अक्सर कई "कमांड" (या जिसे वे प्रयुक्त प्रोटोकॉल में बुलाए जाते हैं) को संभाल सकते हैं, लेकिन बुनियादी विचार मोटे तौर पर यह है। forking, थ्रेडिंग और एक थ्रेडेड (गैर अवरुद्ध) -

+0

क्या आप मूल रूप से कह रहे हैं कि मेरा छद्म कोड + थ्रेडिंग काफी सही है? – Tony

+0

@ टोनी: हाँ। बेशक छद्म कोड का तात्पर्य है कि अभी भी सही होने के लिए कई विवरण हैं, लेकिन यह विचार है। –

+0

काफी नहीं है। क्या रहता है _how_। –

2

बोलने के मामले में, हाँ। एक सर्वर बस कुछ ऐसा है जो "हमेशा के लिए loops" और सेवा करता है। हालांकि, आम तौर पर आप पाएंगे कि "डिमन्स" अन्य चीजों के साथ डबल फोर्क के साथ फ़ाइल हैंडल या/dev/null पर खुले STDOUT और STDERR जैसी चीजें करते हैं। आपका कोड एक अर्थ में एक बहुत ही सरल "सर्वर" है।

4

'सर्वर' के तीन प्रकार होते हैं। वे सभी आम तौर पर आपके द्वारा दिखाए जाने वाले तरीके को लूप करते हैं, अंतर होता है जब सर्विस करने के लिए कुछ होता है।

एक फोर्किंग सेवा बस यही है। प्रत्येक अनुरोध के लिए, फोर्क() को एक नई बाल प्रक्रिया बनाने का आह्वान किया जाता है जो अनुरोध को संभालता है, फिर डिज़ाइन के आधार पर बाद के अनुरोधों को संभालने के लिए बाहर निकलता है (या जीवित रहता है)।

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

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

ऐसे कई उदाहरण हैं जहां एकल थ्रेडेड सेवाएं एकाधिक धागे उत्पन्न करती हैं, हालांकि अतिरिक्त धागे आने वाले अनुरोधों की सेवा करने पर काम नहीं कर रहे हैं, एक उदाहरण (उदाहरण के लिए) एक थ्रेड में एक स्थानीय सॉकेट स्थापित कर सकता है जो व्यवस्थापक को स्थिति प्राप्त करने की अनुमति देता है सभी कनेक्शनों का।

गैर अवरुद्ध http सर्वर के लिए एक छोटी सी Googling कुछ रोचक हाथ वेब सर्वर कोड गोल्फ चुनौतियों के रूप में लिखा लुढ़का निकलेगा।

संक्षेप में, अंतर एक बार अंतहीन लूप दर्ज किया गया है कि क्या होता है, न सिर्फ अंतहीन लूप :)

+1

महान स्पष्टीकरण। – Tony

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