जब आप ls
तर्क के बिना चलते हैं, तो यह सिर्फ एक निर्देशिका खोलेगा, सभी सामग्रियों को पढ़ेगा, उन्हें छांटेगा और उनका प्रिंट आउट लेगा।
जब आप चलाते हैं ls *
, तो पहले शेल का विस्तार होता है *
, जो प्रभावी रूप से वही होता है जो साधारण ls
ने किया था, वर्तमान निर्देशिका में सभी फाइलों के साथ एक तर्क वेक्टर बनाता है और कॉल करता है ls
। ls
फिर उस तर्क सदिश और प्रत्येक तर्क के लिए प्रक्रिया करनी होती है, और access(2)
यह अस्तित्व की जाँच करने के लिए फ़ाइल को कॉल करता है। फिर यह पहले (सरल) के समान आउटपुट का प्रिंट आउट लेगा ls
। बड़े तर्क वेक्टर के शेल के प्रसंस्करण दोनों ls
में छोटे ब्लॉकों के मेमोरी आवंटन की बहुत अधिक संभावना होगी, जिसमें कुछ समय लग सकता है। हालाँकि, चूंकि थोड़ा sys
और user
समय था, लेकिन बहुत real
समय, अधिकांश समय डिस्क के लिए इंतजार करने में खर्च किया जाता था, बजाय सीपीयू मेमोरी आवंटन के उपयोग के।
access(2)
अनुमति जानकारी प्राप्त करने के लिए प्रत्येक कॉल को फ़ाइल के इनोड को पढ़ने की आवश्यकता होगी। इसका मतलब है कि एक बहुत अधिक डिस्क पढ़ता है और बस एक निर्देशिका को पढ़ने की तुलना में चाहता है। मुझे नहीं पता कि ये ऑपरेशन आपके GPFS पर कितने महंगे हैं, लेकिन जैसा कि आपने दिखाया ls -l
है कि वाइल्डकार्ड केस के समान रन टाइम है, इनोड की जानकारी प्राप्त करने के लिए आवश्यक समय हावी दिखाई देता है। यदि प्रत्येक रीड ऑपरेशन पर GPFS की आपके स्थानीय फाइल सिस्टम की तुलना में थोड़ी अधिक विलंबता है, तो हम इन मामलों में इसके अधिक स्पष्ट होने की उम्मीद करेंगे।
वाइल्डकार्ड मामले और ls -l
50% के बीच अंतर को डिस्क पर इनोड्स के आदेश द्वारा समझाया जा सकता है। यदि इनोड को क्रमबद्ध रूप से उसी क्रम में रखा गया है, जैसे डायरेक्टरी और ls -l
स्टेटमेंट में फाइलनेम (2) सॉर्ट करने से पहले डाइरेक्टरी ऑर्डर में फाइल एड करते हैं, ls -l
तो संभवत: स्वीप में अधिकतर इनोड्स पढ़ेंगे। वाइल्डकार्ड के साथ, शेल उन्हें पास करने से पहले फ़ाइलनाम को सॉर्ट करेगा ls
, इसलिए ls
संभवतः डिस्क को एक अलग क्रम में पढ़ा जाएगा, और अधिक डिस्क हेड मूवमेंट को जोड़ा जाएगा।
यह ध्यान दिया जाना चाहिए कि आपके time
आउटपुट में वाइल्डकार्ड का विस्तार करने के लिए शेल द्वारा लिया गया समय शामिल नहीं होगा।
यदि आप वास्तव में देखना चाहते हैं कि क्या हो रहा है, तो उपयोग करें strace(1)
:
strace -o /tmp/ls-star.trace ls *
strace -o /tmp/ls-l-star.trace ls -l *
और एक नज़र है कि प्रत्येक मामले में कौन से सिस्टम कॉल किए जा रहे हैं।
If मुझे नहीं पता कि access(2)
क्या वास्तव में उपयोग किया जाता है, या कुछ और जैसे कि stat(2)
। लेकिन दोनों को शायद एक इनकोड लुकअप की आवश्यकता होती है (मुझे यकीन नहीं है कि अगर access(file, 0)
कोई इनोड लुकअप को बायपास कर देगा।)
ls
यह सिर्फ फाइल सिस्टम से पूछ सकता है "इनोड के बच्चे क्या हैंpwd
" जहां के साथls *
यह पूछने के लिए है कि "इनोड के बच्चे (और फाइल क्या है) क्या हैंa
" इसके बाद b, c, d, आदि आदि हैं। एक क्वेरी बनाम कई।