ब्रायन कर्निघन इस वीडियो में बताते हैं कि स्मॉल लिमिटेशंस के आधार पर छोटी भाषाओं / कार्यक्रमों के लिए शुरुआती बेल लैब्स आकर्षण हैं
एक बड़ी मशीन 64 के-बाइट्स होगी - के, एम या जी नहीं - और इसका मतलब है कि कोई भी व्यक्तिगत कार्यक्रम बहुत बड़ा नहीं हो सकता है, और इसलिए छोटे प्रोग्राम लिखने की स्वाभाविक प्रवृत्ति थी, और फिर पाइप तंत्र। मूल रूप से इनपुट आउटपुट पुनर्निर्देशन, एक कार्यक्रम को दूसरे से जोड़ना संभव बनाता है।
लेकिन मुझे यह समझ में नहीं आता है कि यह इस तथ्य को देखते हुए स्मृति उपयोग को कैसे सीमित कर सकता है कि प्रोग्राम के बीच संचारित करने के लिए डेटा को रैम में संग्रहीत किया जाना चाहिए।
से विकिपीडिया :
अधिकांश यूनिक्स जैसी प्रणालियों में, एक पाइपलाइन की सभी प्रक्रियाएं एक ही समय में शुरू होती हैं [जोर मेरा], उनकी धाराओं के साथ उचित रूप से जुड़ा हुआ है, और मशीन पर चलने वाली अन्य सभी प्रक्रियाओं के साथ अनुसूचक द्वारा प्रबंधित किया जाता है। इसका एक महत्वपूर्ण पहलू, यूनिक्स पाइप को अन्य पाइप कार्यान्वयन के अलावा स्थापित करना, बफ़रिंग की अवधारणा है: उदाहरण के लिए एक भेजने का कार्यक्रम 5000 बाइट्स प्रति सेकंड का उत्पादन कर सकता है, और एक प्राप्त कार्यक्रम केवल 100 बाइट्स प्रति सेकंड स्वीकार करने में सक्षम हो सकता है, लेकिन नहीं डेटा खो गया है। इसके बजाय, भेजने वाले प्रोग्राम का आउटपुट बफर में आयोजित किया जाता है। जब प्राप्त कार्यक्रम डेटा पढ़ने के लिए तैयार है, तो पाइप लाइन में अगला कार्यक्रम बफर से पढ़ता है। लिनक्स में, बफर का आकार 65536 बाइट्स (64KB) है। यदि आवश्यक हो तो बड़े बफ़र्स प्रदान करने के लिए एक खुला स्रोत थर्ड-पार्टी फ़िल्टर बीएफआर कहा जाता है।
यह मुझे और भी भ्रमित करता है, क्योंकि यह छोटे कार्यक्रमों के उद्देश्य को पूरी तरह से हरा देता है (हालांकि वे एक निश्चित पैमाने तक मॉड्यूलर होंगे)।
केवल एक चीज जिसे मैं अपने पहले प्रश्न के समाधान के रूप में सोच सकता हूं (आकार डेटा पर स्मृति सीमाएं समस्याग्रस्त हो रही हैं) यह होगा कि बड़े डेटा सेटों की गणना केवल तब वापस नहीं की गई थी और वास्तविक समस्या पाइपलाइनों को हल करने के लिए थी। कार्यक्रमों द्वारा आवश्यक स्मृति की मात्रा। लेकिन विकिपीडिया उद्धरण में बोल्ड पाठ को देखते हुए, यह मुझे भी भ्रमित करता है: चूंकि एक समय में एक कार्यक्रम लागू नहीं किया जाता है।
यह सब बहुत समझ में आता है अगर अस्थायी फ़ाइलों का उपयोग किया गया था, लेकिन यह मेरी समझ है कि पाइप डिस्क पर नहीं लिखते हैं (जब तक कि स्वैप का उपयोग नहीं किया जाता है)।
उदाहरण:
sed 'simplesubstitution' file | sort | uniq > file2
यह मेरे लिए स्पष्ट है कि sed
फाइल में पढ़ा जा रहा है और लाइन के आधार पर इसे बाहर थूक रहा है। लेकिन sort
, जैसा कि बीके ने लिंक किए गए वीडियो में बताया है, एक पूर्ण विराम है, इसलिए सभी डेटा को मेमोरी में पढ़ना पड़ता है (या करता है?), फिर इसे पास कर दिया जाता है uniq
, जो (मेरे दिमाग में) एक होगा? -लाइन पर एक समय कार्यक्रम। लेकिन पहले और दूसरे पाइप के बीच सारा डेटा मेमोरी में होना चाहिए, नहीं?
unless swap is used
स्वैप का उपयोग हमेशा किया जाता है जब पर्याप्त रैम नहीं होता है