2012-02-03 7 views
7

जब मैं फॉपेन करता हूं और फिर एक फ्रेड करता हूं, तो फ़ाइल को वास्तव में/आंशिक रूप से स्मृति में फॉपेन या फ़्रेड के दौरान लोड किया जाता है?फ़ाइल को स्मृति में लोड किया गया है - फ़्रेड, फॉपेन और फ़्राइट कॉल के लिए?

या क्या यह आंशिक रूप से फ़ाइल के आकार के आधार पर फॉपेन पर लोड किया गया है और फिर पर पूरी तरह से लोड किया गया है?

इसी प्रकार ओएस स्तर पर आंतरिक रूप से क्या होता है जब fwrite कहा जाता है? क्या उस समय फ़ाइल को स्मृति में लोड किया गया है, या पृष्ठ स्वैप स्मृति में फ़ाइल के उस भाग को पुनर्प्राप्त करना होता है?

स्मृति में फ़ाइल लोडिंग के संबंध में इनमें से प्रत्येक कॉल पर ओएस स्तर पर क्या होता है?

+4

किस फाइल सिस्टम के लिए? ओएस के लिए क्या? –

+4

कौन सा ओएस? यह पूरी तरह से ओएस निर्भर है। (मैं आमतौर पर अपेक्षा करता हूं कि फ़ाइल से कोई भी डेटा नहीं पढ़ा जाएगा जब आप इसे फेंक देते हैं।) –

+0

मुझे विंडोज़ के लिए डेटा चाहिए, लेकिन लिनक्स में इसके लिए अंतर जानने के लिए उत्सुक होगा – seahorse

उत्तर

6
  • fopen() केवल फ़ाइल को हैंडल बनाता है।
  • fread() वास्तव में, एक स्मृति बफर (ओएस-स्तर बफरिंग ग्राहक के लिए पारदर्शी रूप से हो सकता है।) में फ़ाइल
  • fwrite() फ़ाइल में डेटा लिखता पढ़ता इसके भंडारण करने से हालांकि देरी हो सकती है (जैसे journalled फाइल सिस्टम के साथ।)
4

आमतौर पर, फ़ाइल को खोलने पर स्मृति में लोड नहीं किया जाता है। इसके बजाय, प्रत्येक पढ़ने के लिए भागों को लोड किया जाता है; सभी प्रकार के बफरिंग के कारण, अधिक हिस्सों को लोड किया जा सकता है, फिर आप प्रत्येक fread में पूछते हैं।

जब आप fwrite कुछ डेटा, अंततः इसे कर्नेल में कॉपी किया जाता है जो इसे बफरिंग के बाद डिस्क (या कहीं भी) पर लिख देगा। सामान्य रूप से, लिखने के लिए फ़ाइल का कोई भी भाग लोड करने की आवश्यकता नहीं होती है।

2

आम तौर पर यह फ़ाइल सिस्टम और ओएस पर निर्भर करता है। खिड़कियों में एक कैशिंग तंत्र है जो 256 केबी भाग में एक फाइल से संबंधित है और उस खंड में गिरने के पढ़ने के अनुरोध पर प्रत्येक खंड को लोड करता है। fopen पर कॉल करने से मीडिया से फ़ाइल सामग्री को पढ़ने का कारण नहीं बनना चाहिए। और fread मीडिया से आंशिक पढ़ने (या छोटी फ़ाइलों के लिए पूर्ण पढ़ने) का कारण बन जाएगा। आंशिक पढ़ने आमतौर पर कैश प्रबंधक (256 केबी) में कैश लाइन आकार के बराबर होती है।

fwrite मीडिया को वास्तविक लिखने का कारण भी नहीं हो सकता है। यह आम तौर पर क्लाइंट डेटा को रैम में कैश किए गए फ़ाइल क्षेत्र में स्थानांतरित करने का कारण बनता है, लेकिन इस बात की कोई गारंटी नहीं है कि डेटा वास्तव में मीडिया को लिखा गया है। विंडोज़ में, कैश मैनेजर निर्णय लेता है कि किसी फ़ाइल के कैश किए गए क्षेत्र को मीडिया में फ़्लश करना कब होता है। यदि आप यह सुनिश्चित करना चाहते हैं कि fwrite के बाद मीडिया पर सभी गंदे डेटा फ़्लश किए गए हैं, तो आपको बाद में fflush पर कॉल करने की आवश्यकता है।

1

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

इसका मतलब यह है कि वास्तविक पढ़ने/लेखन से पहले कोई डिस्क गतिविधि नहीं होती है।

यह सच है, भले ही आप बिना स्मृति-मैपिंग फ़ाइल को खोलने (जैसे: fopen), जबकि अगर आप इसे स्मृति मानचित्रण के साथ खोलने (जैसे: mmap) तुम सिर्फ "पारदर्शिता" खो देते हैं।

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