क्यों कोई फ़ाइल प्रविष्टि syscalls नहीं हैं


11

मेरी समझ के लिए, फ़ाइलों में हेरफेर करने के लिए लिनक्स में केवल sys_write syscall है, जो फ़ाइल सामग्री को अधिलेखित करता है (या इसे समाप्त करता है, यदि अंत में)।

लिनक्स में फ़ाइलों में सामग्री डालने या हटाने के लिए कोई सीस्कॉल क्यों नहीं हैं?

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

फाइल सिस्टम फीचर्स के साथ "कॉपी ऑन राइट" या "ट्रांसपेरेंट फाइल कम्प्रेशन" के रूप में, कंटेंट डालने का वर्तमान तरीका बहुत ही अकुशल लगता है।


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

3
@mosvy, लेकिन "नई फ़ाइल बनाएँ, फिर नाम बदलें" अवधारणा का उपयोग किया जाता है क्योंकि यह अपने आप में अच्छा है, या बिल्कुल इसलिए क्योंकि सिस्टम कोई बेहतर तरीका प्रदान नहीं करता है? विशेष रूप से पाठ फ़ाइलों के संचालन पर जैसे "इस लाइन को संशोधित करें (लंबाई बदलकर)" या "इन लाइनों को यहां डालें" बल्कि आम हैं, इसलिए कोई यह मान सकता है कि यदि वे वहां थे, तो उन सटीक कार्यों के लिए फाइलसिस्टम संचालन का उपयोग किया जाएगा। बेशक, उनके होने से एफएस लागू होने में बहुत सरलता
आती है

1
@meuh OpenVMS अभी भी आरएमएस (रिकॉर्ड मैनेजमेंट सर्विसेज) के माध्यम से करता है।
रॉनजॉन

1
UNIX ने फ़ाइल सिस्टम के अंदर रिकॉर्ड प्रबंधन सिस्टम प्रदान करने से दूर जाना शुरू किया ।
user207421

1
@ilkkachu यह अपने आप में अच्छा है, बिल्कुल कोई संदेह नहीं ;-) इससे भी अधिक, यदि इनोड अपरिवर्तनीय थे, जो ब्लॉक साझाकरण, संस्करणकरण और लगभग सब कुछ को और अधिक कुशल (और बहुत अधिक सरल कारण से लागू करना) कर देगा। सादृश्य द्वारा सोचें कि सभी स्क्रिप्ट भाषाओं ने अपरिवर्तनीय तारों पर कैसे स्विच किया है - लेकिन मैं इसे यहां छोटा करूंगा; फाइलसिस्टम के बारे में कफ़ से बात करना कठिन है और एक आवाज़ की तरह नहीं है
;;

जवाबों:


22

हाल के लिनक्स सिस्टम पर जो वास्तव में संभव है, लेकिन ब्लॉक (4096 के अधिकांश समय), बाइट ग्रैन्युलैरिटी के साथ नहीं , और केवल कुछ फाइल सिस्टम (एक्सटी 4 और एक्सएफएस) पर।

fallocate(2)मैनपेज से उद्धरण :

int fallocate(int fd, int mode, off_t offset, off_t len);

[...]

Collapsing फ़ाइल स्थान

FALLOC_FL_COLLAPSE_RANGEध्वज को निर्दिष्ट करना (लिनक्स 3.15 के बाद से उपलब्ध) modeएक छेद से बिना एक फ़ाइल से बाइट रेंज को हटाता है। बाइट की सीमा ढहनी शुरू हो जाती है offsetऔर len बाइट के लिए जारी रहती है । ऑपरेशन के पूरा होने पर, स्थान पर शुरू होने वाली फ़ाइल की सामग्री को स्थान offset+lenपर जोड़ा जाएगा offset, और फ़ाइल lenबाइट्स से छोटी होगी ।

[...]

फ़ाइल स्थान बढ़ाना

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


1
"लेकिन ब्लॉक (4096) के साथ, बाइट ग्रैन्युलैरिटी नहीं" - 4KiB ब्लॉक ext4 में बहुत आम हैं, लेकिन इसकी गारंटी नहीं है। Ext4 1KiB, 2KiB और 4KiB ब्लॉक आकार का समर्थन करता है ; और मुझे याद है कि ext2 दिनों से अल्फा प्रोसेसर पर, 8KiB का भी समर्थन किया गया था। आप यह नहीं मान सकते हैं कि ब्लॉक 4KiB हैं, मुझे डर है।
मार्सेल

1
4k (जो डिफ़ॉल्ट है) 1k और 2k का गुणक है, इसलिए 4k को ext4 मानने में कोई समस्या नहीं है। जबकि xfs 4k तक भी डिफ़ॉल्ट होगा, यह 64k तक 4k - से बड़े b का समर्थन करने वाला है, लेकिन मैं केवल इस तरह के fs बनाने में सक्षम था - बिना ENOSYS के इसे फेल करना। और वैसे भी, आप कुछ भी नहीं मान सकते हैं - यह सुविधा सभी fs पर समर्थित नहीं है, इसलिए इसे केवल ब्लॉक = 4096 कहना बेहतर है, इसलिए पाठक के पास अनुपात की कुछ समझ है, बजाय इसे तैरने और लोगों को बताने के कुछ भी हो सकता है, या इससे भी बदतर, कि यह 512 बाइट्स है या किसी भी तरह vm पृष्ठ आकार से संबंधित है।
मस्जिद

आपके द्वारा संपादित किए जाने के बाद (जहां आप कहते हैं कि यह आमतौर पर 4KiB है), मैं पूरी तरह से सहमत हूं! मेरी समस्या यह थी कि पहले इसे आसानी से "ब्लॉक हमेशा 4KiB" के रूप में पढ़ा जाता था , जिसके कारण लोग उस धारणा को बना सकते हैं और बगिया कोड लिख सकते हैं।
मार्सेल

9

जैसा कि सभी वर्तमान फ़ाइल सिस्टम को फाइल को निरंतर मेमोरी ब्लॉक में संग्रहीत करने की आवश्यकता नहीं होती है,

Filesystem को निरंतर क्षेत्र में संग्रहीत की जाने वाली फ़ाइलों की आवश्यकता नहीं हो सकती है (और यह वास्तव में बहुत ही अनम्य होगी), लेकिन आमतौर पर फाइलें निश्चित-आकार के ब्लॉक (या सन्निहित ब्लॉकों के अनुक्रम) में संग्रहीत की जाती हैं। ऐसा करना इस तरह से कार्यान्वयन को सरल बनाता है, और ब्लॉक आमतौर पर अंतर्निहित डिवाइस के ब्लॉक आकार के गुणक होते हैं।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.