जवाबों:
इसका कारण यूनिक्स निष्पादन योग्य फ़ाइल को लॉक नहीं करता है जबकि इसे निष्पादित किया जाता है या भले ही यह लिनक्स की तरह हो, यह लॉक इनोड पर लागू होता है, फ़ाइल नाम पर नहीं। इसका मतलब है कि इसे खुला रखने की एक प्रक्रिया फ़ाइल डिलीट होने (वास्तव में अनलिंक) होने के बाद भी उसी (पुराने) डेटा को एक्सेस कर रही है और उसी नाम से एक नया नाम दिया गया है जो अनिवार्य रूप से एक पैकेज अपडेट करता है।
यह यूनिक्स और विंडोज के बीच मुख्य अंतरों में से एक है। उत्तरार्द्ध किसी फ़ाइल को लॉक नहीं किया जा सकता है क्योंकि यह फ़ाइल नामों और इनोड्स के बीच एक परत गायब है जो अद्यतन करने के लिए एक बड़ी परेशानी बना रहा है या यहां तक कि कुछ पैकेजों को स्थापित करने की भी आवश्यकता है क्योंकि इसमें आमतौर पर पूर्ण रिबूट की आवश्यकता होती है।
निष्पादनकर्ता आम तौर पर एक बार खोले जाते हैं, एक फाइल डिस्क्रिप्टर से जुड़े होते हैं, और निष्पादन के एक एकल अवधि के दौरान उनके बाइनरी को दोबारा खोलने के लिए एक फाइल डिस्क्रिप्टर नहीं होता है। उदाहरण के लिए, यदि आप निष्पादित करते हैं bash
, तो exec()
आम तौर पर केवल एक /bin/bash
बार इनकोड के लिए एक फाइल डिस्क्रिप्टर बनाता है - इनवोकेशन पर।
इसका अर्थ अक्सर यह होता है कि साधारण बायनेरिज़ के लिए जो निष्पादन के दौरान खुद को फिर से पढ़ने का प्रयास नहीं करते हैं (जिस मार्ग से उन्हें आमंत्रित किया गया था) का उपयोग करके, जो सामग्री कैश्ड रहती है वह झूलने वाले इनोड के रूप में मान्य रहती है। इसका मतलब यह है कि निष्पादन योग्य के पिछले संस्करण की एक प्रतिकृति अनिवार्य रूप से है।
अधिक जटिल मामलों में, यह समस्याएं पैदा कर सकता है। उदाहरण के लिए, एक कॉन्फ़िग फ़ाइल को अपग्रेड किया जा सकता है और बाद में पुनः पढ़ा जा सकता है, या जिस पथ से इसे निष्पादित किया गया था, उस कार्यक्रम के माध्यम से प्रोग्राम खुद को फिर से निष्पादित कर सकता है। यदि प्रोग्राम आपस में जुड़े होते हैं, तो भी समस्याएं हो सकती हैं, और एक को अपग्रेड से पहले निष्पादित किया जाता है, और एक के बाद (संभवतः पहले प्रोग्राम द्वारा)। यह कुछ पुस्तकालयों के लिए भी सही है।
सरल उपयोग के मामलों के लिए, हालांकि, प्रक्रिया को पुनरारंभ किए बिना अपग्रेड करना सुरक्षित है।
bash
बाइनरी लगभग 200 4K पृष्ठ हैं, यह सुनिश्चित नहीं है कि वे सभी एक औसत सत्र में उपयोग किए जाते हैं।
ialloc()
पढ़ने पर एक कर्नेल संरचना के बारे में बात कर रहा था , न कि पृष्ठों की मेमोरी मैपिंग। क्या मैं यह सोचने में सही नहीं हूं कि आधुनिक एक्सट्रीम * फाइलसिस्टम पर, इनोड अंततः इन-कर्नेल (और वीएम सिस्टम के अंदर) के अनुरूप है?